Board logo

标题: ARM 汇编器对C的扩展 [打印本页]

作者: yuchengze    时间: 2017-6-23 23:21     标题: ARM 汇编器对C的扩展

__swi void ledtest(); //:声明 edtest 是个软中断。
__asm 内嵌汇编 //:通常在C程序里面需要嵌入汇编代码,这是就可以用__asm关键字来指示编译器下面的代码是用汇编语言来写的,
__inline 定义内联函数 //:就像在C语言中用define定义宏一样,用__inline关键字定义的函数在调用的地方被展开,这主要就是为了解决频繁的函数调用开销过大的问题,如果用__inline关键字定义的函数过大,每个调用函数的地方都会将其展开,这样的话在一定程度上也增加代码量,所以说一般用__inline 定义的函数代码量并不是很大。
由于在C语言中无法直接访问COSR, 因此需要通过嵌入式汇编语言来将CPSR 中I位清零,此外,访问CPSR 还需要专门的程序状态寄存器访问MSR MRS 来实现。
用如下代码实现开中断:
__inline void irq_enable(void) //用关键字__inline 声明内联函数irq_enable()
{
int val;              //定义临时变量保存CPSR 的值
__asm              //关键字告诉编译器下面的代码是用汇编语言写的
{
mrs val,cpsr            //用mrs指令将程序状态寄存器cpsr中的值读入到val
bic val,val,#0x80          //用BIC指令将val中第7位(I位)清0
msr cpsr_c,val          //用MSR指令将val 的值写入到cpsr 此时I位已经清零 即开中断。
}
}
下面的函数实现的是关中断:
__inline void irq_disable(void) //用关键字__inline 声明内联函数irq_enable()
{
int val;              //定义临时变量保存CPSR 的值
__asm              //关键字告诉编译器下面的代码是用汇编语言写的
{
mrs val,cpsr            //用mrs指令将程序状态寄存器cpsr中的值读入到val
orr val,val,#0x80          //用BIC指令将val中第7位(I位)清0
msr cpsr_c,val          //用MSR指令将val 的值写入到cpsr 此时I位已经清零 即开中断。
}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0