原创
MCU应用第007篇 C程序对中断服务程序的标记
C程序要借助一些指示性的“黑话”,才能使C编译器知道该如何处理。
例:南京沁恒RV32编译器
void Example_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
为什么这样?
中断服务程序是一个函数,编写语法跟普通函数无异。
中断服务程序跟普通函数的差别是调用和返回的细节。一般来说,程序的主干是时间顺序执行的代码,而中断服务会抢走PC指针,暂停主干程序。为了在中断服务完成后程序主干能够恢复到之前的位置,进入中断服务之前,程序主干要做标记(保存现场),在退出中断服务程序时,程序主干要读取之前的标记(恢复现场)。
处理器从硬件和程序两方面支持这种“备忘”机制。硬件设计了栈(Stack,一组RAM),栈指针(Stack Pointer, SP)。机器码有指令:标记(压栈),恢复标记(退栈)。
汇编语言有对应栈操作的命令,在调用汇编函数前后使用,即可区别于一般函数。
C语言程序员更关注函数的功能,不需要关注函数的进入和退出,为此才需要特殊的编译器指令(例如__attribute__)来告诉C编译器,其声明的函数不是一个普通函数,需要处理栈。
作者: 电子知识打边炉, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-4061550.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论