2

我正在使用 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生产,但从未被调用。我写了一个 intvecs.asm 文件,但这没有帮助。SWI 7function

    .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 适配器不会更新中断向量。

4

2 回答 2

1

如果您正在做准系统编程,那么您可以重写 asm 启动代码以不进入用户模式并保持在 SVC 模式。

于 2013-11-07T07:40:57.613 回答
0

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

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

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

于 2013-11-07T16:00:18.403 回答