工具/软件:TI C/C++编译器
是否有方法告诉编译器、只能从 ISR 中调用函数?
我在将仅从 ISR 调用的内联函数(在 ISR 之外的其他源代码文件中定义)中获取仅在中断例程中可用的错误"#1358 intrinsic (__BIC_SR_REGISTER_ON_EXIT)"。
背景:
我有一个相当大的应用程序、它的端口 ISR 分布在所有源代码文件上。 因此、我决定将它们合并到一个 port_interrupt_routines.c 文件中是一个好主意。
现在、我可以在一个位置记录所有 GPIO。
ISR 本身被剥离到 switch 语句中、并调用在其他源文件中定义的内联 interrupt_handler 函数。
如下所示:
PORT_ISR_routines.c 文件:
#include "sx1276_driver.h" #include "misc.h" //---------------------------------------------- /*端口1映射 * * P1.0:在 GPIO1 中* P1.3:在 Lora_DIO0 中* 其他引脚用于模块功能。 // #pragma vector=Port1_vector __interrupt void port1_ISR (void) { switch (__evo_in_range (P1IV、P1IV_P1IFG7)) { 案例 P1IV_NONE:break; 案例 P1IV_P1IFG0: _MISC_INTERRUPT_Handler(); 中断; 案例 P1IV_P1IFG1:中断; 案例 P1IV_P1IFG2:中断; 案例 P1IV_P1IFG3: _Lora_Rx_interrupt_handler (); 中断; 案例 P1IV_P1IFG4:中断; 案例 P1IV_P1IFG5:中断; 案例 P1IV_P1IFG6:中断; 案例 P1IV_P1IFG7:中断; } }
sx1276_driver.c 文件:
//此处的一些代码[...] 内联 void _Lora_Rx_interrupt_handler (void) { //[...] IF (满足唤醒条件) LPM2_EXIT; //[...] }
可能的解决方法:
如果中断处理程序函数希望 ISR 结束 LPM、则让它们返回一个特定的值、如果看到该值、则让 ISR 调用 LPM2_EXIT。
类似的东西
内联 uint8_t _interrupt_handler (void) { IF (满足唤醒条件) 返回1U; }
然后在实际端口 ISR 中:
port_isr_function () { uint8_t 结果; 开关(foo) { 案例栏: 结果=_interrupt_handler (); //执行其他操作 } IF (结果) LPM2_EXIT ;}
(TI 请修复 WYSIWYG 编辑器、这是一场使用的噩梦... 标签。)