欢迎光临散文网 会员登陆 & 注册

无名创新售后群问题节选:飞控四个串口同时采集传感器数据,应该如何设计中断优先级

2021-05-13 00:00 作者:无名创新开源无人机EDU  | 我要投稿

请问小哥,飞控如果需要通过三四个串口同时采集多个传感器数据,应该如何设计中断优先级,会不会出现当某一传感器发送频率过快时,一直占用改串口中断函数而进不了其他串口中断呢?这种该如何解决?谢谢小哥


首先这里需要明白一点,串口通讯波特率与数据传输时间的关系,以无名飞控GPS解析为例,正常工作时,GPS工作以波特率921600,8个数据位,一个起始位,一个停止位。921600bps/(8+1+1)bit=传输92160字节/s,故串口传输一个字节用时1000000us/92160≈10.85us,这里可以简单计算一下,飞控接受pvt语句开销92数据位+2检验位=94,94*10.85约等于1.02ms,与飞控实际测试时间基本一致,实际也可以测试115200、38400通讯时开销分别为8.53ms、25.6ms,接受单个字节耗时分别为86.8us、264.4us。 以GPS解析为说明串口传输时间后,再来考虑中断问题,首先为保障数据不丢帧,当只存在一个串口中断时,该串口中断内部函数执行时间,务必要小于该串口的传输一个直接所需的时间,以波特率115200的串口1为例,串口1的中断函数执行时间务必小于86.8us,即串口1的下一个字节传输来之前,上一个字节的串口中断处理函数务必运行完成,否则数据就会丢帧。 所以一般来讲,串口中断函数里面都不会去执行大段时间开销的任务,目的就是确保不丢帧,常用的办法是在串口中断里面采用环形队列缓冲区存储数据,数据解析用低优先级的任务去处理。 环形队列缓冲区存储函数的执行时间在STM32F1里面大概2us不到,在STM32F4里面不足1us,所以当串口中断函数里面只运行环形对接缓冲区存储函数时,即使以波特图921600(传输一个字节10.85us)通讯,数据也不会丢帧。 当存在多个串口接受函数时,此时以STM32F1为例,假设环形队列缓冲区存储函数的执行时间在STM32F1里面为2us,此时存在6个串口中断以波特率921600同时运行,各中断彼此之间不能打断,但是存在子优先顺序,同一时刻6个中断全部挂起,这个时候系统首先响应子优先级第一的串口中断接受函数耗时2us,接着依次响应子优先级23456,当第6个串口中断函数刚开始执行时是第10us,在10—12us时系统正在执行第6个串口中断函数,在10.85us时刻,下一次串口中断又来了,此时便发生了数据丢帧。可以可以想一下,此时在不丢帧情况下,系统能设计的最大串口中断数为5个。 上面是以很极端的例子说明了丢帧在实际系统中是怎么发生的,一般串口通讯波特率不会到921600这么大,并且不是每个串口都必须工作在同一波特率,当工作波特率为115200时,串口接收单个字节为86.8us,此情况下系统能够执行足够多的串口中断函数,仍然能确保不丢帧。所以当系统所需串口中断很多时,可以通讯把波特率降下来,来确保不数据丢帧。 以上只考虑了串口中断彼此之间开销,当系统存在比串口中断接收优先级更好的中断任务时,比如利用外部中断的ppm接收、超声波测距等,为了确保串口不丢帧,需要优先级高于串口中断的任务最大执行时间+串口中断函数执行时间,务必小于串口接收单个字节所需的时间,才能确保不丢帧。 


总结: 

1、多个串口通讯时,串口通讯波特率可以降低一点。 

2、合计设计优先级,当存在不同波特率通讯时,通讯波特率高的串口中断优先级要高于波特率低的。 

3、存在优先级高于串口中断的其它中断任务时,其它中断任务的总的最大时间开销也要考虑。

祝好 

无名小哥:余义



无名创新售后群问题节选:飞控四个串口同时采集传感器数据,应该如何设计中断优先级的评论 (共 条)

分享到微博请遵守国家法律