2026/6/20 12:02:00
网站建设
项目流程
设计网站公司 露 联湖南岚鸿,网站的服务器打不开,深圳商业营销厅设计公司,wordpress百度熊掌号一、以串口中断为例
1.如果串口的波特率为921600bps
2.串口为一个字节产生一次中断二、波特率为921600bps波特率产生中断说明
说明#xff1a;波特率为921600bps#xff0c;串口的帧格式为10bit#xff0c;也就是
一个起始位#xff0c;8bit的数据位#xff0c;还有一个bi…一、以串口中断为例1.如果串口的波特率为921600bps2.串口为一个字节产生一次中断二、波特率为921600bps波特率产生中断说明说明波特率为921600bps串口的帧格式为10bit也就是一个起始位8bit的数据位还有一个bit的停止位总计是10bit传输一个字节。那么波特率位921600bps,那么1秒能够传输92160个字节。如果每个字节产生一次中断那么就是92160中断/秒。注意每次中断都需要CPU保存上下文处理以及恢复那么这个过程在A7上的开销是很大的如果你写的中断服务程序ISR处理比较耗时的话那么就问题比较多了。三、A7的中断响应时间1.A7的主频位1GHZ以上2.中断处理的步骤很多包括内核响应跳转到ISR,处理数据邓步骤如果ISR里面还有复杂的操作或者系统还有其他中断和高负荷的任务那么处理不当会造成数据丢失四、如何判断中断产生太频繁是否超过CPU能够稳定响应的极限1.关于波特率921600bps,产生中断频率有多高中断频率92,160 次/秒。这意味着 平均每10.86微秒1秒 / 92160CPU就要被中断一次。也就是10.86us产生一次中断2.cortex-a7能够处理多少中断Cortex-A7主频高达1GHz但响应中断不仅仅是执行ISR中断服务程序那几条指令。整个过程涉及巨大的隐性开销。首先关于硬件中断的响应延迟其次关于操作系统的开销再次关于中观处理本身的效率最后系统的总负荷五、关于A7处理中断1.硬件中断的响应延时CPU需要将当前的指令完成然后进入异常向量表然后保存现场压栈PC和CPSR等寄存器。然后跳转到中断处理函数。2.操作系统RTOS或者linux操作系统的开销首先内核态的切换如果是从用户态任务触发需要先切换到内核态这个操作的开销是比较昂贵的。其次中断的前半部分处理在linux中前半部分要比较快的处理通常是将数据从硬件的FIFO中拷贝到内存缓冲区中并标记唤醒下半部分。然后中断下半部分处理比如softIRQ软中断Tasklet,工作队列等。实际的数据处理通常在这部分进行调度和切换也需要时间。再然后是中断的屏蔽和嵌套再然后是中断处理完成后等待被唤醒的数据处理任务也不一定立即被调度执行。3.ISR的效率问题如果你写的ISR代码的效率比较低如果有打印有复杂裸机甚至你在中断服务程序中有阻塞的延时操作那么这个就会让ISR中断服务程序处理的时间非常长。4.需要考虑系统的总负荷Cortex-A7通常运行Linux等复杂操作系统系统本身有大量进程、线程、中断在竞争CPU时间。10.86微秒的间隔很容易被其他活动打乱。六、中断处理不及时问题最坏情况延迟系统可能正在处理其他中断如网络、USB、执行关键区代码关中断、或进行内存管理等。这些都会导致对串口中断的响应出现不可接受的延迟。一旦CPU错过了一个字节的接收由于串口是流式的下一个字节会覆盖前一个直接导致数据丢失。七、总结在92.16kHz的周期性中断轰炸下由操作系统、上下文切换、内存访问等带来的累积延迟使得系统无法保证在下一个字节到来前10.86μs内完成对上一个字节的完整处理从而导致响应不过来和数据丢失。八、解决方案方案1启用硬件FIFO并提高中断阈值首选最简单原理绝大多数现代UART控制器都有硬件FIFO如16字节或更深。不要在每个字节都中断而是设置一个触发水位例如当FIFO收到8个或14个字节时产生一次中断。效果中断频率立刻降低为原来的 1/8 或 1/16。从92kHz降至11.5kHz或5.76kHzCPU压力骤减。实现查看芯片手册配置UART的FIFO控制寄存器。方案二使用DMA直接内存访问原理这是为高速数据流设计的终极解决方案。为UART的接收通道配置DMA。DMA控制器会在不打扰CPU的情况下自动将UART接收到的数据搬运到指定的内存缓冲区中。仅在以下情况通知CPU缓冲区满了半满或全满产生中断。线路空闲超时一段时间没收到数据产生中断。效果几乎完全解放CPU。中断频率从字节级降至“缓冲区级”例如每收256字节中断一次。实现需要配置DMA控制器并处理好环形缓冲区管理。这是处理921600bps及以上速率最标准、最可靠的方法。方案三优化软件架构如果必须用字节中断如果硬件不支持FIFO或DMA只能从软件层面极致优化ISR绝对精简ISR里只做一件事——将数据寄存器读到一个全局环形缓冲区。不要在ISR内进行任何解析、打印、判断。使用高优先级任务/线程处理数据创建一个高优先级的实时任务在RTOS中或内核线程在Linux中该任务阻塞在一个信号量或队列上。ISR在存入数据后立即释放该信号量。任务被唤醒后再从环形缓冲区中取出数据进行处理。提升中断优先级将串口接收中断设置为最高优先级之一减少被其他中断打断的可能。关闭无关中断在关键数据接收阶段可以临时关闭不重要的中断源。