os_cpu.h文件

该文件主要是完成操作系统使用的内部数据类型、常数以及宏的定义,这些都是与处理器平台密切相关的;

第一部分

以下部分定义了系统内部常用的数据类型,为了增加系统的可移植性,系统内核只使用自己定义的INT8U、INT8S等数据类型,而不使用和编译器密切相关的unsigned char、unsigned short等数据类型;

所以,在不同处理器或者不同编译器平台下,这些数据类型的长短是不同的,需要特别注意;

定义了堆栈数据类型OS_STK,这是操作系统要求且必须定义的数据类型(根据处理器使用的堆栈位数决定数据类型);

定义了保护程序状态寄存器的数据类型OS_CPU_SR,这个数据类型只有在定义了OS_CRITICAL_METHOD为3时才会被系统使用到(该数据类型由程序状态寄存器的宽度决定);

typedef unsigned char  BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned short INT16U;
typedef signed short INT16S;
typedef unsigned int INT32U;
typedef signed int INT32S;
typedef float FP32;
typedef double FP64; typedef unsigned int OS_STK;
typedef unsigned int OS_CPU_SR;

第二部分

声明了几个在外部文件中(os_cpu_a.s)定义的函数,以供操作系统使用;

void  OSCtxSw(void);                   //普通任务切换函数
void OSIntCtxSw(void); //中断任务切换函数
void OSStartHighRdy(void); //启动最高优先级任务的函数
void OS_CPU_PendSVHandler(void);
void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(INT32U cnts);

第三部分

OS_CRITICAL_METHOD定义了系统进入临界代码前后,开关中断的方式;系统规定这个宏可以有三种不同的值,不同的值对应着不同的系统开关中断宏OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()的实现;

三种不同的情况分别为:

  • 当OS_CRITICAL_METHOD被定义的值为1时,采用第一种方式,即宏OS_ENTER_CRITICAL()只简单的调用处理器内部指令,关中断,宏OS_EXIT_CRITICAL()也是简单的调用处理器指令,开中断;这种方式最简单,但是会带来问题,若在进入临界段前后中断是打开的,那么这种方式不会有问题,若进入临界段前后中断是关闭的,那么在临界段代码退出后,系统中断就处于中断允许状态了;
  • 当OS_CRITICAL_METHOD被定义的值为2时,在进入临界区前,宏OS_ENTER_CRITICAL()需要将处理器程序状态寄存器(包含了中断允许标志)保存到堆栈中,然后执行关中断操作;退出临界区时,宏OS_EXIT_CRITICAL()需要从堆栈中读出前面所保存的数据并恢复到程序状态寄存器中;所以这种方式,不会改变进入临界段前后系统中断允许状态;但是同样会有出现问题的可能,堆栈如果在某种情况下被冲掉,在中断状态恢复时就会出现处理器异常;
  • 当OS_CRITICAL_METHOD被定义的值为3时,系统内每个需要调用开关中断宏的函数中都多了一个OS_CPU_SR类型的局部变量cpu_sr,该变量被用来记录程序状态寄存器(包含了中断允许标志)的值;在进入临界段时,将程序状态寄存器的值拷贝到cpu_sr中并关中断,退出临界段时将值恢复到程序状态寄存器中;
#define  OS_CRITICAL_METHOD   3u                           //临界区模式选择第三种

#if OS_CRITICAL_METHOD == 3u
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} //进入临界区,定义在os_cpu_a.asm中
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} //退出临界区
#endif

第四部分

定义了宏OS_TASK_SW(),在操作系统内部通过调用该宏来实现系统在两个任务之间的切换,这种切换是在非中断状态下,所以称为普通任务切换函数;

#define  OS_TASK_SW()   OSCtxSw() //任务切换函数OSCtxSw()定义在os_cpu_a.asm中;

定义了宏OS_STK_GROWTH,当值为1时,表示堆栈增长方向是从高地址往低地址增长;

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. dotnet core 在 MIPS 下的移值进度

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

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

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

  7. dm9000c 移值新内核 linux-4.1.24

    错误 1 /home/dm9000/dm9dev9000c.c:309: error: conflicting types for 'phy_read'include/linux/phy.h:637: ...

  8. s3c2440 移值u-boot-2016.03 第6篇 支持mtd yaffs 烧写

    1, 解决启动时的错误 Warning - bad CRC, using default environment 搜索发现 在 /tools/env/fw_env.c 中 /* 放在NAND FLAS ...

  9. s3c2440 移值u-boot-2016.03 第3篇 支持Nor flash 识别

    当选择,NOR flash 启用时,才可以访问 NOR FLASH ./common/board_r.c 364 line:initr_flash()flash_size = flash_init() ...

随机推荐

  1. 我的Windows日常——炫酷的windows组件命令行打开方式

    regedit -------注册表编辑器 gpedit.msc-------组策略编辑器 secpol.msc--------本地安全策略 control ----------控制面板 cmd--- ...

  2. 使用ranger对kafka进行鉴权

    使用ranger对kafka进行鉴权测试环境:ranger-kafka-plugin为0.6.3版本,kafka版本为kafka_2.10-0.10.1.1,且kafka broker为一个节点.一. ...

  3. torm入门(三)HelloWorld示例

    一.配置开发环境 storm有两种操作模式: 本地模式和远程模式.使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的t ...

  4. 【转】C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)

    using System.Timers;定时器事件代码 static void Main(string[] args) { Method(); #region 定时器事件 Timer aTimer = ...

  5. Deep Reinforcement Learning for Dialogue Generation 论文阅读

    本文来自李纪为博士的论文 Deep Reinforcement Learning for Dialogue Generation. 1,概述 当前在闲聊机器人中的主要技术框架都是seq2seq模型.但 ...

  6. [Alpha阶段]第十次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第十次Scrum Meeting 基本信息 名称 时间 地点 时长 第十次Scrum Meeting 19/04/15 大运村寝室6楼 35min ...

  7. Divide Candies CodeForces - 1056B (数学)

    Arkady and his friends love playing checkers on an n×nn×n field. The rows and the columns of the fie ...

  8. 一入OI深似海 1 —— 偶然遇见,命运选择

    记得还是三年级(还是四年级?人老了都忘了)吧, 那时候我还是个愣头青, 学校的编程班在每个班强制招人, 我就屁颠屁颠被赶去去上课了. 一开始的课完全听不懂, 导致没过多久我同班的人一个个走了, 我为了 ...

  9. Vim安装使用和配置

    卸载vim sudo apt-get remove --purge vim (--purge 是完全删除,会连配置文件一起删除) 也可以使用yum等其它方式安装 ,如果提示apt-get命令不存在可以 ...

  10. Flutter获取屏幕宽高和Widget大小

    我们平时在开发中的过程中通常都会获取屏幕或者 widget 的宽高用来做一些事情,在 Flutter 中,我们可以使用如下方法来获取屏幕或者 widget 的宽高. MediaQuery 一般情况下, ...