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.

[参考译文] CCS/AM3359:中断问题

Guru**** 2563960 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/604283/ccs-am3359-problem-with-interrupts

器件型号:AM3359

工具/软件:Code Composer Studio

大家好、

通过 CCS 和入门软件对 BeagleBone Black 进行即时编程。 现在、我尝试使外部中断正常工作、但遇到了一些更大的问题。

我正在使用 GNU 编译器和一个空 CSS 工程、该工程在工程空间中生成 main.c 和 startup_arMCA8.S 文件。

我在这个(https://e2e.ti.com/support/embedded/starterware/f/790/t/184282)示例中对所有内容进行了编程、但没有成功... 当我触发中断时、程序计数器会跳转到某个位置、但我的 ISR 不会执行。 (我无法说出它到底会跳到哪里、因为在调试配置中、即使在源代码步进时启用中断、当我执行源步进时、中断也不会被触发)

现在我正在搜索导致这种行为的原因、我想知道一件事:在 interrupt.c 中、有一个数组(fnRAMVectors) ISR 的 Get 寄存器所在。 该数组不是再次提到的代码中的任何其他位置。 此数组的基址为0x80038000。 那么、我是否错了、或者我是否必须对这个数组进行一些调整才能到达我的中断函数(也许可以通过某种方式调整它的地址或引用)?

我希望有人能在这里帮助我。

此致

Christian

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

    Christian、

    在将 BBB 示例支持添加到 AM335x 的 Processor SDK RTOS 包之前、该线程中的示例似乎已被拼凑在一起。 您可能应该查看一个 GPIO 示例、看看它是否能为您提供更干净的中断实现。

    如果您不熟悉 RTOS 示例、它们还具有示例的裸机类型。 安装位置 为 http://software-dl.ti.com/processor-sdk-rtos/esd/AM335X/latest/index_FDS.html

    示例位于 C:\ti\pdk_am335x_1_0_7\packages\MyExampleProjects\GPIO_LedBlink_bbbAM335x_armTestProject

    请注意、您必须运行 pdkprojectcreate.bat 文件才能创建这些示例。 有关说明,请访问:

    http://processors.wiki.ti.com/index.php/Processor_SDK_RTOS_Software_Developer_Guide

    http://processors.wiki.ti.com/index.php/Rebuilding_The_PDK 

    我希望您可以将此示例作为一个干净的起点。

    Lali

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

    Lalindra、您好、感谢您的回复!

    我熟悉 GPIO 的 RTOS 实现方案、实际上我已经有中断与 RTOS 配合使用、但我的应用程序是通过 SPI 进行非常严格的时间采样、我尝试尽可能缩短中断延迟。 RTOS 管理的中断会减慢速度、这就是我要在第一步中使用启动器件实现的原因。

    我认为、对于我的 GPIO 定义、一切都很好。 我可以关闭 LED、读取中的引脚值、甚至我的中断也可以在正确的寄存器中触发正确的值。 程序计数器不会跳转到我的 ISR (或者至少它看起来是这样)。

    我希望有人遇到类似的问题、并能帮助我解决这个问题。

    还有以下主题(e2e.ti.com/.../242268) ,其中计时器中断存在类似的问题。 他们通过修改一些.cmd 文件来解决这个问题。 我认为这不是没有 GNU 编译器的、因为我的程序只有一个.lds 文件

    这是我的确切代码(可能也有帮助)。

    #include "SoC_AM335x.h"
    #include "interrupt.h"
    #include "BeagleBone.h"
    #include "GPIO_own .h"
    #include "pin_mux.h"
    #include "hw_control_AM335x.h"
    
    静态空 gpio1Isr (void)
    {
    //清除中断
    GPIOPinIntClear (SOC_GPIO_0_regs、0、14);
    GPIOPinIntClear (SOC_GPIO_0_regs、1、14);
    
    while (true);//如果中断被触发、则死循环捕获 PC
    
    GPIOPinIntEnable (SOC_GPIO_0_regs、0、14);
    GPIOPinIntEnable (SOC_GPIO_0_regs、1、14);
    GPIOPinIntWakeUpEnable (SOC_GPIO_0_regs、0、14);
    }
    
    int main (void)
    {
    //为 GPIO1实例启用功能时钟。 *
    GPIO0ModuleClkConfig();
    GPIO1ModuleClkConfig();
    
    /*启用 GPIO 模块0。 *
    GPIOModuleEnable (SOC_GPIO_0_regs);
    GPIOModuleReset (SOC_GPIO_0_regs);
    
    /*启用 GPIO 模块1. *
    GPIOModuleEnable (SOC_GPIO_1_regs);
    GPIOModuleReset (SOC_GPIO_1_regs);
    
    
    GpioPinMuxSetup (GPIO_1_22、CONTACT_CONF_MUXMODE (7));//用户 LED 1.
    GpioPinMuxSetup (GPIO_1_23、CONTACT_CONF_MUXMODE (7));//用户 LED 2.
    GpioPinMuxSetup (GPIO_1_24、CONTACT_CONF_MUXMODE (7));//用户 LED 3.
    
    
    GpioPinMuxSetup (GPIO_0_14、CONTRAL_CONF_GPMC_AD_CONF_GPMC_AD_RXACTIVE|0<<CONTROL_CONF_GPMC_AD_CONF_GPMC_AD_PUDEN_SHIFT|1< 
    

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

    我设法用中断进行调试、并获得了一些新信息(但无法解决问题)

    在中、生成的 STARTUP_ARMCA8.S 是以下汇编指令

    .section .ISR_vector
    对齐4.
    .globl __ISR_vector
    __ISR_vector:
    LDR PC、[PC、#24] @ 0x00复位
    LDR PC、[PC、#-8] @ 0x04未定义指令
    LDR PC、[PC、#24] @ 0x08主管呼叫
    LDR PC、[PC、#-8] @ 0x0C 预取中止
    LDR PC、[PC、#-8] @ 0x10数据中止
    LDR PC、[PC、#-8] @ 0x14未使用
    LDR PC、[PC、#-8] @ 0x18 IRQ 中断
    LDR PC、[PC、#-8] @ 0x1C FIQ 中断
    长入口
    长整型0
    .long SVC_Handler
    长整型0
    长整型0
    长整型0
    长整型0
    长整型0 

    当触发中断时、PC 跳转到偏移量为0x18的指令(我认为这是一个无限循环(LDR PC、[PC、#-8]))、以便它捕获在该指令中。 如果我将其修改为 LDR PC、[PC、#16]我可以加载与 SVC_Handler 类似的 ISR_handler 的地址。 在 exceptionhandler.S 文件中是一个带有保存和恢复上下文指令的 ISR_handler、以及一个 INTCCommonIntrHandler 的调用。

    现在、缺少执行我自己用 C 编写的 ISR 所需执行的操作?

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

    您好、Christian、

    我在尝试使用 BeagleBone White 中的 dmtimer 中断时遇到了同样的问题。

    我找到的权变措施是删除 STARTUP_ARMCA8.S!  相反、我使用了 starterware 中 system_config 文件夹下的文件、例如 startup.c 文件。 不过、请确保在此文件夹中使用的文件中、选择不适用于 CGT 编译器但适用于 gcc 的文件。

    老实说、之后我还遇到了一些问题、比如一些与 init.S 文件相关的编译错误以及一些与链接器标志相关的问题、这些问题是必要的、但最终是为我解决的。

    因此、由于您的代码在我看来似乎调用了正确的函数(一段时间后、我将与我的函数进行比较、以防我的某些操作漏掉我的注意力、或者如果我做了一些我现在不记得的操作)、 我建议您尝试从 starterware 的 system_config 文件夹中包含 interrupt.c、startup.c、init.S 等、并删除 startup_armca8.S 除非有人指出应进行哪些更改...

    哦、出于好奇、您如何设法进行调试?当我遇到问题时、我甚至找不到 BeagleBone 的"停滞"位置...

    希望它能有所帮助、祝您好运

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

    为了对其进行调试、它有助于处理外部中断。 我只需在 CCS 中使用始终激活的中断来设置调试模式。 然后、我暂停执行并按下中断按钮。 之后、我执行了汇编步进、程序计数器跳转到中断地址...

    我找到了一些时间来包含 startup.c 和 init.S (我认为它们基本上就是这样-但我已经有了用于 MMU 功能的其他文件)现在我认为我面临的问题与您相同。 编译器似乎错过了 init.S 文件中使用的一些地址、如"=_BSS_start"或"=_stack"。 是否有 LIKER 脚本来定义它们? 如果您仍有适合您的 LIKER 脚本、这将会对我大有帮助。
    感谢您的回复、我认为我的回答是正确的...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好吧,我觉得我已经明白了!
    我更改了链接器文件中的以下内容

    更改了提供(__stack =__StackTop);以提供(_stack =__StackTop);(请注意下划线)

    在.bss 下添加了以下行:{...}
    提供(_BSS_START =__bSS_START__);
    提供(_bss_end =__bss_end__);

    我希望 TI 能立即提供正确的文件、而不是放置在无限循环中的空中断处理程序。 设置 CCS 以便进行裸机编程并不是很方便。 (也许我被 PSoC 创造者宠坏了:-))

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

    您好、

    我很高兴您找到了解决方案!

    实际上、我认为我的权变措施是在链接器文件中的每个位置的 bss_start/end_前面添加一个下划线。。。我希望它是对的。至少这有助于我克服构建错误。