最近在整一块s3c44box的板子,开始写点小程序。无奈因为水平太低,指令系统也不熟悉,遇到了不少问题。
记得最开始写的是LED点灯实验。这个倒是挺简单的。无非就是写下寄存器,再看原理图对照下,也就搞定。后来,我想加点按键处理部分。此时,s3c44box的中断处理部分,我还只能算是有点了解,没动手实践过。第一次写按键处理时,将中断向量表放在了所写的文件开始,然后在工程的链接选项中设置ro-base为0xc000000,也就是内存的起始地址。我以为,中断发生时,会用我写的中断向量表,后用jtag调试时,在反汇编窗口下,实际看到,我写的那段中断向量表在内存的0xc000000处,而不是我所想的0x0起始。中断发生时,pc直接跳转至rom区域中。我才明白,jtag调试时,我的代码被放在了内存里,而不是我想的rom区。
后来,想了想。干脆将板子附带的测试程序中的工程文件里中断向量表跳转地址进行改动。将其定位到0xc000000处。恰好对应了我写的文件对应的入口。再将测试程序生成的代码烧到flash 中。再次测试时,一切OK。
具体来说,我写的文件大概是这样的:
AREA time,CODE,READONLY
CODE32
export start
ENTRY
start
ldr pc, =RESET
ldr pc, =undef
ldr pc, =swi
ldr pc, =abt
ldr pc,=dataabt
b .
ldr pc,=irq
ldr pc,=fiq
ldr pc,=EINT0
ldr pc,=EINT1
ldr pc,=EINT2
ldr pc,=EINT3
ldr pc,=EINT4567
ldr pc,=INT_TICK
...............................................
这个表的结构和测试程序中的中断量表结构是一样的。但是ldr pc, =?? 中的地址,定位都该表中的ldr pc,=???指令所在地址。我想通过两级跳转来实现自定义中断程序处理.
这个模块被放在生成的文件头部。链接到0xc000000处。对应的测试文件中的中断向量表中,直接修改跳转地址即可。不过,我只修改了IRQ中断部分,其它的没做改动,有好多东西自己还是不熟悉。
这个办法倒是挺笨的。但可以避免多次烧写flash,而且有jtag调试也比较方便。
另外,我还注意到一点。在用jtag调试定时器时,s3c44box内部的定时器总是在运行,而不管是否设置了断点。
文章评论(0条评论)
登录后参与讨论