gpt4 book ai didi

c - AM335x FreeRTOS 端口,无法处理 IRQ 和 SWI

转载 作者:太空狗 更新时间:2023-10-29 15:07:12 25 4
gpt4 key购买 nike

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

用户代码可以通过将其地址写入从 4030CE24h 到 4030CE3Ch 的适当位置,或者通过覆盖从 4030CE04h 到 4030CE1Ch 地址之间的分支(加载到 PC)指令,将任何异常重定向到自定义处理程序。

因此,我的 vIRQHandler 函数地址被写入 4030CE38h。人们希望这就足够了,但遗憾的是没有。我怀疑我的 boot.s 文件有问题,但是我的程序集从来没有那么好,我很难理解代码。 boot.s 和项目的其余部分是从 OMAP3 端口启动的。启动.s:

.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;

如果有人对组装新手有任何指示,那将非常有用,因为我完全被困住了:)

最佳答案

U-boot 移动了异常 vector 表。然而,我没有重新编译 u-boot,而是在我自己的启动脚本中重置了异常 vector 表。

在分支到 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 表的开头放入 _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 */

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

关于c - AM335x FreeRTOS 端口,无法处理 IRQ 和 SWI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com