请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC3200SDK 大家好、朋友、
我在 SDK 1.2.0中间件的 UART_hal.c 文件中发现了一个错误。 该错误会生成额外和错误的 IRQ 回调。 症状是、当序列中写入多个字符串时、写入 UART 的字符串不完整。 解决方法似乎可以解决问题。
下面是 UART_hal.c 中的错误代码片段:
/* UART 中断处理程序回调*/ void cc_UART_ISR (cc_hndl UART_hndl) { uint32_t uiIntStat; int8_t temp; u32禁用= 0; struct cc_UART_state * UART_state =(struct cc_UART_state *) UART_hndl; struct cc_UART_config * UART_config =(struct cc_UART_config *)&(UART_state->UART_config); uint32_t base_addr = uart_config->module_info.base_addr; uiIntStat = MAP_UARTIntStatus (base_addr、1); 对于接收超时或 FIFO 中断情况* if (uiIntStat & 0x50){ MAP_UARTIntClear (base_addr、0x50); while (uart_state->rd_num_Byts!= 0){ temp = MAP_UARTCharGetNonBlocking (base_addr); if (-1!= temp){ UART_STATUS->rd_buff [UART_STATUS->rd_byts_done ]= temp; uart_state->rd_num_Byts-; UART_STACd->rd_Byts_done ++; if (temp ='\n'|| temp ='\r'){ if (uart_config->echo _enabled == e_true){ map_UARTCharPutNonBlocking (base_addr、'\n'); map_UARTCharPutNonBlocking (base_addr、'\r\n'); } break;} }否则{ if (UART_CONFIG->ECHO_ENABLED = e_true){ MAP_UARTCharPutNonBlocking (base_addr、temp); } } }否则{ 中断; } } if (temp!=-1){ UART_state->rd_DONE = e_true; MAP_UARTIntClear (base_addr、0x50); MAP_UARTIntDisable (base_addr、0x50); 转到 Invoke_rd_callback; } } /*用于传输中断(可以用于 FIFO 触发器或单个字符)*/ if (uiIntStat & 0x20){ MAP_UARTIntClear (base_addr、0x20); while (uart_state->wrt_num_Byts!= 0){ if (true = MAP_UARTCharPutNonBlocking (base_addr、 UART_STATUS->wrt_buff [UART_STATUS->wrt_Byts_done) uart_state->wrt_num_Byts--; UART_STACT->wrt_Byts_done ++; }否则{ 中断; } } if (uart_state->wrt_num_Byts = 0){ uart_state->wrt_done = e_true; map_UARTIntClear (base_addr、0x20); map_UARTIntDisable (base_addr、0x20); /*调用回调*/ 转到 Invoke_wr_callback; } } /*表示 DMA 接收完成*/ if (uiIntStat & 0x10000){ MAP_UARTIntClear (base_addr、0x10000); CC_UART_CONTROL (UART_ST态、e_start_Rx_DMA_transfer、 禁用(&D); /*调用回调*/ 转到 Invoke_rd_callback; } /*表示 DMA 传输完成*/ if (uiIntStat & 0x20000){ MAP_UARTIntClear (BASE_ADDR、0x20000); CC_UART_CONTROL (UART_ST态、e_start_TX_DMA_transfer、 禁用(&D); /*调用回调*/ 转至 Invoke_wr_callback; } return; void _wr_callback: if ((uart_config->module_info).int_callback){ (uart_config->module_info).int_callback ( uart_config->rtos_ndl、write_complete、 (void *)&(uart_state->wrt_done)、callback ); } invoke rd_config_inf_unt (uart_info->rtos_complete->unt (uart_read_module-/unt)(uart_complete-/unt)(uart_read_config_infot_info-/unt)、unt)(uart_callback)(uart_infot_module-nal&nal&nal&nalt
补救方法是在与 Invoke_wr_callback:label 关联的代码之后插入一条 return 语句、这样也不会执行 Invoke_rd_callback:代码、如下所示:
Invoke_wr_callback: if ((uart_config->module_info).int_callback){ (uart_config->module_info).int_callback ( uart_config->rtos_hndl、write_complete、 (void *)&(uart_state->wrt_done)、 NULL); } return; Invoke_rd_callback: if ((uart_config->module_info).int_callback){ (uart_config->module_info).int_callback ( uart_config->rtos_hndl、read_complete、 (void *)&(uart_state->rd_Done)、 NULL); } return; }
此致、
Kemeron
(对于此帖子中的代码粘贴技巧较差,请提前道歉...)