我们在BLE-UART例程基础上开发的,使能看门狗后,发现当设置1200波特率时候,发送16字节内容会导致看门狗复位,每次必现。
调用的发送函数是app_uart_tx_data(data,length);发送16字节内容,调整波特率为2400以上后,就不复位了。这个uart3的发送函数我改成了uart1,测量uart1是可以正确发出来的。
第一个想到是发送函数阻塞导致不能及时喂狗导致的,但是研究看看送函数那里并没有阻塞,最多阻塞8个字节的时间,在此处加喂狗指令,故障依旧。
void app_uart_process(void)
{
UINT32 irq_status;
SYS_DisableAllIrq(&irq_status);
if(uart_rx_flag)
{
tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2);
uart_rx_flag = false;
}
SYS_RecoverIrq(irq_status);
//tx process
if(R8_UART1_TFC < UART_FIFO_SIZE)
{
//PRINT("R8_UART1_TFC:%d\n",R8_UART1_TFC);
app_drv_fifo_read_to_same_addr(&app_uart_tx_fifo, (uint8_t *)&R8_UART1_THR, UART_FIFO_SIZE - R8_UART1_TFC);
}
}
继续研究,在主循环里发现两个函数,一个是TMOS系统的轮询,一个是串口发送处理函数,通过添加复位、置位io看发现TMOS_SystemProcess();函数执行时间超过400ms左右,用示波器看低电平时间在400ms左右。因为TMOS的没有源码,我向问官网技术人员,怎么看TMOS哪个任务占用CPU时间过长了,有没有好的方法查这个问题
__attribute__((section(".highcode")))
void Main_Circulation()
{
while(1)
{
GPIOA_ResetBits(GPIO_Pin_12);
TMOS_SystemProcess();
*((unsigned char*)0x40001043) = 0;//喂狗
GPIOA_SetBits(GPIO_Pin_12);
app_uart_process();
}
}