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.

[参考译文] Compiler/TM4C1294NCPDT:Interrupt关键字及其用法

Guru**** 2551110 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/582851/compiler-tm4c1294ncpdt-interrupt-keyword-and-its-usage

零件号:TM4C1294NCPDT

工具/软件:TI C/C++编译器

大家好,

我一直在研究TI C++编译器,当我发现关键字“interrupt”以及它应该用于声明中断服务例程这一事实时。

我的应用程序是在C++下开发的,大多数时候,我使用静态类成员函数来抓取中断(它们被放置在中断向量表中),似乎一切都正常。 有人能解释一下,使用此关键字的优缺点是什么? 为什么我的代码在没有它的情况下工作...

此致,

Norbert

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

    总之,您很幸运。  您确实需要使用interrupt关键字。

    主要区别在于登记公约。  正常函数不会保留每个已修改的寄存器。  登记册惯例只要求保留某些登记册。  其他寄存器可以修改而不能保留,因为根据惯例,调用函数的点期望这些寄存器发生变化。  另一方面,需要中断函数来保留每个被修改的寄存器。  我不知道你如何避免这里的问题。  运气必须是其中的一部分。  我不是ARM架构的专家。  当发生中断时,某些寄存器可能会自动保留,而您的中断函数只使用这些寄存器。

    谢谢,此致,

    -George

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

    您好,

    我可以接受您的回答,但在这种情况下,有几件事我不理解。

    1. 我使用TivaWare提供的FreeRTOS。 它需要以下3个处理程序。 工作。 前两个是用ASM写的,但我看不到任何'r' register saving语句,第三个是用C写的,没有"interrupt"关键字。
      1. vPortSVCHandler();
      2. xPortPendSVHandler();
      3. xPortSysTickHandler()
    2. 我也使用LwIP堆栈,它也来自TivaWare,它的中断处理程序也保持不变,没有"中断"修饰符。

    您能帮助/解释我理解这些观察结果吗? 我想了解这个关键字的方式或缺失。

    此致,

    Norbert

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

    interrupt关键字适用于由CPU直接向量化的中断例程,而无需与操作系统或RTOS (如FreeRTOS)进行任何交互。  如果您使用FreeRTOS,则需要遵循其有关中断例程的文档。  您可能不应使用interrupt关键字。  我知道SYS/BIOS调用的中断就是这样。

    谢谢,此致,

    -George

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

    为什么我的代码不使用它也能正常工作...

       Cortex-M4设备通用用户指南中的例外条目和返回部分显示整数寄存 器xPSR, PC, LR, R12, R3, 出现  异常时,处理器将R2,R1和R0推入堆栈(中断处理程序)。  使用浮点例程时,Cortex-M4处理器会自动堆叠异常条目上的架构浮点状态。  

      TI ARM优化C/C++编译器用户指南的“寄存器惯例”部分显示寄存器R0,R1,R2,R3和R12由调用函数保留,而其它寄存器由子函数保留。

    由于在异常条目时Cortex-M4处理器会自动推送C编译器要求由调用函数保留的寄存器,这解释了为什么在Cortex-M4上不需要在中断服务例程中使用"interrupt (中断)"关键字。