【发布时间】: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