UC_OS II学习笔记
是一个可以基于ROM运行的、可裁减的、抢占式、实时、多任务OS内核;
可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为 CPU 完全只属该程序自己。
OS包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
当任务执行完毕后(时间片到),他把自己的CPU寄存器所有内容保存到自己的堆栈中,同时把CPU让给别的任务,那么得到CPU使用权的任务把自己的CPU寄存器从自己的堆栈中放到真正的CPU寄存器中开始运行,就这样周而复始。
任务管理:建立任务时的优先级、堆栈
时间管理:通过定时中断来实现的
内存管理:给一个首地址、块大小、块数目。将连续地址数组链表化。
获取:指定一个内存控制块, 返回链表首部内存块地址,链表指针移到下一个空闲内存块;
释放:指定一个内存控制块以及要释放的内存块首地址。该内存块存放链表首个空闲内存块地址,并将自己赋值为首个空闲内存块。
邮箱:各个任务把自己的数据封装后以邮箱的形式发送给其它的任务使用,从而达到任务间通信的目的。一个指针型的变量,通常该指针指向一个包含了“消息”的特定数据结构。
1、µC/OS-II 是多任务,而且为每个任务开辟一个堆栈
2、µC/OS-II要用户在使用任何服务之前先调用 OSInit() [L1.5(2)]。它会建立两个任务:
空闲任务和统计任务,前者在没有其它任务处于就绪态时运行;后者计算 CPU 的利用率。
3、在 启动多任务OSStart() 之前用户至少要先建立一个任务
4、要使用堆栈检查操作必须用 OSTaskCreateExt()建立任务
5、OSMemCreate()函数建立并初始化一块内存区。内存区可以使用静态数组或在初始化时使用 malloc()函数建立。
msg = OSMemGet(CommMem, &err);
if (msg != (INT8U *)0) {
./* 内存块已经分配 */
}
6、
typedef struct { /* MEMORY CONTROL BLOCK */
void *OSMemAddr; /* Pointer to beginning of memory partition */
void *OSMemFreeList; /* Pointer to list of free memory blocks */
INT32U OSMemBlkSize; /* Size (in bytes) of each block of memory */
INT32U OSMemNBlks; /* Total number of blocks in this partition */
INT32U OSMemNFree; /* Number of memory blocks remaining in this partition */
} OS_MEM;
#define OS_EVENT_TYPE_UNUSED 0
#define OS_EVENT_TYPE_MBOX 1
#define OS_EVENT_TYPE_Q 2
#define OS_EVENT_TYPE_SEM 3
#define OS_EVENT_TYPE_MUTEX 4
#define OS_EVENT_TYPE_FLAG 5
typedef struct {
INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */
INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */
void *OSEventPtr; /* Pointer to message or queue structure */
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
} OS_EVENT;
7、调用 OSSchedLock()函数的任务独占 CPU,不管有没有其他高优先级的就绪任务。在这种情况下,中断仍然可以被接受和执行(中断必须允许)。OSSchedLock()函数和 OSSchedUnlock()函数必须配对使用。
任务调用了 OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。
8、OSSemCreate()函数建立并初始化一个信号量。信号量的作用如下:
允许一个任务和其他任务或者中断同步。
取得设备的使用权
标志事件的发生
OS_EVENT *DispSem;
void main(void)
{
.
OSInit(); /* 初始化μC/OS-Ⅱ */
.
DispSem = OSSemCreate(1); /* 建立显示设备的信号量 */
.
OSStart(); /* 启动多任务内核 */
}
定义全局变量--初始化--post--pend--flush
CAN2_GLOBAL OS_EVENT *CAN2Receive;
CAN2Receive = OSQCreate(pCAN2RevBuf,USE_CAN2_RX_BUF_SIZE); //CAN2接收消息队列
stcRxBUF msg;
msg = RxBUF(j);
CAN2Rx_OSQPost(CAN2Receive,&msg);
mg=OSQPend(CAN2Receive,0,&err);
curRxBuf = *(stcRxBUF *) mg;
OSQFlush(CAN2Receive);
9、CPU使用率
void FirstAndOnlyTask (void *pdata)
{
.
OSStatInit(); /* 计算CPU使用率 */
.
OSTaskCreate(ノ ); /* 建立其他任务 */
OSTaskCreate(ノ );
.
for (;;) {
}
}
10、
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);
11、OSTaskCreate()建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务必须为无限循环结构,且不能有返回点。
12、无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与 CPU 中断后寄存器入栈的顺序结构相同。
13、
在任务中必须调用μC/OS 提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到 CPU。
UC_OS II学习笔记的更多相关文章
- Arria10 SDI II学习笔记
12G-SDI16是什么意思? 关于 int_vpid_byte1 int_vpid_byte2 int_vpid_byte3 int_vpid_byte4 这些参数是不是如果外部数据有就不需要传输, ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- RAC学习笔记
RAC学习笔记 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 在学习Re ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JUC.Condition学习笔记[附详细源码解析]
目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Condition的数据结构 线程何时阻塞和释放 await()方法 ...
- JUC.Lock(锁机制)学习笔记[附详细源码解析]
锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...
随机推荐
- 2021羊城杯比赛复现(Crypto)
bigrsa 题目: from Crypto.Util.number import * from flag import * n1 = 10383529640908175186077053551474 ...
- 30天自制操作系统day2汇编语言
<30天自制操作系统>一书中第1天和第二天中有关汇编语言的程序的理解 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以下的记述用于标准FAT12格 ...
- linux 定时删除图以及crontab介绍
执行 sudo crontab -e 0 3 1 * * /etc/letsencrypt/certbot-auto renew --renew-hook "sudo nginx -s re ...
- Solution -「AGC 013E」「AT 2371」Placing Squares
\(\mathcal{Description}\) Link. 给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...
- php发送邮件 (phpmailer)
1.首先下载phpMailer文件官方文件https://sourceforge.net/projects/phpmailer/: 还有class.smtp.php. 2.去配置一下发送邮件的服务器, ...
- mysql 查询附近N公里内数据
mysql 查询一个地点(经纬度) 附近N公里内的数据.(根据一个地点的经纬度查询这个地点方圆几公里内的数据)1.创建测试表 CREATE TABLE `location` ( `id` int(10 ...
- SIMD编码/解码
在看SEAL库和HElib库中经常在编码中碰到打包(batch)技术,另外还提到了SIMD编码技术,有点困惑,编码.打包.SIMD到底有什么关系? 编码 在CKKS方案中,因为明文空间在复数域上,简单 ...
- Java中Vo、Po等对象的解释
PO:全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:全称是 busines ...
- Python中模块的定义及案例
1 a = '我是模块中的变量a' 2 3 def hi(): 4 a = '我是函数里的变量a' 5 print('函数"hi"已经运行!') 6 7 class Go2: 8 ...
- IGMP协议测试-网络测试仪实操
一.前言:IGMP协议用于IPv4系统向任何邻居组播路由器报告其组播成员资格.IP组播路由器自己本身也可以是一到多个组播组的成员.这时,组播路由器要实现协议的组播路由器部分. IGMP存在三个不同版本 ...