我目前正在尝试将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: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在uboot中配置GPIO中断,这是为了测试中断响应时间而无需任何操作系统干预(裸机).我能够配置引脚复用并成功设置GPIO引脚的中断.
我的问题是关于注册中断服务程序.我看到我的平台的中断向量表位于地址0xFFFF0000(我读了系统控制寄存器以找出这个).GPIO的中断ID为56,我刚刚计算了中断服务程序应该驻留的地址,并尝试用指向我的ISR例程的指针写入地址.这是正确的做法吗?或者我必须自己处理所有其他事情,如上下文保存等?
注意:我使用的是ARM Cortex A-9.
编辑:
基于我通过代码的答案,我有以下问题.的定义
我的架构的do_irq(arm v7)没有做太多,CONFIG_USE_IRQ对我来说不起作用,因为没有为我定义像arch_interrupt_init这样的函数.所以我可以得出结论,我的架构不支持中断.现在,如果我必须自己定义我需要实现的所有功能,以使其工作?由于这只是我项目的一小部分,我想看看能否做到这一点是可行的.我只是想知道这是否需要几行代码或者需要一些努力来实现这种中断支持.