完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
操作系统的移植主要取决于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 的移植式那样会使你移植的又快又准确。 |
|
相关推荐
|
|
求stm32f103的GCC移植,改到不出错,还是用不了
@/* 2012-9 Created by dezhi jiang @ * xxxxxx please added here @ */ .extern raw_task_active .extern high_ready_obj .global OS_CPU_SR_Save .global OS_CPU_SR_Restore .global CPU_IntDis .global CPU_IntEn .global raw_start_first_task .global port_task_switch .global raw_int_switch .global PendSVHandler @******************************************************************************************************** @ EQUATES @******************************************************************************************************** @ Interrupt control state register. .equ NVIC_INT_CTRL,0xE000ED04 @ System priority register (priority 14). .equ NVIC_SYSPRI14,0xE000ED22 @ PendSV priority value (lowest). .equ NVIC_PENDSV_PRI,0xFF @ Value to trigger PendSV exception. .equ NVIC_PENDSVSET,0x10000000 @******************************************************************************************************** @ CODE GENERATION DIRECTIVES @******************************************************************************************************** .code 16 .align 0 .thumb_func .syntax unified OS_CPU_SR_Save: MRS R0, PRIMASK CPSID I BX LR OS_CPU_SR_Restore: MSR PRIMASK, R0 BX LR CPU_IntDis: CPSID I BX LR CPU_IntEn: CPSIE I BX LR raw_start_first_task: LDR R0, =NVIC_SYSPRI14 LDR R1, =NVIC_PENDSV_PRI STRB R1, [R0] MOVS R0, #0 MSR PSP, R0 LDR R0, =NVIC_INT_CTRL LDR R1, =NVIC_PENDSVSET STR R1, [R0] CPSIE I OSStartHang: B OSStartHang port_task_switch: LDR R0, =NVIC_INT_CTRL LDR R1, =NVIC_PENDSVSET STR R1, [R0] BX LR raw_int_switch: LDR R0, =NVIC_INT_CTRL LDR R1, =NVIC_PENDSVSET STR R1, [R0] BX LR PendSVHandler: CPSID I MRS R0, PSP CBZ R0, OS_CPU_PendSVHandler_nosave SUB R0, R0, #0x20 STM R0, {R4-R11} LDR R1, =raw_task_active LDR R1, [R1] STR R0, [R1] OS_CPU_PendSVHandler_nosave: LDR R0, =raw_task_active LDR R1, =high_ready_obj LDR R2, [R1] STR R2, [R0] LDR R0, =raw_task_active LDR R1, =high_ready_obj LDR R2, [R1] STR R2, [R0] LDR R0, [R2] LDM R0, {R4-R11} ADD R0, R0, #0x20 MSR PSP, R0 ORR LR, LR, #0x04 CPSIE I BX LR |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 15:38 , Processed in 0.501535 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号