UCOS移植

移植Ucos应该满足的条件:

  • 处理器的C编译器可以产生可重入码
    可重入码可以被一个以上的任务调用,而不必担心数据的破坏。或者说可重入码在任何时刻都可以被中断,一段时间后又可以运行,而相应数据不会丢失。
  • 在程序中可以打开和关闭中断
    在Ucos中,打开和关闭中断主要通过OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏来进行的
  • 处理器支持中断,并且能够产生定时中断(通常在10~1000Hz之间)
    Ucos通过定时器的中断实现多任务的调度
  • 处理器支持能够容纳一定量数据的硬件堆栈
    对于一些只有10根地址线的8位控制器,芯片最多可访问1KB的存储单元,在这样的条件下移植是由困难的。
  • 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈的指令

    OSCtxSw()的工作

  • 把终止任务的断电指针保存到任务堆栈中,即PC
  • 把CPU通用寄存器的内容保存到任务堆栈中
  • 把终止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中
  • 获得待运行任务的任务控制块
  • 使CPU通过任务控制块获得待运行任务的任务堆栈指针
  • 把待运行任务的堆栈中的通用寄存器的内容恢复到CPU的通用寄存器中
  • CPU获得待运行任务的断电指针

    在以上步骤中,第一项和最后一项有些麻烦,对于终止任务,应把任务的断点指针压入任务堆栈,对于待运行任务而言,应把任务堆栈的上次任务被终止时存放在堆栈中的中断指针推入PC寄存器。但是目前的处理器一般没有对PC的出栈和入栈指令。这时可以采用其他改变PC值的方法变通。即想办法引发一次中断。

    Cotex_M3 移植

  • Cotex-M3相关处理器采用“向下生长“的栈模式,堆栈指针SP总是指向最后一个被压入堆栈的32位整数。
  • 函数OSPendSV()是Cortex_M3处理器进入异常服务例程时,通过一次PendSV异常中断完成在上下文切换时的用户线程模式到特权模式的切换,自动压栈了R0~R3,R12,LR(连接寄存器R14),PSR(程序状态寄存器)和PC(R15),并且在返回时自动弹出。

转载于:https://www.cnblogs.com/rogerjin/p/7122897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值