zoukankan      html  css  js  c++  java
  • ucos移植指南

    1. 指定堆栈数据类型(宽度) typedef unsigned int OS_STK;

    2. 指定Ucos移植方法3中保存cpu状态寄存器的变量的宽度
      typedef unsigned int OS_CPU_SR;

    3. 指定堆栈的生长方向,cortex-m3的生长方向是高地址到低地址
      #define OS_STK_GROWTH 1

    4. 选择cpu进入中断时候(临界段)的切换方式,有三种选择,第一是直接利用cpu的开关中断指令来实现,第二是通过堆栈保存和恢复cpu的状态,第三是通过编译器扩展功能
      获取程序状态字,保存在变量cpu_sr中

    5. Os_cpu.h说明完成

    6. 接下来需要移植os_cpu_a.asm汇编代码

    7. OS_CPU_SR_Save 保存cpu状态寄存器的汇编代码,将primask保存

    8. OS_CPU_SR_Restore 恢复cpu状态,将primask赋值到之前保存的值

    9. OSStartHighRdy 使用调度器调度第一个任务,os_start会调用它

    10. 当一个任务放弃 cpu 的使用权,就会调用 OS_TASK_SW()宏,而
      OS_TASK_SW()就是 OSCtxSw()。 OSCtxSw()应该做任务切换。但是在 CM3 中,
      所有任务切换都被放到 PendSV 的中断处理函数中去做了,因此 OSCtxSw()只需简
      单的触发 PendSV 中断即可,OS_TASK_SW()是由 OS_Sched()调用

    11. 当一个中断处理函数退出时, OSIntExit()会被调用来决定是否有优先级更高的任
      务需要执行。如果有 OSIntExit()对调用 OSIntCtxSw()做任务切换

    12. OSCtxSw()做的是任务之间的切换,如任务 A 因为
      等待某个资源或是做延时切换到任务 B,而 OSIntCtxSw()则是中断退出时,由中断
      状态切换到另一个任务。由中断切换到任务时, CPU 寄存器入栈的工作已经做完了,
      所以无需做第二次了(参考邵老师书的 3.10 节)。这里只不过由于 CM3 的特殊机
      制导致了在这两个函数中只要做触发 PendSV 中断即可

    13. PendSV 中断处理函数中只需保存 R4-R11 并调节堆栈指针

    14. OSInitHookBegin()
      OSInitHookEnd()
      OSTaskCreateHook()
      OSTaskDelHook()
      OSTaskIdleHook()
      OSTaskStatHook()
      OSTaskStkInit()
      OSTaskSwHook()
      OSTCBInitHook()
      OSTimeTickHook()
      这些函数除了 OSTaskStkInit(),都是一些 hook 函数。这些 hook 函数如果不使
      能的话,都不会用上,也都比较简单

    15. OSTaskStkInit()的作用,它被任务创建函数调用,所以要在开始时,在栈中作
      出该任务好像刚被中断一样的假象

    16. OSTaskStkInit()的工作就是在任务自己的栈中保存 cpu 的所有
      寄存器。这些值里 R1-R12 都没什么意义,这里用相应的数字代号(如 R1 用
      0x01010101 )主要是方便调试

    17. 打开系统定时中断,添加操作系统时钟切换函数
      OSIntEnter(); //进入中断
      OSTimeTick(); //调用ucos的时钟服务程序
      OSIntExit(); //触发任务切换软中断

    18. 主程序系统初始化,创建任务,启动任务

    19. OSInit();
      OSTaskCreate(start_task,(void)0,(OS_STK)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
      OSStart();

    20. 起始任务负责创建中间任务
      OS_CPU_SR cpu_sr=0;
      pdata = pdata;
      OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
      OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
      OSTaskCreate(led1_task,(void)0,(OS_STK)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
      OSTaskCreate(led2_task,(void)0,(OS_STK)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO);
      OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
      OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)

    21. 移植到此结束

  • 相关阅读:
    远程桌面连接(mstsc)
    google浏览器网页截取全屏
    Guava缓存工具类封装和使用
    The project description file (.project) for XXX is missing
    国际化常用时间格式并进行格式转换
    MySQL 查询索引失效及如何进行索引优化
    The requested URL could not be retrieved
    java.util.zip.ZipException: invalid LOC header (bad signature)
    熊猫破解 --- 软件分享站
    「在线宣传利器」上传文档转为翻页电子书,生成链接二维码
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4322459.html
Copyright © 2011-2022 走看看