首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

uCOS II在SkyEye上的移植分析 04

uCOS II在SkyEye上的移植分析 04

2.OS_CPU_C.C 文件
任务堆栈初始化
 这里涉及到任务初始化时的一个堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存器位置,在arm 体系结构下,任务堆栈空间由高至低依次将保存着pc、lr、r12、r11、r10、…r1、r0、CPSR、SPSR。

图9
 这里需要说明两点,一是当前任务堆栈初始化完成后,OSTaskStkInit 返回新的堆栈指针stk,在OSTaskCreate()执行时将会调用 OSTaskStkInit 的初始化过程,然后通过OSTCBInit()函数调用将返回的sp指针保存到该任务的TCB块中。二是初始状态的堆栈其实是模拟了一次中断发生后的堆栈结构,因为任务被创建后并不是直接就获得执行的,而是通过OSSched()函数进行调度分配,满足执行条件后才能获得执行的。为了使这个调度简单一致,就预先将该任务的pc指针和返回地址lr都指向函数入口,以便被调度时从堆栈中恢复刚开始运行时的处理器现场。

图10

系统hook函数
 此外,在这个文件里面还需要实现几个操作系统规定的hook函数,如下:
 OSSTaskCreateHook( )
  OSTaskDelHook( )
  OSTaskSwHook( )
  OSTaskStatHook( )
  OSTimeTickHook( )
 如果没有特殊需求,则只需要简单地将它们都实现为空函数就可以了。

3.OS_CPU_A.S 文件
 OSStartHighRdy()
 此函数是在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将cpu现场恢复,这时系统就将控制权交给用户创建的该任务进程,
返回列表