中断服务程序简介(转载)
2008-10-23 21:53
260 查看
断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。
在某项目的开发中,我们设计了一个队列,在中断服务程序中,只是将中断类型添加入该队列中,在主程序的死循环中不断扫描中断队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。
在主程序循环中判断是否有中断:
按上述方法设计的中断服务程序很小,实际的工作都交由主程序执行了。
中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。
在某项目的开发中,我们设计了一个队列,在中断服务程序中,只是将中断类型添加入该队列中,在主程序的死循环中不断扫描中断队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。
/* 存放中断的队列 */ typedef struct tagIntQueue { int intType; /* 中断类型 */ struct tagIntQueue *next; }IntQueue; IntQueue lpIntQueueHead; __interrupt ISRexample () { int intType; intType = GetSystemType(); QueueAddTail(lpIntQueueHead, intType);/* 在队列尾加入新的中断 */ } |
While(1) { If( !IsIntQueueEmpty() ) { intType = GetFirstInt(); switch(intType) /* 是不是很象WIN32程序的消息解析函数? */ { /* 对,我们的中断类型解析很类似于消息驱动 */ case xxx: /* 我们称其为"中断驱动"吧? */ … break; case xxx: … break; … } } } |
相关文章推荐
- STL SET 常用操作简介[转载]
- 【转载】Maven简介
- HttpWatch工具简介及使用技巧(转载)
- [转载] ZooKeeper简介
- [转载]WAP简介
- Hadoop 学习总结之一:HDFS简介(转载)
- (转载)Java自带的GUI性能监控工具Jconsole以及JisualVM简介
- [转载]虚拟工作环境中的Openfiler存储技术简介
- 数值类型简介 (Overview of Numeric Types)(此文为转载)
- [转载]Sybase数据库简介(初学者必看)(6)
- sliva数据库简介--转载
- [转载]数学各个研究方向简介
- 转载:CMarkUp使用简介
- [转载]AAF灵便应用框架简介系列(5):对象的持久化(高级)
- android 属性系统,SystemProperties 的简介---转载
- 转载 - C++ bitset类使用与简介
- 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试(转载)
- Unitils中DataSetLoadStrategy简介及定制方法 (转载)
- (转载)DirectX 8.0 简介
- monkey测试===Android测试工具Monkey用法简介(转载)