hen*_*fos 5 c assembly irq freertos beagleboneblack
我目前正在尝试将FreeRTOS移植到TI AM335x处理器,该处理器以在BeagleBones上使用而闻名.我能够启动,运行GPIO并设置比较匹配计时器以运行系统滴答.如果我禁用中断,我可以看到在定时器启动后的正确时间后如何设置中断.如果我启用了中断,我的应用程序会在相同的时间后死掉.如果我尝试生成一个任务,也就是调用SWI处理程序,应用程序也会死掉.这使我相信矢量表不可用或设置不正确.SWI和IRQ的ROM异常向量具有4030CE08h和4030CE18h的协议.TRM在RAM中再次执行一些分支,它说:
用户代码可以将任何异常重定向到自定义处理程序,方法是将其地址写入4030CE24h到4030CE3Ch的适当位置,或者覆盖4030CE04h到4030CE1Ch之间地址之间的分支(加载到PC)指令.
因此,我的vIRQHandler函数地址写入4030CE38h.人们希望这已经足够了,但遗憾的是没有.我怀疑我的boot.s文件有问题,但是我的程序集从来没有那么好,我很难理解代码.boot.s和项目的其余部分是从OMAP3端口启动的.靴子:
.section .startup,"ax"
.code 32
.align 0
b _start /* reset - _start */
ldr pc, _undf /* undefined - _undf */
ldr pc, _swi /* SWI - _swi */
ldr pc, _pabt /* program abort - _pabt */
ldr pc, _dabt /* data abort - _dabt */
nop /* reserved */
ldr pc, _irq /* IRQ - read the VIC */
ldr pc, _fiq /* FIQ - _fiq */
_undf: .word 0x4030CE24 /* undefined */
_swi: .word 0x4030CE28 /* SWI */
_pabt: .word 0x4030CE2C /* program abort */
_dabt: .word 0x4030CE30 /* data abort */
_irq: .word 0x4030CE38
_fiq: .word 0x4030CE3C /* FIQ */
Run Code Online (Sandbox Code Playgroud)
要启动的分支为每个模式设置堆栈并清除bss,不确定它是否相关.这是与我相关的代码,我更新了这些单词以适应AM335而不是OMAP3.
设置IRQ处理程序:
#define E_IRQ (*(REG32 (0x4030CE38)))
....
/* Setup interrupt handler */
E_IRQ = ( long ) vIRQHandler;
Run Code Online (Sandbox Code Playgroud)
如果有人有任何指向组装新手的指针,那将会非常受欢迎,因为我完全陷入困境:)
U-boot 已移动异常向量表。然而,我没有重新编译 u-boot,而是在自己的启动脚本中重置了异常向量表。
在分支到 main 之前添加了这个:
/* Set V=0 in CP15 SCTRL register - for VBAR to point to vector */
mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTRL Register
bic r0, #(1 << 13) @ V = 0
mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTRL Register
/* Set vector address in CP15 VBAR register */
ldr r0, =_vector_table
mcr p15, 0, r0, c12, c0, 0 @Set VBAR
bl main
Run Code Online (Sandbox Code Playgroud)
并将 _vector_table 标签放入异常向量表的开头:
.section .startup,"ax"
.code 32
.align 0
_vector_table: b _start /* reset - _start */
ldr pc, _undf /* undefined - _undf */
ldr pc, _swi /* SWI - _swi */
ldr pc, _pabt /* program abort - _pabt */
ldr pc, _dabt /* data abort - _dabt */
nop /* reserved */
ldr pc, _irq /* IRQ - read the VIC */
ldr pc, _fiq /* FIQ - _fiq */
Run Code Online (Sandbox Code Playgroud)
现在所有异常都被重定向到我的代码。希望这能帮助任何和我遇到同样情况的人:)