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. JPA实现复杂条件分页查询

    相信熟悉Hibernate的人对于ORM给编程带来的便利于快捷一定不陌生,相对于MyBatis等需要编写复杂的SQL语句,ORM映射为我们带来的便利显而易见.但是,在获得便利的同时,失去的便是灵活性, ...

  2. emacs 只读打开文件

    emacs 只读打开文件 : C-x C-r emacs 让buffer区变成只读 : C-x C-q emacs 让只读buffer区变成可以保存修改 : C-x C-q

  3. Java基础系列--02_运算符和程序的语句

    运算符: (1)算术运算符: +,-,*,/,%,++,--(加.减.乘.除.取余.自增,自减) ++和--的注意事项: a:他们的作用是自增或者自减 b:使用 1.单独使用 放在操作数据的前面和后面 ...

  4. ajax实现用户登陆,退出,java做后端

    最近http老师布置了个任务,用cookie完成登陆,退出.Http老师讲的是node.js写后端,由于自己还是擅长java些,还是用Java做了. 以前跟着教程写过一个网站,当初是用jsp+serv ...

  5. MongoDB-BSON

    概念参考百科说明:BSON( Binary Serialized Document Format) 是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称.对表示方法,支持内嵌的文档对象和数组 ...

  6. 虚拟机网络连接方式导致的p地址为10.0.2.*的问题

    全世界都知道通过 ifconfig 命令查看本机ip地址,我当然希望安装的虚拟机和当前局域网的其他机器一样内网ip为192.168.1.*,如下图所示: 而当我执行该命令时,实际情况却是这样的: 解决 ...

  7. storybook实践

    很久之前就听说过storybook,一直想实践一下

  8. pycharm .sqlite文件拖动到Database里面为空

    pycharm .sqlite文件拖动到Database里面为空 查资料得到解决方法:

  9. docker 容器的启动方式

    1.Docker 优势: .更高效利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高.无论是应用执行速度.内存损耗或者文件存储速度,都要比传统 ...

  10. Android 1.7 中不支持 lambda 表达式

    Error:(129, 32) 错误: -source 1.7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) lambda expressio ...