os_cpu_c.c文件

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

第一部分

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

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

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

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

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

说明

  • 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. Python 面向对象(上)

    一. 什么是面向对象? 1. 在了解面向对象之前,首先我们需要知道两个概念:(1)什么是函数?函数是对功能或动作的一种封装.函数的语法结构如下: def func(arg1): '''函数的内部有函数 ...

  2. vue是一个渐进式的框架,我是这么理解的

    vue是一个渐进式的框架,我是这么理解的 原文地址 时间:2017-10-26 10:37来源:未知 作者:admin 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主 ...

  3. Netcat—瑞士军刀

    netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所做的 ...

  4. css 未知子元素宽高的居中

    .parent{ position:relative; } .child{ position:absolute; left:50%; top:50%; transform:translate(-50% ...

  5. 用Blackbox Exporter to Monitor web和端口

    1.按照exporter .wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbo ...

  6. Android MVC MVP MVVM (三)

    MVVM Model-View-ViewModel的简写 在MVP基础上实现数据视图的DataBinding,数据变化,视图自动变化,反之也成立. DataBinding 启用DataBinding ...

  7. python列表和if语句的简单结合

    将列表所有元素打印出来 cars = ['toyota', 'honda', 'mazda', 'nissan', 'mitsubishi', 'subaru', 'suzuki', 'isuzu'] ...

  8. gRPC 本地服务搭建

    RPC RPC 原理 主流 RPC 框架 gRPC 概述 特点 服务端创建 定义服务 生成 gRPC 代码 服务端实现 客户端实现 踩坑记录 源码 RPC RPC 原理 RPC 框架的目标就是让远程服 ...

  9. LC 200 Number of Islands

    问题描述 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is ...

  10. spark的安装步骤

    官网:http://spark.apache.org/downloads.html 安装:tar -zxvf spark-2.4.3-bin-hadoop2.7.tgz#配置环境变量(vim ~/.b ...