我有几个关于swi的问题,请大家帮助解释一下:
1。关于swi指令:我用ADS的armul软件仿真时,swi 0x0执行时ADS转到04未定义指令处,而不是08地址上。???
2。用zlg的做了一个有swi中断的实验,到swi处没有报未定义指令,但是也没跳到08地址上,而是直接过去了。从寄存器上看,指令已经执行完了(管理模式下的寄存器发生改变)。我是单步执行,为什么没有看见跳转到swi中断的ISR处???
3。利用swi 0x123456(0xab)如何使用半主机功能,请教???
我在08处设置断点,可以追到swi指令的跳转过程。
分析原因可能是用的lpc2210无片内flash,程序加载到片外ram中(地址0x80000000)。由于lpc2210的重映射机制,将0x80000000地址上的中断向量表映射到0x0处,swi指令运行后跳到0x8,此时只能看见反汇编代码没有源文件(0x0处没有代码),再经过08处的跳转到swi的ISR处,此时就可以看见源文件代码,程序继续执行。
我想如果在08处不设置断点,由于在08处没有实际的代码,所以直接跳过去了。
关于半主机的设置方法,请发到我邮箱:wheels@35.com
[em17]To twentyone:感谢!看完你给例子后,基本清楚了semihosting的用法,但是像printf的使用,以及变量$TOP_OF_MEMORY的设置方法,还是不知道。能否再讲解讲解,最好是给我一个例子,多谢!还有semihosting mode中std vector是指什么,我设置成0x0或是0x8都可以正常使用semihosting,正常是否应该设置为0x8?
另外,swi指令在ADS中的跳转,我试写了一个完整的例子,发现swi能够正常跳转,但是不知道什么原因导致两者之间不同跳转?我觉得可能跟程序有关,你如果有时间帮我分析一下,我可以把程序发给你。
其实昨天给你发的例子是自己实现的一个SEMIHOSTING函数。象ADS提供的PRINTF等输入输出函数,都是SEMIHOSTING版本的,封装好了。你可以试一试写一个main函数,然后在main函数里面直接PRINTF.不过要PRINTF正常工作的话,需要设置$TOP_OF_MEMORY变量,$TOP_OF_MEMORY - 32K到$TOP_OF_MEMORY这段空间将被用作仿真器软件和DEBUGGER之间传送数据。STD VECTOR一般应该设置位0X8,这个是SWI的向量地址。在H-JTAG里面,默认用地址0X8,即使你设置0X0,H-JTAG用的还是0X8。
你把你的SWI程序发给我好了,我有空的时候帮你看。
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |