|
楼主 |
发表于 2009-3-15 00:11:06
|
显示全部楼层
AT91SAM7X256的移植终于有眉目了,包含上面所有MDK的移植(CortexM3未知),都有一个比较致命的bug:
在做中断中的任务切换时,代码是从gcc改过来的,由于当时用MDK编译,报了个警告,所以改成MDK友好的模式:
mrs r3, spsr @ disable interrupt
orr r0, r3, #I_BIT|F_BIT
msr spsr_c, r0
ldr r0, =.+8 @ switch to interrupted task's stack
movs pc, r0
==>
mrs r3, spsr ; disable interrupt
orr r0, r3, #I_Bit|F_Bit
msr spsr_c, r0
; switch to SVC mode
msr cpsr_c, #Mode_SVC
; ldr r0, =.+8 ; switch to interrupted task's stack
; movs pc, r0
关键出现在msr cpsr_c, #Mode_SVC上,因为它从IRQ模式返回到SVC模式时,是直接切过去,而不是像gcc那样从IRQ模式退出,spsr并没有自动复制到cpsr中(那是当然,自己做了msr啊!!)
这个问题折腾了差不多一个星期!!现在终于好了,RT-Thread/AT91SAM7X256包含LwIP网络协议栈的移植基本上完成,今天比较晚,明天整理下代码再发上来。这个版本很可能就是0.2.4最终正式版了。
RT-Thread/AT91SAM7X256指标情况:
编译-O2,(RTOS + FinSH Shell + LwIP 1.3.0 + USB Virtual COM)
Program Size: Code=73944 RO-data=1092 RW-data=832 ZI-data=35080
TCP Echo Server,50万个包无错误,无重传。期间运行3个ping,time < 1ms |
|