




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于嵌入式操作系统VxWorks的多任务并发程序设计(5)中断与任务中断处理是整个运行系统中优先级最高的代码,可以抢占任何任务级代码运行。中断机制是多任务环境运行的基础,是系统实时性的保证。几乎所有的实时多任务操作系统都需要一个周期性系统时钟中断的支持,用以完成时间片调度和延时处理。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几乎不能作为信息的接收者,它不可以等待接收消息或信号量。11.中断服务程序 VxWorks中与中断相关的重要API函数或宏有:(1)intConnect():中断连接,将中断向量与ISR入口函数绑定SYNOPSIS STATUS intConnect ( VOIDFUNCPTR *vector,/* interrupt vector to attach to*/ VOIDFUNCPTRroutine, /* routine to be called */ intparameter /* parameter to be passed to routine */ );intConnect只是调用了下文将要介绍的intHandlerCreate()和intVecSet()函数。(2)INUM_TO_IVEC(intNum):将中断号转化为中断向量的宏。与INUM_TO_IVEC对应的还有一个IVEC_TO_INUM(intVec),实现相反的过程。INUM_TO_IVEC和IVEC_TO_INUM的具体定义与特定的BSP有关,例如:/* macros to convert interrupt vectors interrupt numbers */#define IVEC_TO_INUM(intVec)(int) (intVec)#define INUM_TO_IVEC(intNum)(VOIDFUNCPTR *) (intNum)结合1、2可知一般挂接一个中断服务程序的调用为:intConnect(INUM_TO_IVEC(INTERRUPT_LEVEL),(VOIDFUNCPTR)interruptHandler,i);例1:中断服务程序 /* includes */#include vxWorks.h#include intLib.h#include taskLib.h#include sysLib.h#include logLib.h/* function prototypes */void interruptHandler(int);void interruptCatcher(void);/* globals */#define INTERRUPT_NUM 2#define INTERRUPT_LEVEL 65#define ITER1 40#define LONG_TIME 1000000#define PRIORITY 100#define ONE_SECOND 100void interruptGenerator(void) /* task to generate the SIGINT signal */int i, j, taskId, priority;STATUS taskAlive;if (taskId = taskSpawn(interruptCatcher, PRIORITY, 0x100, 20000, (FUNCPTR)interruptCatcher, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) = ERROR)logMsg(taskSpawn interruptCatcher failedn, 0, 0, 0, 0, 0, 0);for (i = 0; i ITER1; i+)taskDelay(ONE_SECOND); /* suspend interruptGenerator for one second */* check to see if interruptCatcher task is alive! */if (taskAlive = taskIdVerify(taskId) = OK)logMsg(+Interrupt generatedn, 0, 0, 0, 0, 0,0);/* generate hardware interrupt 2 */if (sysBusIntGen(INTERRUPT_NUM, INTERRUPT_LEVEL) = ERROR)logMsg(Interrupt not generatedn, 0, 0, 0, 0, 0, 0);else /* interruptCatcher is dead */break;logMsg(n*interruptGenerator Exited*nnnn, 0,0, 0, 0, 0, 0);void interruptCatcher(void) /* task to handle the interrupt */int i, j;STATUS connected;/* connect the interrupt vector, INTERRUPT_LEVEL, to a specific interrupthandler routine ,interruptHandler,and pass an argument, i */if (connected = intConnect(INUM_TO_IVEC(INTERRUPT_LEVEL), (VOIDFUNCPTR)interruptHandler, i) = ERROR)logMsg(intConnect failedn, 0, 0, 0, 0, 0, 0);for (i = 0; i ITER1; i+)for (j = 0; j LONG_TIME; j+) ;logMsg(Normal processing in interruptCatchern, 0, 0, 0, 0, 0, 0);logMsg(n+interruptCatcher Exited+n, 0, 0, 0,0, 0, 0);void interruptHandler(int arg) /* signal handler code */int i;logMsg(-interrupt caughtn, 0, 0, 0, 0, 0, 0);for (i = 0; i 5; i+)logMsg(interrupt processingn, 0, 0, 0, 0, 0, 0);程序中的sysBusIntGen()调用将产生一个bus中断,这个函数与特定的BSP密切相关,其原型为: STATUS sysBusIntGen(int intLevel, /* bus interrupt level to generate */int vector /* interrupt vector to generate (0-255) */);为了在同一中断源的几种中断服务程序中进行切换,我们应使用如下方式:vector = INUM_TO_IVEC(some_int_vec_num);oldfunc = intVecGet (vector);newfunc = intHandlerCreate (routine, parameter);intVecSet (vector, newfunc);.intVecSet (vector, oldfunc); /* use original routine */.intVecSet (vector, newfunc); /* reconnect new routine */其中,intHandlerCreate函数的原型为:FUNCPTR intHandlerCreate(FUNCPTR routine, /* routine to be called */int parameter /* parameter to be passed to routine */);它被用于创建一个中断服务程序,在此之后,通过intVecSet()函数我们就可以将intHandlerCreate()创建的结果与中断向量绑定,intVecSet()函数的原型为:void intVecSet(FUNCPTR * vector, /* vector offset */FUNCPTR function /* address to place in vector */);12.中断控制12.1中断执行过程 硬件中断发生时,代码运行的上下文会发生切换,在进入中断处理前,需要保存当前运行的上下文。对于一些无RTOS的单片机系统,这些工作由硬件和编译器共同完成,向量表在编译完成后就填充完成,再写入存储器中,系统运行时不能修改向量表来重新绑定中断入口函数。在VxWorks系统中,除了需要保存通常的寄存器环境外,还需要完成栈切换等;另外还要求中断入口运行时绑定、平台移植性、中断嵌套等,所以VxWorks本身也参与中断封装的管理。VxWorks进行中断封装的伪代码如下:* 00e8 kk kk kk kk call_intEnt * 通知内核* 0550 pushl %eax* 保存寄存器* 0652 pushl %edx* 0751 pushl %ecx* 0868 pp pp pp pp pushl $_parameterBoi * push BOI param* 13e8 rr rr rr rr call_routineBoi* call BOI routine* 1868 pp pp pp pp pushl $_parameter* 传中断入口参数* 23 e8 rr rr rr rr call_routine * 调用中断处理C函数* 2868 pp pp pp pp pushl $_parameterEoi * push EOI param* 33e8 rr rr rr rr call_routineEoi* call EOI routine* 3883 c4 0caddl?, %esp * pop param* 4159 popl%ecx* 恢复寄存器* 425a popl%edx* 4358 popl%eax* 44e9 kk kk kk kk jmp_intExit * 通过内核退出12.2中断使能/禁止 VxWorks提供两个重要API:(1)intLock():使中断禁止(2)intUnlock():开中断可以用intLock/intUnlock提供最高级别的互斥机制以保护临界区域不被打断,例如:oldlevel = intLock();/* 写XXX寄存器 */XXX_REG_WRITE(pChan, XXX_UBRDIV, XXX_CNT0_115200 |XXX_CNT1_VAL);intUnlock(oldlevel);用intLock()禁止中断后,当前执行的任务将一直继续,中断处理和任务调度得不到执行,直到该任务主动调用intUnLock解锁中断为止。对于intLock和unLock的使用,我们要注意如下几点:(1)不要在中断禁止期间调用vxWorks系统函数,否则有可能意外使能中断,违反临界代码的设计意图。另外,intLock也不能屏蔽调度,如果在中断禁止代码区使用系统调用,就可能出现任务调度,其他任务的运行可能会解锁中断;(2)中断禁止对系统的实时性有很大的影响,在解决执行代码和中断处理互斥问题才可使用,并且应使中断禁止时间尽可能的短。对于任务间的互斥问题,可以使用taskLock()和taskUnLock()来解决;(3)有些CPU中断是分级,我们可以用intLockLevelSet()和intLockLevelGet()来操作中断闭锁的级别。缺省情况下,taskLock禁止所有等级的中断。至此,我们可以对“互斥”问题进行一个系统的总结,主要有如下几种方法:(1)intLock禁止中断:解决任务和ISR之间的互斥问题; int lock = intLock();/. . critical region that cannot be interruptedintUnlock(lock);(2)taskLock禁止优先级抢占调度:当当前任务正在运行时,除了中断服务程序外,高优先级的任务也不允许抢占CPU;taskLock();/. . c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年关于专利申请转让代理合同范本
- 2025年中国高科技床行业市场全景分析及前景机遇研判报告
- 2025《YY省基础设施建设项目合同书》
- 成人教育终身学习体系构建与平台运营中的在线教育平台商业模式创新与发展报告
- 2025年影视行业工业化生产流程与质量监控创新报告
- 2025年中级职称道路工程考试试题及答案
- 2025年泽门期末考试试题及答案
- 2025年力学实验试题及答案
- 2025广告传媒公司合作合同协议书范本
- 2025办公室租赁合同争议处理
- 工程监理质量评估报告
- Unit 2 My school things 第一课时 Get ready(教学设计)-2024-2025学年外研版(三起)(2024)英语三年级上册
- 专利知识培训教学课件
- 城市桥梁安全性评估规程DB50∕T 273-2021
- 数据库应用技术-第三次形考作业(第10章~第11章)-国开-参考资料
- 新能源汽车故障诊断试题库+答案
- 北京版(2024)小学一年级全一册体育与健康全册教案
- 2025年山东省安全员C证(专职安全员)考试题库
- 眼部拨筋医学知识
- 《关于作业的班会》课件
- 实训楼配电改造施工方案
评论
0/150
提交评论