CH32V307 FreeRTOS 多中断相互干扰无法控制。

板子:CH32F&Vx0xV-R1-1v1


描述:从freertos例程中修改的。我加了一个1ms一次的TIM2中断,UART1的接收中断。两个中断独立运行没问题。当我在TIM2_IRQHandler()中执行较长时间的操作后,UART1的接收中断丢数据。

程序功能:我用串口发送"MUTE\r\n"到下位机。下位机收到后先逐个打印收到的字符,发现'\n'时解析一帧数据,并发送"[REP]:MUTE\r\n",发现接受到的不是合法数据发送"[ERR]:"


尝试1:我尝试设置UART1接收中断抢占TIM2中断。并在TIM2_IRQHandler()加一个死循环,那么一旦触发,程序就会一直呆在TIM2_IRQHandler()。此时,USART1_IRQHandler(void)正常执行.我抢占应该是没问题?设置完抢占后,我把TIM2_IRQHandler()中的死循环去掉,还是有干扰。下图是有干扰时,串口的截图。其中w:MU是打印的内存中的串口数据缓冲区。

image.png



尝试2:在尝试1的基础上,我把freertos去掉。没有干扰了。下图就是正确的结果。

image.png


感觉是FreeRTOS跟中断的关系问题。网上查了查(关键词"stm32 freertos 中断嵌套"),FreeRTOS是有一些配置的宏(如configMAX_SYSCALL_INTERRUPT_PRIORITY),但CH32V307的例程中没有这个配置。不知道是不是这个原因。


我还是想用freertos的,想问下该咋解决。

能给个邮箱吗?我发您带freertos的程序。

我还试了不同的压栈方式没有区别。

image.png


串口中断部分。

image.png


个人建议,既然用了RTOS了定时器肯定用OS的定时器了,串口通讯肯定用DMA+查询状态了,这样就没有中断了不会存在中断优先的问题了。如果DMA不够就换更多DMA的片子了。1ms定时器中断还死循环还执行很多代码分分钟让OS死得不能再死了。


您好,邮箱为lzs@wch.cn,可发我具体看一下


程序已发送至您的邮箱。1ms的定时器里执行的是我设计的控制逻辑,控制逻辑执行总时间应该在200us以内。不在freertos的任务中执行这个控制是因为frertos的任务切换大概在2ms左右,很难保证我的控制1ms执行一次。目前的设计是,我的控制逻辑在每1ms一次的中断中执行,只接受被"串口接收中断"打断,在freertos的任务中执行 一些不重要的附加功能。


另外,不用DMA是我不太会DMA。。。


您好,已邮件回复你,后续问题沟通可继续通过邮箱沟通。


只有登录才能回复,可以选择微信账号登录