RISC-V编译器中__attribute__ ((interrupt))是否有用?编译影响探讨
针对RISC-V编译器,
__attribute__ ((interrupt))是否有实际用途? 在**较新版本的RISC-V GCC编译器(GCC 10及以后)**中,这个属性是有实际作用的,并非无效。
你查阅的旧版GCC(4.7.2)文档里确实没把RISC-V列入支持interrupt属性的架构列表,但后续GCC版本已经补全了对RISC-V的支持。当你给函数加上__attribute__ ((interrupt))时,编译器会做这些关键处理:
- 自动保存和恢复所有被调用者保存寄存器(普通函数只需要保存部分寄存器),符合RISC-V中断上下文的保护要求
- 中断函数的结尾会用特权级返回指令(比如
mret、sret)替代普通函数的ret指令,适配不同特权级的中断返回逻辑 - 还可以通过参数指定特权级,比如
__attribute__ ((interrupt("machine")))或__attribute__ ((interrupt("supervisor"))),编译器会生成对应特权级的返回代码
如果使用的是低于GCC 10的旧版RISC-V编译器,这个属性大概率会被编译器忽略,此时你需要手动编写寄存器保存、恢复以及返回指令的逻辑来实现正确的中断处理。
内容的提问来源于stack exchange,提问作者Guillaume D
相关产品推荐
相关产品推荐

