5

我目前正在尝试将 FreeRTOS 移植到 TI AM335x 处理器,该处理器以在 BeagleBones 上使用而闻名。我能够启动、运行 GPIO 并设置一个比较匹配计时器来运行系统滴答声。如果我禁用中断,我可以看到在定时器启动后的正确时间后如何设置中断。如果我启用中断,我的应用程序会在相同的给定时间后死掉。如果我尝试产生一个任务,也就是调用 SWI 处理程序,应用程序也会死掉。这让我相信向量表不可用或设置不正确。SWI 和 IRQ 的 ROM 异常向量的内容为 4030CE08h 和 4030CE18h。在 RAM 中再次执行一些分支,TRM 说:

用户代码可以将任何异常重定向到自定义处理程序,方法是将其地址写入从 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                     */

启动的分支为每种模式设置一个堆栈并清除 bss,不确定这是否相关。这是似乎与我相关的代码,我已经更新了单词以适应 AM335 而不是 OMAP3。

设置 IRQ 处理程序:

#define E_IRQ                   (*(REG32 (0x4030CE38)))
....
/* Setup interrupt handler */
E_IRQ = ( long ) vIRQHandler;

如果有人对组装新手有任何指示,那将是非常受欢迎的,因为我完全被卡住了:)

4

1 回答 1

2

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

并在我的异常向量表的开头放入 _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               */

现在所有异常都被重定向到我的代码。希望这会对与我处于相同情况的任何人有所帮助:)

于 2014-06-02T09:57:59.590 回答