os_cpu_c.c文件

该文件主要是根据处理器平台特点完成任务堆栈初始化函数OSTaskStkInit以及其他几个用户Hook函数的编写,其中必须要实现的函数是OSTaskStkInit(在创建任务函数中被调用),且该函数与处理器关系密切,是系统中任务能够正常切换的基础;其他几个Hook函数,可以不包含任何代码,但是必须声明;

第一部分

任务堆栈初始化函数OSTaskStkInit();

初始化任务堆栈,主要是为任务切换服务的;

以Cortex-M3内核为例:响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈 ,R11-R4 如果需要保存,只能手工保存 ;

因此 OSTaskStkInit()的工作就是在任务自己的栈中保存 cpu 的所有寄存器值,且按照上述特定顺序入栈出栈;

  1. OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
  2. {
  3. OS_STK *stk;
  4. (void)opt; /* 'opt' 未使用, 防止编译警告 */
  5. stk = ptos; /* 指向分配出來的栈顶指针 */
  6. /* 中断后xPSR,PC,LR,R12,R3-R0被自动保存到栈中 */
  7. *(stk) = (INT32U)0x01000000uL; /* xPSR */
  8. *(--stk) = (INT32U)task; /* 任务入口(PC)*/
  9. *(--stk) = (INT32U)OS_TaskReturn; /* R14 (LR) */
  10. *(--stk) = (INT32U)0x12121212uL; /* R12 */
  11. *(--stk) = (INT32U)0x03030303uL; /* R3 */
  12. *(--stk) = (INT32U)0x02020202uL; /* R2 */
  13. *(--stk) = (INT32U)0x01010101uL; /* R1 */
  14. *(--stk) = (INT32U)p_arg; /* R0 : argument */
  15. /* 剩下的寄存器保存在进程堆栈 */
  16. *(--stk) = (INT32U)0x11111111uL; /* R11 */
  17. *(--stk) = (INT32U)0x10101010uL; /* R10 */
  18. *(--stk) = (INT32U)0x09090909uL; /* R9 */
  19. *(--stk) = (INT32U)0x08080808uL; /* R8 */
  20. *(--stk) = (INT32U)0x07070707uL; /* R7 */
  21. *(--stk) = (INT32U)0x06060606uL; /* R6 */
  22. *(--stk) = (INT32U)0x05050505uL; /* R5 */
  23. *(--stk) = (INT32U)0x04040404uL; /* R4 */
  24. return (stk); /* 返回(TCB)栈顶(用于任务控制块的初始化)*/
  25. }

说明

  • xPSR = 0x01000000uL,xPSR T 位(第 24 位)置 1,否则第一次执行任务时Fault;
  • PC肯定得指向任务入口;
  • R14(LR) = OS_TaskReturn,任务返回处理函数(系统文件os_task.c中定义);
  • R0 用于传递任务函数的参数,因此等于p_arg;
  • 这些寄存器的初始化中,R1-R12初始化的值都是没什么实际意义的,主要是方便调试;

扩展

ATPCS规则,其规定了在子程序调用时的一些基本规则,包括下面3个方面:

  • 各寄存器的使用规则及其相应的名称;
  • 数据栈的使用规则;
  • 参数传递的规则;

以上各方面详细的内容如下:

  • 子程序间通过寄存器R0R3来传递参数,被调用的子程序在返回前无需恢复寄存器R0R3的内容;
  • 子程序中,使用寄存器R4R11来保存局部变量,如果在子程序中使用到了某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;而对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量;
  • 寄存器R12用作过程中调用时的临时寄存器,记作ip,指令指针;
  • 寄存器R13用作数据栈指针,记作SP,栈指针,在子程序中该寄存器不能用作其他用途,并且在进入子程序的值和退出子程序时的值必须相等;
  • 寄存器R14称为连接寄存器,记作LR,用于保存子程序的返回地址,如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途;
  • 寄存器R15时程序计数器,记作PC,专用;

第二部分

该文件中另外两个比较重要的函数:

  • OS_CPU_SysTickInit()初始化了 SysTick;
  • OS_CPU_SysTickHandler()则是 SysTick 的中断服务函数;
  • 以上两个函数也可以直接使用库函数替代;

其它函数都是些 HOOK,可按照需要使用;

uCos-II移值(二)的更多相关文章

  1. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  2. 移值UCOS2到M4核与M3核的区别

    之前移值过ucos2到stm32f2系列的单片机,这个单片机是属于arm的m3内核的.最近在学习永磁同步电机的控制,对于这个电机的控制,有比较多的数学计算,甚至于还有浮点的运算.所以用到了stm32f ...

  3. ucos ii 46个系统API函数解析

    源: ucos ii 46个系统API函数解析

  4. FreeRTOS 和uCOS II的简单比较

    转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...

  5. 第二步:将LAD结果的属性值二(多)值化,投入计算模型

    一文详解LDA主题模型 - 达观数据 - SegmentFault 思否 https://segmentfault.com/a/1190000012215533 SELECT COUNT(1) FRO ...

  6. dotnet core 在 MIPS 下的移值进度

    本文仍处于修订中 写在开始前 我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab i ...

  7. [LeetCode] 272. Closest Binary Search Tree Value II 最近的二叉搜索树的值 II

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  8. [LeetCode] Remove Duplicates from Sorted List II 移除有序链表中的重复项之二

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  9. [LeetCode] 82. Remove Duplicates from Sorted List II 移除有序链表中的重复项之二

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

随机推荐

  1. android#boardcast#发送自定义广播

    广播主要分为两种类型,标准广播和有序广播,通过实践的方式来看下这两种广播具体的区别. 一.发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发.因此新 ...

  2. Vuecli 3.0 项目自定义添加静态目录,支持在index.html引入

    参考链接:https://blog.csdn.net/qq_15253407/article/details/89491255

  3. 关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法

    #include <string.h>#include "lua.h"#include "lauxlib.h"#include "lual ...

  4. P1494 小Z的袜子 【普通莫队】

    我的第二道莫队题,对莫队又有了自己的看法. 在第一题的基础上之上,觉得莫队有个很关键的地方在于 莫队所维护的值是什么,怎么推出维护的公式来. 这道题就是这样,一开始还没自己推出公式来,也有几个坑点. ...

  5. Vue:不同页面之间的传递参数(二)---query

    1) 在router文件下的index.js中,添加相关路径 routes: [ { path: '/', name: 'Hello', component: HelloWorld }, { path ...

  6. Sliding Puzzle

    On a 2x3 board, there are 5 tiles represented by the integers 1 through 5, and an empty square repre ...

  7. ARM 版本 瀚高 数据库的启动命令

    1. 在瀚高安装目录下面执行路径 安装目录为: /opt/HighGoDB-4.3.4.3/ bin下./pg_ctl restart -D ../data 本次的密码是: highgo123   2 ...

  8. Redis(1.10)Redis主从复制下的哨兵模式

    [0]哨兵 sentinel 的作用 其概念参考:Redis高可用(理论篇) 中的[2] [0.1]监控:监控主从是否正常 [0.2]通知:出现问题时,可以通知相关人员 [0.3]故障转移:自动主从切 ...

  9. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

    MFC中ASSERT作为断言语句,括号内内容为TRUE,继续执行:为FALSE终止执行.之后取得当前窗口的系统菜单,在这个菜单中添加字符串资源IDS_ABOUTBOX和菜单资源IDM_ABOUTBOX ...

  10. [git] git error: unable to unlink old

    今天git pull ,结果报错 :   git error: unable to unlink old 原因是   文件夹内 一个exe 处于打开状态. 哈哈哈哈,又是个低级错误~~~ 下次注意呀~