您好,反复复现这个问题,有时日志串口输入没有中断发生,还在排查中
T1-CHL串口相关的问题
Re: T1-CHL串口相关的问题
大佬,请问排查得怎样哈,有什么处理方式哈,在线等,急。
我最终还是要用我们自己的简易的命令终端,所以最核心的目的还是想能获取到日志串口的输入哈。
(因为从2.3.3的BK7231N SDK升级过来的,依赖以前的命令行)
Re: T1-CHL串口相关的问题
大佬大佬,日志串口的接收回调问题(或获取该串口的输入)有没有下文,我现在临时用TCP服务作为命令终端,依赖于配网这个条件,也让我们一些测试环境受限诶。
Re: T1-CHL串口相关的问题
大佬大佬们,求解决。
Re: T1-CHL串口相关的问题
不用再起用cli_init, 因为底层中断把uart寄存器的内容先读到了fifo, 再去寄存器读不到
如下修改解决T1_os/T1/driver/uart/uart_bk.c b/T1_os/T1/driver/uart/uart_bk.c:
中断通过宏CFG_CLI_UART, 不让读到fifo解决。
diff --git a/T1_os/T1/driver/uart/uart_bk.c b/T1_os/T1/driver/uart/uart_bk.c
index fb64bc4..6233033 100755
--- a/T1_os/T1/driver/uart/uart_bk.c
+++ b/T1_os/T1/driver/uart/uart_bk.c
@@ -878,10 +878,12 @@ void uart2_isr(void)if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{#if CFG_CLI_UART
#if (!CFG_SUPPORT_RTT)
uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
#endif
-#endif
+
if (uart_receive_callback[1].callback != 0)
{测试代码如下:
void xx_cb(int port_id)
{
uint32_t rx_char = 0;
int ret;
while (1)
{
rx_char = 0;
ret = tkl_uart_read(port_id, &rx_char, 1);
if (!ret) {
bk_printf("%s:%d ret %d\r\n", func, LINE, ret);
break;
}
bk_printf("%s:%d rx_char 0x%x ret %d\r\n", func, LINE, rx_char, ret);
}
}
void tkl_uart_unit_test(void)
{
tkl_uart_rx_irq_cb_reg(1, xx_cb);
}
Re: T1-CHL串口相关的问题
您好,我反复测试,按照您的修改方案,以及直接在uart2_isr中这样修改:
修改测试1 中断回调测试:
Code: Select all
void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
UINT32 status;
UINT32 intr_en;
UINT32 intr_status;
intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;
if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
bk_printf("uart2 isr\n");
修改测试2 回环测试:
Code: Select all
void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
UINT32 status;
UINT32 intr_en;
UINT32 intr_status;
intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;
if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
/* ------------------ fifo frame ---------------------------*/
UINT32 uart_read_fifo_frame(UINT8 uport, KFIFO_PTR rx_ptr)
{
UINT32 val;
UINT32 rx_count, fifo_status_reg;
if(UART1_PORT == uport)
fifo_status_reg = REG_UART1_FIFO_STATUS;
else
fifo_status_reg = REG_UART2_FIFO_STATUS;
rx_count = 0;
while(REG_READ(fifo_status_reg) & FIFO_RD_READY)
{
UART_READ_BYTE(uport, val);
UART_WRITE_BYTE(uport,val); // 进行回环测试,直接输出
rx_count += kfifo_put(rx_ptr, (UINT8 *)&val, 1);
}
return rx_count;
}
在日志终端中,均没有打印出相应日志。
就是说,中断回调都没进来。。。我们更换过模块,也是相同情况。
Re: T1-CHL串口相关的问题
我测试可以的;再确认一下你的函数修改:
void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
UINT32 status;
UINT32 intr_en;
UINT32 intr_status;
Code: Select all
intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;
if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
#if CFG_CLI_UART
#if (!CFG_SUPPORT_RTT)
uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
#endif
#endif
if (uart_receive_callback[1].callback != 0)
{
void *param = uart_receive_callback[1].param;
uart_receive_callback[1].callback(UART2_PORT, param);
}
else
{
uart_read_byte(UART2_PORT); /*drop data for rtt*/
}
}
if(status & TX_FIFO_NEED_WRITE_STA)
{
if (uart_txfifo_needwr_callback[1].callback != 0)
{
void *param = uart_txfifo_needwr_callback[1].param;
uart_txfifo_needwr_callback[1].callback(UART2_PORT, param);
}
}
if(status & RX_FIFO_OVER_FLOW_STA)
{
}
if(status & UART_RX_PARITY_ERR_STA)
{
uart_fifo_flush(UART2_PORT);
}
if(status & UART_RX_STOP_ERR_STA)
{
}
if(status & UART_TX_STOP_END_STA)
{
if (uart_tx_end_callback[1].callback != 0)
{
void *param = uart_tx_end_callback[1].param;
uart_tx_end_callback[1].callback(UART2_PORT, param);
}
}
if(status & UART_RXD_WAKEUP_STA)
{
}
#endif
}
- 用我的demo先跑一个确认一下:
void xx_cb(int port_id)
{
uint32_t rx_char = 0;
int ret;
while (1)
{
rx_char = 0;
ret = tkl_uart_read(port_id, &rx_char, 1);
if (!ret) {
bk_printf("%s:%d ret %d\r\n", func, LINE, ret);
break;
}
bk_printf("%s:%d rx_char 0x%x ret %d\r\n", func, LINE, rx_char, ret);
}
}
void tkl_uart_unit_test(void)
{
tkl_uart_rx_irq_cb_reg(1, xx_cb);
}
我本地验证过的,输入可以收上来;
Re: T1-CHL串口相关的问题
您好,我确认是按照您的修改方案处理的:
以下是uart2_isr代码:
Code: Select all
void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
UINT32 status;
UINT32 intr_en;
UINT32 intr_status;
intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;
if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
#if CFG_CLI_UART
#if (!CFG_SUPPORT_RTT)
uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
#endif
#endif
if (uart_receive_callback[1].callback != 0)
{
void *param = uart_receive_callback[1].param;
uart_receive_callback[1].callback(UART2_PORT, param);
}
else
{
uart_read_byte(UART2_PORT); /*drop data for rtt*/
}
}
按照你的demo,我在quickstart中测试也是没有打印中断回调的东西。。。
Code: Select all
void uart2_isr_callback(int port_id)
{
uint32_t rx_char = 0;
int ret;
while (1)
{
rx_char = 0;
ret = tkl_uart_read(port_id, &rx_char, 1);
if (!ret) {
bk_printf("%s:%d ret %d\r\n", "uart2_isr_callback", __LINE__, ret);
break;
}
bk_printf("%s:%d rx_char 0x%x ret %d\r\n", "uart2_isr_callback", __LINE__, rx_char, ret);
}
}
STATIC VOID_T user_main(VOID_T)
{
OPERATE_RET rt = OPRT_OK;
/* 忽略了中间无关代码 */
tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);
tkl_uart_rx_irq_cb_reg(1, uart2_isr_callback);
/* Initialization device */
TAL_PR_DEBUG("device_init in");
TUYA_CALL_ERR_LOG(__soc_device_init());
return;
}
是否是SDK版本的问题哈?SDK包为:tuyaos-iot_3.11.11_T1_wifi_ble_com_0.0.12
Re: T1-CHL串口相关的问题
-- 删除此前描述
Re: T1-CHL串口相关的问题
对了,确定CFG_CLI_UART宏为0,即uart2_isr中没有执行uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);