2474|0

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

内核移植 [复制链接]

目前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 的移植式那样会使你移植的又快又准确。
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表