目前raw os已经成功移植到多个芯片上,涵盖的cpu有arm 9, cortex-m0, cortex-m4, cortex-m3, mips32 等等。其中有两款芯片是重点花时间实现的,第一款是s3c2440芯片,第二款是s3c2416芯片。 首先不建议一般的用户去移植raw os到新的芯片上,一般的用户更应该注重于内核的使用上。如果你是系统开发者,请先看一下raw os官网,看看是否已经有移植。如果官网上没有移植,请联系我,我会安排时间移植。 如果你坚持要自己移植,请仔细看一下移植策略: 操作系统的移植主要取决于cpu ,所以操作系统的移植基本都是大同小异。所以移植raw os 的时候最快的捷径是看看有没有其它os 移植到过上面,如果有的话移植会简单很多。 移植raw os 主要是4个文件, cpu.asm, port.c , raw_cpu.h, 以及raw_type.h Port.c 里面最主要的移植函数是: RAW_VOID *port_stack_init(PORT_STACK *p_stk_base, RAW_U16 stk_size, RAW_VOID *p_arg, RAW_TASK_ENTRY p_task) p_stk_base 是内存低地址地方, stk_size是栈里的元素个数,注意不是有多少字节!p_task 是第一个任务入口地址。 还有一个函数是void task_create_hook(RAW_TASK_OBJ *task_obj) 置空就好。 10ms 的tick 中断产生的代码也可以放里面,具体用户去决定。 Raw_cpu.h 里面主要是RAW_SR_ALLOC() 取决于cpu 关中断的时候能不能保存一个cpu 状态值,能保存的话就打开,不能保存就不要打开。 RAW_CRITICAL_ENTER() 和 RAW_CRITICAL_EXIT() 则是必须要的。宏后面的函数一般是在cpu.asm 里面。 比如: #define RAW_CRITICAL_ENTER() {cpu_sr = OS_CPU_SR_Save();} #define RAW_CRITICAL_EXIT() {OS_CPU_SR_Restore(cpu_sr);} CONTEXT_SWITCH() 是任务级别的切换也是必须的. #define CONTEXT_SWITCH() port_task_switch() raw_type.h 里面主要定义的是数据类型, 这个直接和编译器相关的,不清楚的话参考其他os 的移植,大家都是一样的。 唯一要注意的是RAW_INLINE 如果编译器增加了inline 支持的话可以加,否则如下定义. #define RAW_INLINE static Cpu.asm 是移植最复杂的地方,因为全部是cpu 相关的。这里需要主要移植的函数和raw_cpu.h 里定义的挂钩,主要有 关中断,开中断的函数,以及任务级别切换的函数。比如: OS_CPU_SR_Save(关中断函数)OS_CPU_SR_Restore(开中断?恢复之前状态) port_task_switch 任务级别的切换,raw_int_switch 中断唤醒了更高优先级任务,需要切换给他。raw_start_first_task 是系统启动第一个最高优先级的任务。 下面说下port_task_switch 的思想和做法: 1 首先是对当前任务压栈,然后把压栈后的栈指针保存给raw_task_active的task_stack 2 raw_task_active = high_ready_obj, 把raw_task_active设置为当前最高优先级任务 3得到raw_task_active的task_stack, 然后出栈还原就好了。 下面说下raw_int_switch 的思想和做法: 1 保存或者不保存当前的寄存器,这个主要和cpu 相关,如果之前已经保存过当前任务的寄存器的就不需要保存了。 (Cortex-m3 比较特殊,具体看移植代码。) 其余的做法基本和port_task_switch的一样。 下面说下raw_start_first_task的思想和做法: 1 得到raw_task_active的task_stack, 然后出栈还原就好了, 一步到位,不需要设置raw_task_active = high_ready_obj, 因为raw os 已经做了。 总结: 移植cpu.asm 的时候强烈建议参方考现有的其它os 的移植式,不建议自己写,因为这个是和cpu 关联性非常强的东西,除非你很熟悉很熟悉这cpu. 其它的也尽量参考现有的其它os 的移植式那样会使你移植的又快又准确。
|