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