===《C/C++笔记》===嵌入式编程
来源:互联网 发布:应届毕业生招聘软件 编辑:程序博客网 时间:2024/06/06 17:58
1>.ISR-中断服务子程序
让标准C支持中断具代表事实是,产生了一个新的关键字 __interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR)
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
此代码包含的错误为:
1) ISR 不能返回一个值。
2) ISR 不能传递参数。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf经常有重入和性能上的问题。所以一般不使用printf();
2>. 中断活动的全过程大致为:
1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务
2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);
3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序
4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;
5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;
6、中断处理:开始对查明的中断源进行有针对性的中断服务;
7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;
8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;
9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作。
3>volatile关键字
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
使用该关键字的例子如下:
int volatile nVint;
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
例如:
volatile int i=10;int a = i;...//其他代码,并未明确告诉编译器,对i进行过操作int b = i;
volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。
《详见:http://blog.csdn.net/tigerjibo/article/details/7427366 》
volatile变量的几个例子如下:
并行设备的硬件寄存器(如状态寄存器)、一个中断服务子程序中会访问到的非自动变量、多线程应用中被几个任务共享的变量。
一个参数可以既是const又是volatile,例如只读的状态寄存器,他是volatile,因为它可能被意想不到的改变;他又是const,因为程序员不应该试图去修改它
一个指针可以是volatile,例如当一个中断服务子程序修改一个指向buffer的指针时。
- ===《C/C++笔记》===嵌入式编程
- Linux c==嵌入式文件编程(1)
- Linux c==嵌入式文件编程(2)
- 嵌入式C编程要点
- 嵌入式C编程基础
- 嵌入式C编程小结
- 嵌入式C编程
- 嵌入式C编程规范
- 嵌入式C语言编程
- C语言嵌入式编程
- 嵌入式Linux C编程
- C/C+= 符号类型
- C语言嵌入式系统编程修炼--阅读笔记
- 嵌入式linux学习笔记之c编程基础
- 嵌入式C高质量编程培训心得笔记
- 嵌入式软件开发培训笔记——c编程基础
- 嵌入式学习笔记(第七天)c基础编程
- [C/C++/嵌入式]嵌入式C编程的风格规范
- 网页色彩的搭配方法及原则
- DOS下创建、删除文件的几种方法
- java 加密解密源码
- Triangular numbers
- 在mac os x 上安装apache2
- ===《C/C++笔记》===嵌入式编程
- 什么是IDOC,以及IDOC的步骤
- 开发和常用工具推荐清单
- 虫趣:不同模块对同一变量类型的不同定义
- c++中double转换成string型(浮点数的格式化)(转)
- PCB板层简介
- Qt:截屏软件的实现
- WaitForSingleObject、WaitForMultipleObjects、CreateThread .
- Codeforces Beta Round #1 / 1A Theatre Square (简单数学)