基于嵌入式操作系统VxWorks的多任务并发程序设计(5)――中断与任务
更新时间:2023-10-27 09:56:01 阅读量: 综合文库 文档下载
- 嵌入式位操作推荐度:
- 相关推荐
基于嵌入式操作系统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 */ VOIDFUNCPTR routine, /* routine to be called */ int parameter /* 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 \ #include \ #include \ #include \ #include \ /* 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 100 void interruptGenerator(void) /* task to generate the SIGINT signal */ { int i, j, taskId, priority; STATUS taskAlive; if ((taskId = taskSpawn(\PRIORITY, 0x100, 20000, (FUNCPTR) interruptCatcher, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == ERROR) logMsg(\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(\0, 0, 0, 0, 0, 0); /* generate hardware interrupt 2 */ if ((sysBusIntGen(INTERRUPT_NUM, INTERRUPT_LEVEL)) == ERROR) logMsg(\not generatedn\0, 0, 0, 0, 0, 0); } else /* interruptCatcher is dead */ break; } logMsg(\Exited***************nnnn\0, 0, 0, 0, 0, 0); } void interruptCatcher(void) /* task to handle the interrupt */ { int i, j;
正在阅读:
基于嵌入式操作系统VxWorks的多任务并发程序设计(5)――中断与任务10-27
外研版高一英语必修三重点核心词组与句型Module - 1-607-02
2015浙江传媒学院编导真题及分析之一10-06
CRM应用启示:让客户获得成功09-16
2012高考数学总复习练习:第一单元 第一节 集 合12-27
2019年中级会计师考试《中级会计实务》试题(含答案解析)0609609-29
工程项目施工安全各项管理制度205-31
LL(1)语法分析构造表的设计 正文05-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 任务
- 并发
- 程序设计
- 嵌入式
- 中断
- 基于
- 操作系统
- VxWorks
- 小学奥数 几何计数 专题
- 图像处理实验报告
- 全国大学生数学建模竞赛一等奖论文2012年葡萄酒的评价
- 红河人才网:2014年屏边县事业单位招聘128人
- 关于对外协产品采购不合格处理流程及考核办法
- 2017-2018学年第二学期七年级英语期末考试试卷(人教版含听力)
- 益阳市2011年政府工作报告
- 以点带面 以面促体
- 2013广东公务员申论三试题及答案解析
- 关于跟踪体会
- 人教版四年级下册语文集体备课 01、《古诗词三首》
- dsc系统i报警中心方案
- 初中生物课程实验教学论文
- 纪律作风整顿教育活动个人剖析材料
- 工程量计算示例解答汇总 - 图文
- 电化学与氧化还原平衡
- 2008年专利代理人考试真题及答案-专利法律知识
- 地球物理勘探试题库
- 第七章回归与相关分析练习及答案
- 1、食材果蔬、调料供货商招标文件