[Raw-OS] Raw os 移植篇

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

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复