最近在看移植方面的内容..主要参考的是官方的移植范例.. 但手上还有其他几个范例.发现有几个地方还是不明白的,希望高人能解答.大家也一起讨论讨论..
1.复位后默认是管理模式SVC,在前后台跑程序时Atmel给的例程也是SVC. 而UCOSII的任务有的用SYS模式,也有用SVC移植的.两者相比有什么大的区别?最新的移植范例是SVC模式下的.
2.ATPCS规定的ARM堆栈是8字节对齐.但是IAR中可选4字节.平时操作堆栈好象也是4字节对齐?
3.在Atmel前后台的irq处理中irq堆栈只保存了3个寄存器(LR_irq, SPSR_irq, R0),八级嵌套的话最多是3*8*4 = 96字节. 而且ISR是切换到SVC模式下去执行的.其他的内容保存在SP_svc的任务栈中.保持了I和F的畅通,能被irq继续中断. 但UCOSII中好象都是使用的irq模式去处理ISR,这样有个好处是不用每个任务都留出一段任务栈.统一保存到irq堆栈.但是好象所有例程在跑ISR时都把I屏蔽了..那么就不能进行中断嵌套了..? (在IRQ模式下如果I没被屏蔽应该还可以继续被IRQ中断吧)
4.在原S64的启动代码主要完成了几个事. A.初始化临时堆栈进行lowlevelinit (禁止WDT,配置正确的时钟,配置中断源) B.初始化irq堆栈到ramend.初始化SVC堆栈到ramend-96 C.初始化变量段.跳转main 在UCOSII移植中,原来2.76版是差不多的.但是2.83新的版本移植有几个变化. 1)采用了可以跳转+/-4GB的方法. 用PC装载一个32位地址(B跳转当前+/-32M已经足够) 2)对堆栈的初始化不同.主要和后面用的模式.和中断的处理有关.但是好象没有用到ramend 3)没有进行lowlevelint配置中断源和系统时钟配置,是运行到bsp_init()才做的.那么之前用的应该是32768的内部时钟. 4)但是bsp_init()中有一个OS_CPU_InitExceptVect.直接把地址进行操作.这应该是重映射后才能用,但是例程没用重映射也能跑.不出错?.
5.IAR中的Plug-in UCOSII插件是免费的还是?,需要加入什么新的模块?怎样去使用它. uc-Probe和uc-View的话又是怎样弄的.搭建嵌入式平台的话需要这个东西
6.uC/CPU和uc/LIB有什么用?
: ) 请大家帮帮忙.我主要是中断那块和几个堆栈的容量分配不太清楚..
|