#include "include.h" #include "uart.h" #include #include "debug_printf.h" #include "Cmd.h" //信号量 队列 互斥信号量 定时器 进程同步 数据保护 void EdbugPrintProcess(u8* Pstr,u16 len); #define PEINTFBUFF_LENGTH (800) #define COM_DEBUG_BUF g_DebugRxBuffer u8 g_DebugRxBuffer[COM_DEBUG_RX_BUFFER_SIZE]; struct st_uart_port COM_DEBUG_port = USART_PORT_PARAMS(COM_DEBUG, g_DebugRxBuffer,NULL); //static QueueHandle_t printQueue; static SemaphoreHandle_t xSemaphore; static bool printf_switch_open = TRUE; TaskHandle_t print_task_handle; u16 head_index = 0; u16 tail_index = 0; u8 print_buf[Q_PRINT_LENGTH][Q_PRINT_SIZE + 1] = {0}; bool SendRuning = false; u16 EdbugPrintBuffLength = 0x00; u16 EdbugPrintBuffIndex = 0x00; u16 EdbugPrintBuffRxLength = 0x00; u16 EdbugPrintBuffRxIndex = 0x00; u8 EdbugPrintBuff[PEINTFBUFF_LENGTH]; /***************************************************************************** * Function : close_printf * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void close_printf(void) { printf_switch_open = FALSE; head_index = 0; tail_index = 0; } /***************************************************************************** * Function : open_printf * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void open_printf(void) { printf_switch_open = TRUE; head_index = 0; tail_index = 0; } /***************************************************************************** * Function : debug_Tx * Description : none * Input : u8 *buf u8 len * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void debug_Tx(u8 *buf, u8 len) { //hal_UartDMATx(&COM_DEBUG_port, buf, len); EdbugPrintProcess(buf, len); } /***************************************************************************** * Function : reset_debug_buf * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void reset_debug_buf(void) { MemSet(COM_DEBUG_port.data.rxBuf, 0, sizeof(g_DebugRxBuffer)); COM_DEBUG_port.data.rx_len = 0; } /***************************************************************************** * Function : get_debugBuf_len * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ u16 get_debugBuf_len(void) { return COM_DEBUG_port.data.rx_len; } /***************************************************************************** * Function : get_debugBuf * Description : none * Input : void * Output : None * Return : u8 * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ u8 * get_debugBuf(void) { return COM_DEBUG_port.data.rxBuf; } void add_print_buf(u8*buf, u8 length) { u8 print_size; u8 index = 0; u8 valid_blockNum; u8 blockNum = (length % Q_PRINT_SIZE == 0)? (length / Q_PRINT_SIZE): (length/ Q_PRINT_SIZE + 1); if (head_index >= tail_index) { if (head_index == tail_index) { head_index = 0; tail_index = 0; } valid_blockNum = Q_PRINT_LENGTH - head_index + tail_index; blockNum = (blockNum >= valid_blockNum) ? valid_blockNum : blockNum; } else { valid_blockNum = tail_index - head_index; blockNum = (blockNum >= valid_blockNum) ? valid_blockNum : blockNum; } for (u8 i = 0; i < blockNum; i++) { if (i == blockNum - 1) { print_size = (length % Q_PRINT_SIZE == 0)? Q_PRINT_SIZE: (length % Q_PRINT_SIZE); } else { print_size = Q_PRINT_SIZE; } print_buf[head_index][0] = print_size; MemCpy(&print_buf[head_index][1], buf + index, print_size); index += print_size; head_index = (head_index + 1) % Q_PRINT_LENGTH; } } void UART5_IRQHandler(void) { if (USART_GetITStatus(COM_DEBUG_NO, USART_IT_TC) != RESET) { if( EdbugPrintBuffIndex >= EdbugPrintBuffLength) { USART_ITConfig(COM_DEBUG_NO, USART_IT_TC, DISABLE); EdbugPrintBuffIndex = 0; SendRuning = false; } else { USART_SendData(COM_DEBUG_NO, EdbugPrintBuff[EdbugPrintBuffIndex]); EdbugPrintBuffIndex ++; } } else if (USART_GetITStatus(COM_DEBUG_NO, USART_IT_RXNE) != RESET) { u8 transparent_cmd[] = "transparent 00 "; u16 len; BaseType_t xHigherPriorityTaskWoken = pdFALSE; if (USART_GetITStatus(COM_DEBUG_NO, USART_IT_RXNE) != RESET) { u8 receivedByte = USART_ReceiveData(COM_DEBUG_NO); if ( COM_DEBUG_port.data.rx_index >= COM_DEBUG_RX_BUFFER_SIZE) { COM_DEBUG_port.data.rx_index = 0; } if (receivedByte == '\b')//Backspace { if ( cmp_datas(transparent_cmd, COM_DEBUG_port.data.rxBuf, 11) ) { COM_DEBUG_port.data.rxBuf[COM_DEBUG_port.data.rx_index++] = receivedByte; } else { if (COM_DEBUG_port.data.rx_index > 0) { COM_DEBUG_port.data.rx_index--; } } } else { COM_DEBUG_port.data.rxBuf[COM_DEBUG_port.data.rx_index ++] = receivedByte; if ((receivedByte == '\r') || (receivedByte == '\n'))//Enter { if ( cmp_datas(transparent_cmd, COM_DEBUG_port.data.rxBuf, 11) ) { len = COM_DEBUG_port.data.rxBuf[12] + COM_DEBUG_port.data.rxBuf[13]*256 + sizeof(transparent_cmd) - 1; if (COM_DEBUG_port.data.rx_index < len) { return; } } COM_DEBUG_port.data.rx_len = COM_DEBUG_port.data.rx_index; COM_DEBUG_port.data.rx_index = 0; xSemaphoreGiveFromISR( COM_DEBUG_port.xSemaphore, &xHigherPriorityTaskWoken ); portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } } } } } void WaitPrintfEnd( void ) { if(SendRuning == true) { for(u8 tc = 0x0; ( tc < 20 ) & ( SendRuning == true) ; tc ++) { vTaskDelay(20 /portTICK_RATE_MS); } } } void EdbugPrintProcess(u8* Pstr,u16 len) { if(len > PEINTFBUFF_LENGTH) return ; WaitPrintfEnd(); MemCpy(EdbugPrintBuff, Pstr, len); EdbugPrintBuffLength = len; EdbugPrintBuffIndex = 0x00; while(USART_GetITStatus(COM_DEBUG_NO, USART_IT_TC) != RESET); USART_ITConfig(COM_DEBUG_NO, USART_IT_TC, ENABLE); } /** * @brief Retargets the C library printf function to the DEBUG_COM. * @param None. * @retval None. */ int printf(const char *format ,... ) { u16 receData = 0; // if (printf_switch_open) // { // va_list arg; // u16 receNum = 0; // static u8 buffer[100]; // // va_start(arg, format); // receNum = (u16)vsnprintf((char *)(buffer), sizeof(buffer), format, arg); // va_end(arg); // // receData = receNum; // if ((receNum > 0) && (receNum <= sizeof(buffer))) // { // add_print_buf(buffer, receNum); // // if (COM_DEBUG_port.data.tx_timeout == 0) // { // COM_DEBUG_port.data.tx_timeout = 1; // hal_UartDMATx(&COM_DEBUG_port,&print_buf[tail_index][1], print_buf[tail_index][0]); // } // } // } if (printf_switch_open) { va_list arg; u16 receNum = 0; //static u8 buffer[100]; WaitPrintfEnd(); va_start(arg, format); receNum = (u16)vsnprintf((char *)(EdbugPrintBuff), sizeof(EdbugPrintBuff), format, arg); va_end(arg); SendRuning = true; EdbugPrintBuffLength = receNum; EdbugPrintBuffIndex = 0x00; while(USART_GetITStatus(COM_DEBUG_NO, USART_IT_TC) != RESET); USART_ITConfig(COM_DEBUG_NO, USART_IT_TC, ENABLE); } return receData; } // memcpy(RS485_tx_buf, buf, length); // COM_noDMA_tx_index = 0; // COM_noDMA_len = length; // COM_485_port.data.tx_timeout = xTaskGetTickCount() + (RS485_BAUD_COFF*length + 100)/portTICK_RATE_MS;; // while(USART_GetITStatus(COM_RADIO_NO, USART_IT_TC) != RESET); // USART_ITConfig(COM_RADIO_NO, USART_IT_TC, ENABLE); /***************************************************************************** * Function : printf_buf * Description : none * Input : u8* buf u16 length * Output : None * Return : * Others : * Record * 1.Date : 20170306 * Author : barry * Modification: Created function *****************************************************************************/ void printf_buf(u8* buf, u16 length) { // static u8 temp_buf[Q_PRINT_SIZE]; // u8 temp_count = 0; // // u8 max_pos = (sizeof(temp_buf) - 1) - (sizeof(temp_buf) - 1) % 3; // // if (Q_PRINT_SIZE < 4) // { // return; // } // // MemSet(temp_buf, 0, Q_PRINT_SIZE); // // for (u8 i = 0; i < length; i++) // { // temp_buf[temp_count++] = ((buf[i] / 0x10) <= 9)? (buf[i] / 0x10) + '0': (buf[i] / 0x10) + 'A' - 10; // temp_buf[temp_count++] = ((buf[i] % 0x10) <= 9)? (buf[i] % 0x10) + '0': (buf[i] % 0x10) + 'A' - 10; // temp_buf[temp_count++] = ' '; // // if ( (temp_count >= max_pos ) || (i == length - 1)) // { // add_print_buf(temp_buf, temp_count); // temp_count = 0; // MemSet(temp_buf, 0, Q_PRINT_SIZE); // } // } // // if (head_index != tail_index) // { // printf("\r\n"); // } if(length >= 255 ) return ; u16 index = 0x00; u16 Printflength = 0x00; //printf("%s"," "); WaitPrintfEnd(); for(index = 0x00; index < length; index ++) { Printflength += sprintf((char*)&EdbugPrintBuff[Printflength],"%02X ",buf[index]); } Printflength += sprintf((char*)&EdbugPrintBuff[Printflength],"%s ","\r\n"); // EdbugPrintBuffLength = Printflength; // // EdbugPrintBuffIndex = 0x00; // // while(USART_GetITStatus(COM_DEBUG_NO, USART_IT_TC) != RESET); // // USART_ITConfig(COM_DEBUG_NO, USART_IT_TC, ENABLE); printf("%s",EdbugPrintBuff); } /***************************************************************************** * Function : vPrintf_task * Description : none * Input : void * ptr * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void vPrintf_task(void * ptr) { for (;;) { vTaskDelay(pdMS_TO_TICKS(100)); while (SendRuning == true) { if (xSemaphoreTake( xSemaphore, 1000 ) == pdFALSE) { hal_InitCOM(&COM_DEBUG_port); // COM_DEBUG_port.data.rx_index = 0; // COM_DEBUG_port.data.rx_len = 0; // COM_DEBUG_port.data.tx_timeout = 0; // SendRuning = false; EdbugPrintBuffLength = 0x00; EdbugPrintBuffIndex = 0x00; } } } } /***************************************************************************** * Function : vPrintf_rx_task * Description : none * Input : void * ptr * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void vPrintf_rx_task(void * ptr) { for (;;) { if (xSemaphoreTake( COM_DEBUG_port.xSemaphore, portMAX_DELAY ) == pdPASS) { Cmd_Proc(); reset_debug_buf(); } } } /***************************************************************************** * Function : task_print_start * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ void task_print_start(void) { vSemaphoreCreateBinary( xSemaphore ); xQueueReset( (QueueHandle_t)xSemaphore); init_uart_port(&COM_DEBUG_port); xTaskCreate( vPrintf_task, "Task printf", 150, NULL, 4, &print_task_handle ); xTaskCreate( vPrintf_rx_task, "Task rx printf", 150, NULL, 2, NULL ); printf("hb app start 2021-12-14\r\n"); } #if 0 ///***************************************************************************** // * Function : printf // * Description : none // * Input : const char *format // ... // * Output : None // * Return : // * Others : // * Record // * 1.Date : 20170314 // * Author : barry // * Modification: Created function // //*****************************************************************************/ //int printf(const char *format ,... ) //{ // static va_list arg; // static u16 receNum = 0; // static u16 receData = 0; // static u8 blockNum = 0; // static u8 buffer[PRINT_MAX_BUF]; // static u8 print_buf[ Q_PRINT_SIZE + 1]; // static u8 index = 0; // static u8 print_size; // // if (printf_switch_open) // { // MemSet(buffer, 0, sizeof(buffer)); // va_start(arg, format); // receNum = (u16)vsnprintf((char *)(buffer), sizeof(buffer), format, arg); // va_end(arg); // // index = 0; // // if ((receNum > 0) && (receNum <= PRINT_MAX_BUF)) // { // blockNum = (receNum % Q_PRINT_SIZE == 0)? (receNum / Q_PRINT_SIZE): (receNum / Q_PRINT_SIZE + 1); // // taskENTER_CRITICAL(); //保护临界区代码,不被其他的任务在数据打印过程中调用 // // for (u8 i = 0; i < blockNum; i++) // { // if (i == blockNum - 1) // { // print_size = (receNum % Q_PRINT_SIZE == 0)? Q_PRINT_SIZE: receNum % Q_PRINT_SIZE; // } // else // { // print_size = Q_PRINT_SIZE; // } // print_buf[0] = print_size; // MemCpy(print_buf + 1, buffer + index, Q_PRINT_SIZE); // index += print_size; // xQueueSendToBack( printQueue, print_buf, 0 ); // } // // taskEXIT_CRITICAL(); // } // } // // return receData; // } // ///***************************************************************************** // * Function : printf_buf // * Description : none // * Input : u8* buf // u16 length // * Output : None // * Return : // * Others : // * Record // * 1.Date : 20170314 // * Author : barry // * Modification: Created function // //*****************************************************************************/ //void printf_buf(u8* buf, u16 length) //{ // static u8 temp_buf[Q_PRINT_SIZE]; // u8 temp_count = 0; // // u8 max_pos = (sizeof(temp_buf) - 1) - (sizeof(temp_buf) - 1) % 3; // // if (Q_PRINT_SIZE < 4) // { // return; // } // // MemSet(temp_buf, 0, Q_PRINT_SIZE); // // taskENTER_CRITICAL(); // // for (u8 i = 0; i < length; i++) // { // temp_buf[temp_count++] = ((buf[i] / 0x10) <= 9)? (buf[i] / 0x10) + '0': (buf[i] / 0x10) + 'a' - 10; // temp_buf[temp_count++] = ((buf[i] % 0x10) <= 9)? (buf[i] % 0x10) + '0': (buf[i] % 0x10) + 'a' - 10; // temp_buf[temp_count++] = ' '; // // if ( (temp_count >= max_pos ) || (i == length - 1)) // { // temp_count = 0; // printf("%s", temp_buf); // MemSet(temp_buf, 0, Q_PRINT_SIZE); // } // } // // printf("\r\n"); // // taskEXIT_CRITICAL(); //} // ///***************************************************************************** // * Function : vPrintf_task // * Description : none // * Input : void * ptr // * Output : None // * Return : // * Others : // * Record // * 1.Date : 20170314 // * Author : barry // * Modification: Created function // //*****************************************************************************/ //void vPrintf_task(void * ptr) //{ // u8 buf[Q_PRINT_SIZE+ 1]; // // for (;;) // { // if( xQueueReceive( printQueue, buf, portMAX_DELAY ) == pdPASS ) // { // hal_UartDMATx(&COM_DEBUG_port, buf + 1, buf[0]); // if (xSemaphoreTake( xSemaphore, 1000 ) == pdFALSE) // { // hal_InitCOM(&COM_DEBUG_port); // COM_DEBUG_port.data.rx_index = 0; // COM_DEBUG_port.data.rx_len = 0; // } // } // } //} // // /***************************************************************************** // * Function : vPrintf_rx_task // * Description : none // * Input : void * ptr // * Output : None // * Return : // * Others : // * Record // * 1.Date : 20170314 // * Author : barry // * Modification: Created function // //*****************************************************************************/ //void vPrintf_rx_task(void * ptr) //{ // for (;;) // { // if (xSemaphoreTake( COM_DEBUG_port.xSemaphore, portMAX_DELAY ) == pdPASS) // { // Cmd_Proc(); // reset_debug_buf(); // } // } //} // /***************************************************************************** // * Function : task_print_start // * Description : none // * Input : void // * Output : None // * Return : // * Others : // * Record // * 1.Date : 20170314 // * Author : barry // * Modification: Created function // // *****************************************************************************/ // void task_print_start(void) // { // hal_InitCOM(&COM_DEBUG_port); // // printQueue = xQueueCreate(Q_PRINT_LENGTH, Q_PRINT_SIZE + 1); // Q_PRINT_LENGTH 队列的条目数 Q_PRINT_SIZE 每个条目占多少字节 // vSemaphoreCreateBinary( xSemaphore ); // xQueueReset( (QueueHandle_t)xSemaphore); // // init_uart_port(&COM_DEBUG_port); // xTaskCreate( vPrintf_task, "Task printf", 150, NULL, 4, &print_task_handle ); // xTaskCreate( vPrintf_rx_task, "Task rx printf", 150, NULL, 2, NULL ); // // printf("app start\r\n"); // } #endif /***************************************************************************** * Function : COM_DEBUG_TX_IRQHandler * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ // //void COM_DEBUG_TX_IRQHandler(void) //{ // BaseType_t xHigherPriorityTaskWoken = pdFALSE; // // if (DMA_GetITStatus(COM_DEBUG_TX_DMA_COMPLETE) != RESET) // { // DMA_ClearITPendingBit(COM_DEBUG_TX_DMA_COMPLETE); // // tail_index = (tail_index + 1) % Q_PRINT_LENGTH; // if (tail_index != head_index) // { // hal_UartDMATx(&COM_DEBUG_port,&print_buf[tail_index][1], print_buf[tail_index][0]); // } // else // { // COM_DEBUG_port.data.tx_timeout = 0; // } // xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); // portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); // } // else if (DMA_GetITStatus(COM_DEBUG_TX_DMA_ERROR) != RESET) // { // DMA_ClearITPendingBit(COM_DEBUG_TX_DMA_ERROR); // } //} /***************************************************************************** * Function : COM_DEBUG_RX_IRQHandler * Description : none * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ //void COM_DEBUG_RX_IRQHandler(void) //{ // u8 transparent_cmd[] = "transparent 00 "; // // u16 len; // // BaseType_t xHigherPriorityTaskWoken = pdFALSE; // // if (USART_GetITStatus(COM_DEBUG_NO, USART_IT_RXNE) != RESET) // { // u8 receivedByte = USART_ReceiveData(COM_DEBUG_NO); // // if ( COM_DEBUG_port.data.rx_index >= COM_DEBUG_RX_BUFFER_SIZE) // { // COM_DEBUG_port.data.rx_index = 0; // } // // if (receivedByte == '\b')//Backspace // { // if ( cmp_datas(transparent_cmd, COM_DEBUG_port.data.rxBuf, 11) ) // { // COM_DEBUG_port.data.rxBuf[COM_DEBUG_port.data.rx_index++] = receivedByte; // } // else // { // if (COM_DEBUG_port.data.rx_index > 0) // { // COM_DEBUG_port.data.rx_index--; // } // } // } // else // { // COM_DEBUG_port.data.rxBuf[COM_DEBUG_port.data.rx_index ++] = receivedByte; // // if ((receivedByte == '\r') || (receivedByte == '\n'))//Enter // { // if ( cmp_datas(transparent_cmd, COM_DEBUG_port.data.rxBuf, 11) ) // { // len = COM_DEBUG_port.data.rxBuf[12] + COM_DEBUG_port.data.rxBuf[13]*256 + sizeof(transparent_cmd) - 1; // // if (COM_DEBUG_port.data.rx_index < len) // { // return; // } // } // // COM_DEBUG_port.data.rx_len = COM_DEBUG_port.data.rx_index; // COM_DEBUG_port.data.rx_index = 0; // // xSemaphoreGiveFromISR( COM_DEBUG_port.xSemaphore, &xHigherPriorityTaskWoken ); // portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); // } // } // } //}