中断与任务——vxworks

时间:2022-12-30 16:10:28

分类:

中断处理是整个运行系统中优先级最高的代码,可以抢占任何任务级代码运行。中断机制是多任务环境运行的基础,是系统实时性的保证。几乎所有的实时多任务操作系统都需要一个周期性系统时钟中断的支持,用以完成时间片调度和延时处理。VxWorks 提供tickAnnounce(),由系统时钟中断调用,周期性地触发内核。

  为了快速响应中断,VxWorks的中断服务程序(ISR)运行在特定的空间。不同于一般的任务,中断服务程序没有任务上下文,不包含任务控制块,所有的中断服务程序使用同一中断堆栈,它在系统启动时就已根据具体的配置参数进行了分配和初始化。在ISR中能使用的函数类型与在一般任务中能使用的有些不同,主要体现在:

(1)ISR中不能调用可能导致blocking的函数,例如:

    (a)不能以semTake获取信号量,因如果该信号量不可利用,内核会试图让调用者切换到blocking态;

    (b)malloc和free可能导致blocking,因此也不能使用;

   (c)应避免进行VxWorks I/O系统操作(除管道外);

   (d)应避免在ISR中进行浮点操作。

(2)在ISR中应以logMsg打印消息,避免使用printf;

(3)理想的ISR仅仅调用semGive等函数,其它的事情交给semTake这个信号量的任务去做。一个ISR通常作为通信或同步的发起者,它采用发送信号量或向消息队列发送一个消息的方式触发相关任务至就绪态。ISR几乎不能作为信息的接收者,它不可以等待接收消息或信号量。


中断服务程序

VxWorks中与中断相关的重要API函数或宏有:

(1)intConnect():中断连接,将中断向量与ISR入口函数绑定