This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PM 中间件中的错误:uart_hal.c

Guru**** 1981085 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/567294/bug-in-pm-middleware-uart_hal-c

器件型号: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

(对于此帖子中的代码粘贴技巧较差,请提前道歉...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kemeron:

    感谢您发帖。 我将在内部传递该信息。

    此致、
    Sarah
x 出现错误。请重试或与管理员联系。