【问题标题】:Getting software interrupts working in bare metal Beaglebone Black让软件中断在裸机 Beaglebone Black 中工作
【发布时间】:2013-10-31 22:22:25
【问题描述】:

我正在使用 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 适配器没有更新中断向量。

【问题讨论】:

  • 链接器实际放置在 0x00000000 的位置是什么?您可以发布链接器文件的片段吗?还是反汇编内存范围 0-0x40 ?正如您似乎猜到的那样,我敢打赌 SWI ISR 正在被调用,但您的中断向量没有正确放置。

标签: c++ c beagleboard beagleboneblack code-composer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我终于在技术参考手册中找到,在第 26.1.3.2 节公共 RAM 内存映射中,如下一段:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2015-01-09
      • 2014-09-19
      相关资源
      最近更新 更多