1、拜访肯定地址的内存方位:
#define pISR_EINT0 (*(unsigned *) (_ISR_STRATADDRESS+0x74))
上述句子把无符号整数_ISR_STRATADDRESS+0x74强制转化为指针,指向RAM,用下面的句子可以拜访它:
pISR_EINT0 = (int)Eint0_ISR
为了拜访一个肯定地址,把一个整形数强制转化(typecast)为一指针。
2、__irq:
为了方便运用高档言语编写反常处理函数,ARM编译器对反常处理函数做了特定扩展,只需运用关键字_irq,这样编译出来的函数就满意反常响应对现场维护和康复的需求;
3、编写中止服务程序的一些基本准则:
√防止在中止服务程序中做浮点运算:好的终端读物程序应该遵从矮小有用这一准则,在中止服务程序中做浮点运算大大违反这一准则,一起有些处理器/编译器便是不允许在中止服务程序中做浮点运算;
√中止服务程序不能有回来值:所以中止服务程序都界说为回来类型为void,即:void _irq Eint0_ISR(void);
√中止服务函数不能传递参数:故参数列表为void,即:void _irq Eint0_ISR(void);
4、Static:
一个static变量,其实便是全局变量,只不过它有效果域,它可用于保存变量地点函数被类此调用期间的中间状态,比方:
int cCout()
{
Static int loop = 0;
…….
loop++;
…….
}
loop变量的值会跟随着函数的调用次数而递加,函数退出后,loop的值还存在,仅仅loop只能在函数中才干被拜访(函数效果域),而loop的内存空间也只会在函数第一次被调用时才会被分配和初始化,今后每次进入函数,都不为static分配了,而直接运用上一次的值。在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,模块外其它函数无权拜访,是一个本地全局变量。
5、Constant:
将一个变量或目标界说成constant类型,则界说之后不能被更新(可读不可写),即在界说或阐明类型时有必要给他一个初始值。
几种需求留意的当地:
√假如const坐落星号(*)的左边,则const润饰指针所指向的变量,即指针指向常量;如:const int *a; 或int const *a;这两种状况相同(cost放在变量声明符的方位无关),指针指向一个常量,此刻不能对内容进行更改,即不能有写操作句子*a=3;
√假如cost坐落类型的右侧,cost便是润饰指针自身,即指针自身是常量;如:int* const a;句子表明指针自身是常量,所指向内容不是常量,即a++是过错的。
√假如星号左右侧都有const润饰,如:const int* const a;表明指针自身和指针指向的内容均为常量。
6.、Volatile:
界说一个易失性变量,编译器有一种技能叫数据流剖析,剖析程序中的变量在哪里被赋值、在哪里运用、在哪里失效,剖析成果可以用于常量兼并,常量传达等优化。当编译器检查到代码没有修正字段的值,就有或许在你拜访字段时供给前次拜访的缓存值,这可以进步程序的功率,但有时这些优化会带来问题,不是咱们程序所需求的,特点是对硬件寄存器操作的程序,这时可以用volatile关键字制止做这些优化。
运用volatile变量的场合:
√硬件寄存器一般要加volatile阐明,由于每次对它的读写都或许有不同的含义;
√在中止服务程序中修正的供其他程序检测用的变量需求加volatile声明;不然编译器或许对变量更新一次后每次都运用缓存值不再当即更新;
√多使命环境下各使命间同享的标志应该加voatile关键字:在多线程拜访某字段时,代码期望这些拜访可以操作到操作(读取)到字段的最新值,一起写到变量的操作能当即更新;对字段加上volatile关键字,那么对该字段的任何恳求(读/写)都会马上得到履行。