让软件中断在裸机Beaglebone Black中工作

时间:2013-10-31 22:22:26

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

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

2 个答案:

答案 0 :(得分:1)

如果您正在进行裸骨编程,那么您可以将asm启动代码重写为NOT进入用户模式并保持SVC模式。

答案 1 :(得分:0)

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

  

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

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