uC OSIII port

来源:互联网 发布:网络攻防大赛 常见思路 编辑:程序博客网 时间:2024/06/05 17:51



os_cpu.h  :
    OS_TASK_SW()、OSIntCtxSw()任务切换宏声明、OSStartHighRdy()、OS_SysTick相关方法声明。
    OS_CPU_CFG_SYSTICK_PRIO:设置SysTick的中断优先级  中断优先级只有高四位有效
    OS_CPU_ExceptStkBase:MSP中断使用的堆栈地址




os_cpu_a.asm  :PendSV_Handler()、OSStartHighRdy()的汇编实现。

;;OSStartHighRdy
;设置PendSV 中断优先级NVIC_PENDSV_PRI  只有高4位有效
;设置PSP堆栈地址为0  标志为第一次上下文切换
;设置MSP堆栈地址为OS_CPU_ExceptStkBase
;触发PendSV中断
;开启中断
;;

;;PendSV_Handler
;在进入PendSV中断处理函数时
;xPSR, PC, LR, R12, R0-R3已经被保存到PSP中
;处理器模式从Tread切换到Handler模式
;堆栈为MSP
;OSTCBCurPtr  指向要挂起的任务TCB
;OSTCBHighRdyPtr  指向要恢复的任务的TCB
;;
;;
;关中断
;查看PSP是否为0 为0表示第一次上下文切换 跳过压栈R4-R11保存PSP到TCB
;压栈R4-R11  (8个寄存器)  0x20=0x04*8
;将PSP保存到当前任务的TCB中  OSTCBCurPtr->OSTCBStkPtr = SP;
;调用OSTaskSwHook();
;设置当前最高优先级  OSPrioCur = OSPrioHighRdy;
;设置要切入的TCB  OSTCBCurPtr = OSTCBHighRdyPtr;
;从TCB中得到PSP的值  PSP = OSTCBHighRdyPtr->OSTCBStkPtr;
;出栈R4-R11
;设置LR为0xFFFFFFFD  确保中断返回后使用PSP  0xFFFFFFF9~使用MSP
;开中断
;;


os_cpu_c.c  :移植需要的:系统调用的钩子函数、创建任务时对堆栈格式的初始化,SysTick的初始化和中断处理。

OS***Hook()为系统调用的钩子函数,在钩子函数中调用用户的实现
在调用OSInit()时初始化所有的OS_App***Ptr为null 如果实现了OS_App***Ptr对应的钩子函数需要在OSInit()调用之后设置其值

OSIdleTaskHook()中可以将MCU设置为低功耗

在OSInitHook()设置中断使用的堆栈的地址OS_CPU_ExceptStkBase  在os_cpu_a.asm中OSStartHighRdy()使用

OS_CPU_SysTickHandler():Sys Tick的中断处理函数 调用OSTimeTick()

OS_CPU_SysTickInit(cnts):必须在OSStart() 硬件初始化完成之后调用
    根据OS_CPU_CFG_SYSTICK_PRIO 设置SysTick 的中断优先级   中断优先级只有高四位有效,使用的时钟源可以是AHB/8、AHB


0 0