嵌入式操作系统内核原理和开发(中断) -
更新时间:2023-09-15 17:27:01 阅读量: 资格考试认证 文档下载
- 嵌入式工作推荐度:
- 相关推荐
软件英才网 软件行业驰名招聘网站
嵌入式操作系统内核原理和开发(中断)
在我个人看来,中断是cpu最重要的特色。从某种意义上来说,没有中断就没有嵌入式操作系统。一旦你明白了中断的真正含义,你对操作系统的了解就算真正入门了。什么是中断呢?我们可以看看单片机下面是怎么做的。
? ? ? ? ? ? ? ? ?
#include
sbit LED = P1 ^ 6;
unsigned int led_enable = 0;
void Delay(unsigned int a) {
unsigned int i;
?? while(a) ?? {
?? a --;
?? for(i = 0; i < 1200; i++); ?? } ?? } ??
?? void led_switch(void) interrupt 0 using 1 ?? {
?? if(0 == led_enable) ?? {
?? led_enable = 1; ?? } ?? else ?? {
?? led_enable = 0; ?? } ??
?? EX0 = 1; ?? } ??
?? void main(void) ?? {
?? EA = 1; ?? EX0 = 1; ??
有需要请联系我们
软件英才网 软件行业驰名招聘网站
?? while(1){
?? if(led_enable) ?? {
?? LED = 0; ?? Delay(100); ?? LED = 1; ?? Delay(100); ?? } ?? } ?? }
上面的代码是一段真实的51单片机代码。它完成的功能很简单,就是对led灯进行点亮处理。怎么解释呢?在单片机上电后,我们发现一开始led二极管没有发生闪烁。在我们单击按键之后,led开始出现间隙性闪烁的现象,之后再一次单击按键,又可以发现led的闪烁现象消失了。为什么会出现这种现象?主要是因为我们单击按键的时候,在单片机的引脚处产生了中断。查看到中断的单片机此时就会跳转到中断向量表里面查找中断处理函数。这里的按键中断处理函数就是led_switch。处理完led_switch之后,单片机又会回到原来的main函数继续执行,所以整个中断的过程就像没有发生过一样。因为在led_switch中我们对led_enable进行了处理,所以就出现了我们在前面说过的各种现象。
说到这,也许有的朋友会说,cpu的这种中断属性怎么才能在pc上面仿真出来呢?其实很简单。linux系统本身就有一个优秀的特性,那就是信号。只要我们设定相应的信号和处理函数,那么linux系统就会在系统调度返回之前调用相应的信号函数来处理。整个信号处理的过程和中断是一模一样的。因为在处理中断的时候,我们需要对cpu的现场进行保存和恢复处理,而信号的处理也是一样。在信号处理前,系统肯定是处于内核态,那么linux系统肯定已经为我们做好了现场的保护工作,处理完信号之后,系统本身又会恢复到原来的用户态,继续执行下面的代码。所以linux自身也会默认对原来的场景进行恢复处理,就好象中断返回一样。
?? #include
有需要请联系我们
软件英才网 软件行业驰名招聘网站
?? #include
?? static int count = 0;
?? static struct itimerval oldtv; ??
?? void set_timer() ?? {
?? struct itimerval itv; ?? itv.it_interval.tv_sec = 1; ?? itv.it_interval.tv_usec = 0; ?? itv.it_value.tv_sec = 1; ?? itv.it_value.tv_usec = 0;
?? setitimer(ITIMER_REAL, &itv, &oldtv); ?? } ??
?? void signal_handler(int m) ?? {
?? count ++;
?? printf(\, count); ?? } ??
?? int main() ?? {
?? signal(SIGALRM, signal_handler); ?? set_timer();
?? while(count < 10000); ?? exit(0); ?? return 1; ?? }
?? (gdb) bt
?? #0 signal_handler(m=14) at code.c: 23 ?? #1
?? #include
ncopy
软件英才网 软件行业驰名招聘网站
?? #include
?? void SignalHandler(int signal) ?? {
?? printf(\); ?? } ??
?? int main() ?? {
?? typedef void (*SignalHandlerPointer)(int); ??
?? SignalHandlerPointer previousHandler;
?? previousHandler = signal(SIGINT, SignalHandler); ??? while(1) ??? {
??? Sleep(0); ??? } ???
??? exit(1); ??? }
下面,我们首先编译这一段代码。接着在程序run之后,我们可以在SignalHandler之处设置一个断点。一切就绪完毕,再按下ctrl+c之后,系统就会在SignalHandler之处断住。此时单击【Debug】-> 【Threads】,就可以看到这个情况。
相信看到这里,大家应该看明白了。其实在Windows下面,信号是专门有一个线程来完成的,和原来的main函数不是同一个线程。既然线程都不是一样的,而中断本身是必须在一个thread中完成的。我们怎么能利用windows来仿真cpu的中断处理流程呢。
有需要请联系我们
正在阅读:
嵌入式操作系统内核原理和开发(中断) -09-15
电渣压力焊的一些要求11-06
怎样排列顺序错乱的句子练习及答案08-28
《现代汉语通论》语法 课后作业答案05-04
参观博物馆作文500字07-14
租房合同模板大全03-24
中医治未病工作计划03-28
- 梳理《史记》素材,为作文添彩
- 2012呼和浩特驾照模拟考试B2车型试题
- 关于全面推进施工现场标准化管理实施的通知(红头文件)
- 江西省房屋建筑和市政基础设施工程施工招标文件范本
- 律师与公证制度第2阶段练习题
- 2019-2020年最新人教版PEP初三英语九年级上册精编单元练习unit6训练测试卷内含听力文件及听力原文
- 小升初数学模拟试卷(十四) 北京版 Word版,含答案
- 认识创新思维特点 探讨创新教育方法-精选教育文档
- 00266 自考 社会心理学一(复习题大全)
- 多媒体在语文教学中的运用效果
- 派出所派出所教导员述职报告
- 低压电工作业考试B
- 18秋福建师范大学《管理心理学》在线作业一4
- 中国铝业公司职工违规违纪处分暂行规定
- 13建筑力学复习题(答案)
- 2008年新密市师德征文获奖名单 - 图文
- 保安员培训考试题库(附答案)
- 银川市贺兰一中一模试卷
- 2011—2017年新课标全国卷2文科数学试题分类汇编 - 1.集合
- 湖北省襄阳市第五中学届高三生物五月模拟考试试题一
- 内核
- 嵌入式
- 中断
- 原理
- 操作系统
- 开发
- ArchiCAD小技巧
- 试卷正文
- 物理:4.2《探究电磁感应的产生条件》教案(新人教版选修3-2)
- 中国史学史复习
- 世博知识以及文明观博问答题+答案
- 2017-2018学年人教版新目标初中英语七年级上册期末复习全册全套课课练及答案
- 复旦大学体育理论考试体育题库
- 暨南大学经济学考研试题
- 《直线与平面垂直的判定定理》教学设计
- 《孔雀东南飞》第二课时学生导学案
- 幼儿园家长安全知识竞赛题及参考答案
- 中小继教学习计划2011年度
- 漳州职业技术学院学生干部选拔、培养、任用及管理规定
- 音乐喷泉施工方案 - 图文
- 中国房地产各阶段发展史(非常详细)
- 自控原理课程设计
- (共21套)新人教版九年级化学上册(全册)课时练习 同步练习题汇总+各章思维导图
- 初级会计电算化 练习题及答案 第六章 其他核算子系统
- 节约型园林绿化建设研究
- 大班幼儿彩泥活动中教师指导策略的研究详解