您的位置 首页 芯闻

ARM内存地址拜访

1、访问绝对地址的内存位置:#definepISR_EINT0(*(unsigned*)(_ISR_STRATADDRESS+0x74))上述语句把无符号整数_ISR_STRATADDRES…

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关键字,那么对该字段的任何恳求(读/写)都会马上得到履行。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/274971.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部