μc/os移植的条件
uCOS II的移植需要满足以下要求:
1)处理器的C编译器可以产生可重入代码:可以使用C调用进入和退出Critical Code(临界区代码);
2)处理器必须支持硬件中断,并且需要一个定时中断源;
3)处理器需能容纳一定数据的硬件堆栈;
4)处理器需有能在CPU寄存器与内存和堆栈交换数据的指令。
移植需要完成的工作
CPU的接口部分(Ports)–需要移植的代码部分
汇编文件(OS_CPU_A.ASM)、处理器相关C文件(OS_CPU.H、OS_CPU_C.C)中相关函数和变量的声明定义
OS_CPU_A.ASM文件改写
OSStartHighRdy() //OS启动时调用,加载用户最高优先级的任务
OSCtxSw() //任务级调度
OSIntCtxSw() //中断级调度
OSTickISR() //时钟中断响应,将检测到延时结束的任务加入就绪队列,
.cdecls C, LIST, "msp430.h"
;用户钩子,对应os_cpu_c.c中的HOOK函数
.ref OSIntExit
.ref OSIntNesting
.ref OSISRStkPtr
.ref OSPrioCur
.ref OSPrioHighRdy
.ref OSRunning
.ref OSTCBCur
.ref OSTCBHighRdy
.ref OSTaskSwHook
.ref OSTimeTick
;全局量
.global OSCtxSw
.global OSCPURestoreSR
.global OSCPUSaveSR
.global OSIntCtxSw
.global OSStartHighRdy
.global OSTickISR
;中断使能操作之前保存SR,恢复中断使能时CPU状态不变
.asmfunc ;保存SR寄存器
OSCPUSaveSR:
MOV.W SR, R12
DINT
NOP
RETA
.endasmfunc
.asmfunc ;恢复SR寄存器,保持CPU状态
OSCPURestoreSR:
MOV.W R12, SR
NOP
RETA
.endasmfunc
.asmfunc
;OS初始化后,准备运行时调用
;准备运行的最高优先级的任务。任务就绪表第一个
;被OSStart()调用
OSStartHighRdy:
CALLA #OSTaskSwHook
MOV.B #1, &OSRunning ; 内核运行标志
MOVX.A SP, &OSISRStkPtr ; 保存中断堆栈,系统堆栈
MOVX.A &OSTCBHighRdy, R13 ; 将最高优先级任务准备
MOVX.A @R13, SP ;将SP指向OSTCBHighRdy,即任务堆栈
POPM.A #12, R15
RETI ; 模拟中断,中断退出应执行的内容在OSISRStkPtr中
.endasmfunc
.asmfunc
;任务级上下文切换
OSCtxSw:
POP.W R12 ;CALLA调用,当前PC地址被压入系统栈
POP.W R13 ;这里使用的是扩展内存地址,地址长度为20位
PUSH.W R12 ;因此压栈的写法有变化
RLAM.A #4, R13
RLAM.A #4, R13
RLAM.A #4, R13
MOVX.W SR, R12
ADDX.A R13, R12
PUSH