首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM 汇编器对C的扩展

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位已经清零 即开中断。
}
返回列表