操作系统的移植主要取决于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 的移植式那样会使你移植的又快又准确。