获取软件中断在裸机中工作 小猎骨黑.

Getting software interrupts working in bare metal Beaglebone Black

本文关键字:工作 软件中断 裸机 获取      更新时间:2023-10-16

我正在使用CCS 5.5来编程Beaglebone Black。 我可以成功地启动并运行JTAG。

我现在正在尝试开始闪烁 LED。 为此,我需要配置 GPIO1。 在尝试配置此端口时,我发现 TI 的 C 运行时立即进入用户模式(启动后 4 条指令)。 当我尝试读取或写入控制内存位置时,我收到一个错误,我们认为这是由于未处于监控模式引起的。

为了进入主管模式,我正在尝试编写一个软件中断处理程序,然后从那里进行必要的配置。 我可以编写处理程序,并且可以main()调用软件中断,但我正在努力让我的中断处理程序实际工作。

#pragma SWI_ALIAS(7);
int function(int i);
#pragma INTERRUPT(SWI);
int function(int i)
{
    return i + 1;
}
int main(void) {
    int i = function(5);
    while(1);
}

正如我所期望的那样,对function的调用会在反汇编中产生SWI 7,但从未调用function。 我写了一个intvecs.asm文件,但这没有帮助。

    .global _c_int00
    .global _Z8functioni
    .retain ".intvecs"
    .sect ".intvecs"
    B _c_int00 ; reset interrupt
    .word 0 ; undefined instruction interrupt
    B _Z8functioni ; software interrupt
    .word 0 ; abort (prefetch) interrupt
    .word 0 ; abort (data) interrupt
    .word 0 ; reserved
    .word 0 ; IRQ interrupt
    .word 0 ; FIQ interrupt

我将不胜感激有关如何使其工作的任何建议。


看来 CCS 5.5 附带的 .gel 文件实际上不允许写入 0x00000000,据我了解,这是中断向量的位置。 所以JTAG适配器没有更新中断向量。

如果您正在执行裸机编程,则可以重写 asm 启动代码以不进入用户模式并保持在 SVC 模式。

我终于在技术参考手册的第 26.1.3.2 节公共 RAM 内存映射中找到了以下段落:

RAM 异常向量提供了一种简单的重定向方法 自定义处理程序的例外。表 26-3 显示了 RAM 的内容 为 RAM 矢量保留的空间。前七个地址是 ARM 加载位于后续七个中的值的指令 地址进入PC寄存器。这些指令在以下情况下执行 发生异常,因为它们是从 ROM 异常调用的 向量。未定义、SWI、未使用和 FIQ 异常被重定向到 硬编码死循环。预取中止、数据中止和 IRQ 异常 被重定向到预定义的 ROM 处理程序。用户代码可以重定向任何 自定义处理程序的异常,方法是将其地址写入 从 4030CE24h 到 4030CE3Ch 的适当位置,或通过覆盖 地址之间的分支(加载到PC)指令从4030CE04h到4030CE04h之间 4030CE1Ch.

此微型上的异常处理程序表的基础是0x4030CE24,而不是 ARM 手册中指示的0x00000000或0xffff0000。