移植的代码早就写好了,但是测试发了更多的时间,现在测试还在进行中。
先前移植ucos是基于sparc v8的register window 模型,后来写完代码,发现问题重重,于是在老师的建议下还是重新返工了,重写了基于mflat模型的代码,重写的时间也就是一天的时间,后来就是一直在测试。
一直是没有找到很好的测试方法,所以只能用直接写几个任务,然后向串口打印东西。要是谁有好的方法,告诉我一声呵。下面还是说说把ucos移植到sparc v8上需要注意的问题吧。
最先碰到的是中断返回的问题,sparc 跟其它的处理器在这点上很不同。当发生中断的时候,sparc是还未执行当前指令,而其它处理器一般是已执行完当前指令了。所以当我们中断返回时,要用这么一条语句
jmpl %l1,%g0
rett %l2
nop
这样,就会跳回了原来程序了。
在ucos移植过程中,要把data cache以及MMU关掉,因为有data cache 可能会导致cache的数据和外部的IO数据不一致,而ucos操作系统是不支持MMU的。
在修改os_cpu_a.s这个文件中,不管是OSCtxSw还是OSIntCtxSw,返回时最好用rett指令,因为这才不会改变原窗口的寄存器。
当然了,在移植的过程中要特别注意sparc结构的堆栈。
__________ ___________ %sp ( foo() )
%sp | %l0-%l7 | 8*4 保存foo()的%l0-%l7寄存器
|__________|
%sp+32 | %i0-%i7 | 8*4 保存foo()的%i0-%i7寄存器 (%i7包含foo()的返回地址)
|__________|
%sp+64 |返回值地址| 1*4