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() ...
随机推荐
- Redis 主从复制原理及雪崩 穿透问题
定义: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMw ...
- web安全基础第一天
编码:url编码 base64编码:末尾有俩个==号 md5加密:16位或者32位 1.whois查询 :站长邮箱,联系人,备案 旁站c段&子域名. ( 大数据平台和bing接口查询 :Zo ...
- kubeadm快速搭建k8s集群
环境 master01:192.168.1.110 (最少2核CPU) node01:192.168.1.100 规划 services网络:10.96.0.0/12 pod网络:10.244.0.0 ...
- React 精要面试题讲解(一) 单向数据流
react 单向数据流概念 'react框架是怎样的数据流向?'||'react单向数据流是怎样的概念 ?' 解答这个问题之前,我们首先得知道,js框架是个怎样的概念. 框架:具备一定**编程思想** ...
- 关于php中 json_encode 编码成json数据参数说明
JSON_UNESCAPED_SLASHES 编码不要转义符 \ 反斜杠 JSON_UNESCAPED_UNICODE 编码不转义成 unicode 字符串 如果如果多个参数可以用 | 隔开添 ...
- 使用队列实现栈(1)(Java)
class MyStack { private Queue q1; private Queue q2; public MyStack(int size) { this.q1 = new Queue(s ...
- H(X|Y)的推到过程
- SpringCloud---网关概念、Zuul项目搭建(六)
SpringCloud---网关概念.Zuul项目搭建(六) 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...
- springboot 的部分细节
Application.properties 中#指定端口号 server.port= #指定访问路径必须以/crud/xxx 开始 server.servlet.context-path=/crud ...
- table 里输入rules 验证
HTML <el-form ref='from' :model="fromData"> <el-table ref="tableman" bo ...