获取软件中断在裸机中工作 小猎骨黑.
Getting software interrupts working in bare metal Beaglebone Black
我正在使用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适配器没有更新中断向量。
如果您正在执行裸机编程,则可以重写 asm 启动代码以不进入用户模式并保持在 SVC 模式。
我终于在技术参考手册的第 26.1.3.2 节公共 RAM 内存映射中找到了以下段落:
RAM 异常向量提供了一种简单的重定向方法 自定义处理程序的例外。表 26-3 显示了 RAM 的内容 为 RAM 矢量保留的空间。前七个地址是 ARM 加载位于后续七个中的值的指令 地址进入PC寄存器。这些指令在以下情况下执行 发生异常,因为它们是从 ROM 异常调用的 向量。未定义、SWI、未使用和 FIQ 异常被重定向到 硬编码死循环。预取中止、数据中止和 IRQ 异常 被重定向到预定义的 ROM 处理程序。用户代码可以重定向任何 自定义处理程序的异常,方法是将其地址写入 从 4030CE24h 到 4030CE3Ch 的适当位置,或通过覆盖 地址之间的分支(加载到PC)指令从4030CE04h到4030CE04h之间 4030CE1Ch.
此微型上的异常处理程序表的基础是0x4030CE24,而不是 ARM 手册中指示的0x00000000或0xffff0000。
- 为什么我在 AVR 中的中断无法正常工作?
- 为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?
- 为什么循环没有中断,并且 if 条件没有按预期工作?
- O2优化水平中断程序工作
- Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?
- 试图让while循环工作,当输入符号而不是字符时会中断
- 当我跳到应用程序时,中断无法工作(STM32)
- 如果C++依赖于机器,那么用C++编写的软件如何在不同的计算机上工作
- Overriden计时器中断无法正常工作
- c++O3优化在循环时中断工作
- sdl软件渲染器不工作,工作在硬件加速的一个
- 获取软件中断在裸机中工作 小猎骨黑.
- 软件或防病毒产品的试用版如何真正工作
- 指针工作,然后似乎无缘无故地中断
- IRQ 8 无法正常工作...硬件还是软件?
- fstream的getline()工作了一点...然后中断
- 编程语言捕获和处理的异常是否算作软件中断
- 非阻塞工作中断文件拷贝
- c++是否有一种方法可以有效地与线程通信而不中断他的工作
- 当我不输出变量时,代码中断;我什么时候工作。