This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430FR5969:使用__BIC_SR_REGISTER_ON_EXIT "Outside "ISR

Guru**** 2611705 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/647011/compiler-msp430fr5969-using-__bic_sr_register_on_exit-outside-isr

器件型号:MSP430FR5969

工具/软件: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 编辑器、这是一场使用的噩梦... 标签。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于使用内在函 数__BIC_SR_REGISTER_ON_EXIT,严格限制了它只能在中断函数内使用。  有关更多详细信息、请参阅 此论坛主题中的讨论

    谢谢、此致、

    乔治