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.

[参考译文] MSP430F5438A:将 ISR 函数放入仅包含 ISR 函数的源文件中时、如何使 ISR 按预期工作?

Guru**** 2539520 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1006088/msp430f5438a-how-to-make-the-isr-work-as-expected-when-put-the-isr-functions-in-a-source-file-which-only-include-the-isr-functions

器件型号:MSP430F5438A

我想在 CMake 项目中将 ISR 函数放入一个单独的 TimerIrq.cpp 文件中(仅包括 ISR 函数):

TimerIrq.cpp:

外部硬件::TimerDrv *gTimerDrv;

//
//
//这是 Timer0_B0中断矢量服务例程。
//
//
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_B0_VECTOR
_interrupt
#Elif defined (_GNU_)
__attribute__((interrupt (TIMER0_B0_vector)))
#endif
void tick_timer_interrupt (void)

gTimerDrv->TickInterruptCallback();

//用于调度的唤醒
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS + GIE);

------------------------------------------------------

makeLists:

add_library (hwihmsketch 静态"")

Target_Sources (hwihmsketch
私有
AdcDrv.cpp
ClockDrv.cpp
DigitalPinDrv.cpp
SpiDrv.cpp
TimerDrv.cpp
WatchDogDrv.cpp
LowLevelFactory.cpp
TimerIrq.cpp
)

Target_Link_libraries (hwihmsketch
私有
TI::msp430lib
)

add_library (HW::ifmsketch 别名 hwihmsketch)

------------------------------------------------------------------

它可以按预期进行编译、但从未触发 ISR。

如果我将 ISR 函数放在另一个 TimerDrv.cpp 文件中、该文件提供计时器配置函数并具有 TimerDrv.h 头文件、则可以按预期触发。

我知道有一种解决方案是将"TimerDrv.cpp"文件中的"TimerIrq.cpp"文件包含在内、但我不喜欢这种方法(很丑)、是否有任何其他解决  方案可以保持"TimerIrq.cpp"并按预期触发 ISR?

非常感谢!

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

    您是否在其他源文件中配置了计时器? 如果不是、则无法触发计时器中断。

    如果是、您可以跟踪代码以查看计时器是否正确配置以及是否启用了中断。

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

    是的、我已经配置了计时器、正如我说过的、如果我将 ISR 函数放在 TimerDrv.cpp 中、则可以按预期触发中断、但是如果我将 ISR 函数单独放入 TimerIsr.cpp 中、则不会触发该中断。

    我在以下链接中找到了一些线索:

    如何在其他 C 文件中使用 MSP430中断- MSP 低功耗微控制器论坛- MSP 低功耗微控制器- TI E2E 支持论坛

    据说:

    因此、通常情况下、ISR 应放置在与启用其使用的代码相同的源文件中。 如果包含此代码、还意味着同一源文件中的任何全局变量或引用也将包含在内、因此无论 ISR 是否在库中、都将包含在内。
    如果项目未使用启用中断的代码、则无需包含 ISR。 )

    然而,我并不是很相信,如果有的话,我试图找到其他解决办法,谢谢!

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

    是的。 这是来自 CCS 编译器团队的答案。 我认为它们是正确的。 我同意最后的意见:

    "仅当从工程文件引用库代码时、才会包含库代码。 已包含的代码未引用的任何内容都将被忽略、包括 #pragma 生成的引用。"

    因此、如果没有全局变量或在与 ISR 相同的文件中使用 interrupt 使能代码、则 ISR 将被链接器忽略。

    谢谢、

    Lixin

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

    好的、然后我确认了、谢谢!