__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位已经清零 即开中断。
}
}
上一篇:ARM 之FIQ(快速中断) IRQ(中断)
下一篇:ARM的两种启动方式 (NAND FLASH. NOR FLASH)
推荐阅读最新更新时间:2024-03-16 15:27