在VxWorks里,中断服务程序怎么注册,还有响应异常的时候怎么检查,不能只是确认中断函数已经编译进了工程,就认为万事大吉。硬件中断的来源、IRQ的编号、中断控制器、触发的方式,还有服务程序的入口和跟在后面的任务处理,这几样都需要互相保持对应。只要有一个环节的对应出了错,都有可能让中断完全不反应,或者只反应一次,或者不停地重复进入,又或者中断其实已经发生了,可是业务任务那里却没有一点动作。
一、VxWorks中断服务程序怎么注册
中断的注册办法,和VxWorks的版本、板级支持包,还有用的是哪一种驱动框架,都是连在一起的。传统驱动和VxBus驱动它们所用到的连接接口并不是完全一样的,在移代码的时候,不能只是把ISR函数复制过去,还要同步去看一下当前平台给出来的中断资源,还有注册的方法是什么。
1、确认硬件中断资源
一开始,需要去核对外设对应的IRQ编号、它接在哪个中断控制器上、触发的方式、有效的电平,还有中断的优先级。不同的芯片或者板级支持包,它们把IRQ转换成系统中断向量的办法可能是不同的,就算外设寄存器的地址看上去是一样的,也不能直接把别的板子上的中断号拿过来就用。在有多级中断控制器的环境里面,还得把父一级控制器和子一级控制器之间的对应关系给弄清楚。
2、编写中断服务程序
ISR进去以后,要先去读一下设备的状态寄存器,把中断是从哪里来的给确认准了,把需要留下的数据保存好,再把中断标志给清掉。这个服务程序,应该写得尽可能简短一些,不要去执行那种会让自己停在那里等待的操作、文件的读写、复杂的计算,还有往外头输出大量的日志。要是后面还需要做不少处理的工作,那可以在服务程序里面去释放一个信号量,或者发出一条消息,然后让优先级更高的任务去把剩下的数据处理给接过去。
3、连接并启用中断
采用VxBus驱动时,应从【设备资源】中取得中断信息,再调用当前BSP支持的连接和使能接口注册ISR。
处理起来的顺序,较为可靠的做法是,先把设备那一端的中断给关掉,把之前留下来的状态给清除干净,然后再去把ISR连接好,把触发的方式配置好,到了最末尾,才去把中断控制器和设备的中断都打开。要是在服务程序都还没有连上去的时候,就把硬件的中断给使能了,那么中断一来,就有可能会直接跑到那个默认的异常入口里面去。
二、VxWorks中断服务程序响应异常怎么检查
在开始排查之前,需要先分清楚它表现出来的具体情况。是ISR完全都进不去,还是只进去了一次,又或者是在那里反反复复地进去,以及进去了以后业务那边却没有任何反应,这些情况要查的方向是不一样的。不要只是在中断函数的入口那里去加上一句打印,因为频率很高的日志,它本身也是有可能把中断的时序给扰乱的。
1、检查中断请求是否产生
先去看一下外设的中断状态,还有中断控制器里面的Pending状态。要是设备的状态根本就没有发生变化,那就应该去检查一下外设的时钟、引脚的复用、工作的模式,还有设备那一头的中断使能。要是设备已经把请求给提出来了,但是控制器并没有把Pending状态给记下来,那就得接着去检查中断的线路、极性、触发的方式和屏蔽的配置。
2、核对IRQ和向量映射
在【设备树】或BSP资源配置中,检查驱动读取到的IRQ编号、控制器引用和触发类型。
设备树里面的那个中断号,它不一定就等于处理器手册里面写的那个原始的硬件编号。要是转换的关系给用错了,注册的接口那里可能会返回一个正常的结果,可是中断实际上却跑到别的向量里面去了。当碰到ISR完全进不去,或者是别的设备的处理函数被误触发了的时候,就应当把这一层当作重点来检查。
3、检查中断标志清除
当ISR持续重复进入的时候,一般就是要去看一下,设备那一头的中断源头是不是真的已经被解除了。电平触发的那种中断,在设备的状态还没有恢复过来以前,它就会一直保持在有效的状态,仅仅清除中断控制器,却不去清设备的寄存器,是很容易形成一个中断风暴的。要是中断只响应了一次就不再动了,那就要去检查一下,是不是在清除的操作当中,不小心把后面的中断给关掉了,或者是设备的使能位没有再被重新打开。
三、中断进入后业务仍异常怎么定位
ISR能够正常进去,这只能说明从硬件那里到中断入口的这条路,基本上是能用的。如果任务并没有被唤醒、处理的延迟过大,或者是系统偶尔停止响应,那就还得接着去检查中断上下文和任务之间的那个配合。
1、记录中断进入次数
可以在ISR里面去增加一个简简单单的计数变量,然后再让一个普通的任务定期去把它读出来,并且输出。不要在高频中断里面连着去调用打印的接口,要不然串口或者控制台的输出,会占掉比较长的时间,让本来正常的中断看起来像是出现了延迟,或者是在那里堆积一样。
2、检查任务唤醒状态
如果ISR是用信号量或者消息队列去通知任务的,那就应该去检查一下,释放信号量或者发消息的操作有没有成功,消息队列是不是已经被塞满了,还有那个负责接收的任务,是不是真的处在等待的状态。任务的优先级设得太低,或者是长时间地被别的更高优先级的任务占用,这也同样会表现为中断已经发生了,可是业务的处理却迟迟没有去执行。
3、检查共享数据访问
当ISR和任务一起去访问缓冲区、索引还有状态位的时候,就需要把数据写进去的顺序,还有同步的方式给明确下来。临界区持续的时间不能拖得太长,也不可以在关掉中断的这段时间里,去执行那些可能会把自己阻塞住的系统功能。共享的数据要是更新到一半就不完整了,任务就有可能会读到一个旧的值,或者是一个中间的状态,最后表现出来的,就是偶尔会丢掉一些数据,或者是处理出来的结果不太稳定。
总结
VxWorks里面中断服务程序怎么注册,还有响应异常怎么检查,这件事可以照着先确认中断资源、再编写一个精简的ISR、把连接做好了以后再去使能、然后逐级地去检查硬件请求和向量映射这样的顺序来处理。ISR进不去的时候,重点去查IRQ和触发的方式;要是它不停地重复进入,就去查中断源的清除;只响应了一次的话,就去查设备的使能状态。中断是进去了,可是业务那边还是不正常,那就还得接着去排查任务的优先级、信号量、消息队列,还有共享数据的处理。
