uCos-II移值(一)
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移值(一)的更多相关文章
- DE1-SOC开发板上搭建NIOS II处理器运行UCOS II
DE1-SOC开发板上搭建NIOS II处理器运行UCOS II 今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...
- 移值UCOS2到M4核与M3核的区别
之前移值过ucos2到stm32f2系列的单片机,这个单片机是属于arm的m3内核的.最近在学习永磁同步电机的控制,对于这个电机的控制,有比较多的数学计算,甚至于还有浮点的运算.所以用到了stm32f ...
- ucos ii 46个系统API函数解析
源: ucos ii 46个系统API函数解析
- FreeRTOS 和uCOS II的简单比较
转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...
- dotnet core 在 MIPS 下的移值进度
本文仍处于修订中 写在开始前 我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab i ...
- [LeetCode] Remove Duplicates from Sorted List II 移除有序链表中的重复项之二
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- dm9000c 移值新内核 linux-4.1.24
错误 1 /home/dm9000/dm9dev9000c.c:309: error: conflicting types for 'phy_read'include/linux/phy.h:637: ...
- s3c2440 移值u-boot-2016.03 第6篇 支持mtd yaffs 烧写
1, 解决启动时的错误 Warning - bad CRC, using default environment 搜索发现 在 /tools/env/fw_env.c 中 /* 放在NAND FLAS ...
- s3c2440 移值u-boot-2016.03 第3篇 支持Nor flash 识别
当选择,NOR flash 启用时,才可以访问 NOR FLASH ./common/board_r.c 364 line:initr_flash()flash_size = flash_init() ...
随机推荐
- JPA实现复杂条件分页查询
相信熟悉Hibernate的人对于ORM给编程带来的便利于快捷一定不陌生,相对于MyBatis等需要编写复杂的SQL语句,ORM映射为我们带来的便利显而易见.但是,在获得便利的同时,失去的便是灵活性, ...
- emacs 只读打开文件
emacs 只读打开文件 : C-x C-r emacs 让buffer区变成只读 : C-x C-q emacs 让只读buffer区变成可以保存修改 : C-x C-q
- Java基础系列--02_运算符和程序的语句
运算符: (1)算术运算符: +,-,*,/,%,++,--(加.减.乘.除.取余.自增,自减) ++和--的注意事项: a:他们的作用是自增或者自减 b:使用 1.单独使用 放在操作数据的前面和后面 ...
- ajax实现用户登陆,退出,java做后端
最近http老师布置了个任务,用cookie完成登陆,退出.Http老师讲的是node.js写后端,由于自己还是擅长java些,还是用Java做了. 以前跟着教程写过一个网站,当初是用jsp+serv ...
- MongoDB-BSON
概念参考百科说明:BSON( Binary Serialized Document Format) 是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称.对表示方法,支持内嵌的文档对象和数组 ...
- 虚拟机网络连接方式导致的p地址为10.0.2.*的问题
全世界都知道通过 ifconfig 命令查看本机ip地址,我当然希望安装的虚拟机和当前局域网的其他机器一样内网ip为192.168.1.*,如下图所示: 而当我执行该命令时,实际情况却是这样的: 解决 ...
- storybook实践
很久之前就听说过storybook,一直想实践一下
- pycharm .sqlite文件拖动到Database里面为空
pycharm .sqlite文件拖动到Database里面为空 查资料得到解决方法:
- docker 容器的启动方式
1.Docker 优势: .更高效利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高.无论是应用执行速度.内存损耗或者文件存储速度,都要比传统 ...
- Android 1.7 中不支持 lambda 表达式
Error:(129, 32) 错误: -source 1.7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) lambda expressio ...