《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记
ucos-ii学习笔记
2 ucos-ii 学习笔记——信号量的原理及使用
#include "INCLUDES.h"
#define TASK_STK_SIZE 512
char *s1="MyTask"; //定义一个错误信息 INT8U y=0; OS_EVENT *Fun_Semp; //声明信号量 是事件控制块 ECB 类型的 //注意,前面有一个例子 2 定义了互斥信号量,定义如下 //BOOLEAN ac_key; //信号量,互斥信号量 实质上就是一个标志位,是一个全局变量,来标 志共享资源的访问情况 //这样,当已经有任务访问共享资源时,其他的任务就不能访问,知道该资源未被访问,其他 的任务才可以进行访问 //注意这两个信号量的区别和使用情况
INT8U x=0,y=0; //字符显示位置
//声明两个任务函数 void MyTask(void *data); void YouTask(void *data);
void main (void) {
char *s_m="L"; OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw);
OS_STK OS_STK OS_STK
StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 MyTaskStk[TASK_STK_SIZE]; YouTaskStk[TASK_STK_SIZE];
void Fun(INT8U x,INT8U y);
void StartTask(void *data); void MyTask(void *data); void YouTask(void *data);
pdata=pdata; for (;;) {
嵌入式实时操作系统_uCOSII
uC/OS-II北京邮电大学计算机学院 邝 坚 2011年10月教材及参考文献《嵌入式实时操作系统 uC/OS-II(第2 版)》,Jean brosse, 邵贝贝, 北航出版 社, 2003年1月uC/OS-II的主要特点实时性可确定:绝大多数系统服务的执行时间具有可确定 性,不依赖于用户应用程序Task数目的多少。
多任务、独立栈:最多64个Task,基于优先级抢占调度方 式。
每个Task有自身独立的堆栈。
可裁减性:系统最小可裁减到几K到十几K,这种裁减还可 以做到基于函数级。
可移植性:与CPU体系结构相关部分用汇编编写,其他功 能组件CPU无关。
可靠、稳定性:由整个系统设计来保证,市场验证。
美国 联邦航空管理局(FAA)认证。
开源代码:内核约5500行C代码。
可固化:面向嵌入式应用。
系统功能实时内核 任务管理 时间管理 信号量、互斥信号量管理 事件标志组管理 消息邮箱管理 消息队列管理 内存管理 …Targets x86 68k PPC CPU32 i960 SPARC ARM MIPS XScale …Typical development configurationEthernetRS-232Development HostTargetTypical scenario:1. Boot target. 4. Download object module. 2. Attach target server. 5. Test & Debug. 3. Edit & compile. 6. Return to 3 or 1 as necessaryMulti-TaskingTask是代码运行的一个映像,从系统的角 度看,Task是竞争系统资源的最小运行单 元。
Task可以使用或者等待CPU、I/O设备 及内存空间等系统资源,并独立于其它的 Task,与它们一起并发运行。
Task OperationPriority-base preemptive scheduling(基 于优先级的抢占式调度)Task调度器上锁和开锁给调度器上锁函数OSSchedlock() 用于临 时禁止任务调度,直到任务完成后调用给 调度器开锁函数OSSchedUnlock()为止。
嵌入式μCOS-II内核实验四(哲学家就餐问题的实现)
目录
• 引言 • 哲学家就餐问题概述 • μcos-ii内核任务管理 • 哲学家就餐问题的μcos-ii实现 • 实验结果与分析 • 总结与展望
01
引言
嵌入式系统与μcos-ii内核简介
嵌入式系统
是一种专用的计算机系统,主要用于控制、监视或帮助操作 机器设备。它通常具有实时性、可靠性和低功耗等特点,广 泛应用于工业控制、智能家居、医疗设备等领域。
任务优先级与调度
任务优先级
在μcos-ii内核中,每个任务都有自己 的优先级。优先级高的任务会优先获 得CPU的使用权。
任务调度
μcos-ii内核使用基于优先级的抢占式任务 调度算法。当一个高优先级的任务就绪时, 内核会立即抢占当前正在运行的任务,并切 换到高优先级的任务上运行。
任务同步与通信
任务同步
解决方案的分类与比较
解决方案分类
解决哲学家就餐问题的方案可以分为两类:静态方案和动态方案。静态方案在 系统启动时分配固定的资源,而动态方案则在运行时动态地分配资源。
解决方案比较
静态方案实现简单,但可能导致死锁或饥饿问题。动态方案可以更好地解决这 些问题,但实现起来较为复杂,需要更多的系统资源和时间。在实际应用中, 需要根据具体需求和系统限制选择合适的解决方案。
05
实验结果与分析
实验环境与配置
01
硬件平台
ARM Cortex-M4微控制器 (具体型号为
STM32F407ZGT6)
02
开发环境
Keil uVision5
03
04
实验任务
实现基于μcos-ii内核的多任务 切换
配置参数
任务优先级、任务堆栈大小、 任务状态等
嵌入式系统UCOS2学习
嵌入式系统UCOS2学习/s/blog_5f0bed160100tqnv.html20113、非空闲任务控制块双向链表ucos-II的任务状态l 睡眠态(Dormant):指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理。
把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。
一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
l 就绪态:当任务一旦建立,这个任务就进入就绪态准备运行。
l 运行态:调用OSStart()可以启动多任务。
OSStart()函数运行进入就绪态的优先级最高的任务。
就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。
l 等待状态:正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。
这个任务于是进入等待状态。
正在运行的任务期待某一事件的发生时也要等待,手段是调用以下几个函数之一:OSFlagPend()、OSSemPend()、OSMutexPend()、OSMboxPend(),或OSQPend()。
如果某事件未发生,调用后任务进入了等待状态(WAITING)。
l 中断服务态:正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。
被中断了的任务就进入了中断服务态(ISR)。
任务控制块TCB的管理1、任务块数组定义(OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS];)应用程序中可以有的最多任务数(OS_MAX_TASKS)是在文件OS_CFG.H中定义的。
这个最多任务数也是μC/OS-Ⅱ分配给用户程序的最多任务控制块OS_TCBs的数目。
将OS_MAX_TASKS的数目设置为用户应用程序实际需要的任务数可以减小RAM的需求量。
嵌入式实时操作系统uCOS-II
北 华 大学 任哲
2006 广州
为什么要学习μC/OS-II
一.凡从事嵌入式系统开发工作的人,必须 对嵌入式操作系统有足够的了解。
二.对于初学者,从μC/OS-II开始是个明智的选择。 1. μC/OS-II麻雀虽小,却五脏基本全(它是个微内 核)。 2.可以学习实时系统的一些编程技巧。 3.可以把在学校中学到的操作系统抽象概念具体化。 4.具有很强的实用性。 5.学习数据结构应用的好例子。
操作系统中经常使用 的数据结构(堆栈)
按规主主程照则要先 要 序组用用模织数进于块的组后的数来出嵌据实套结现运构行
什么是多任务系统
处理器如何进行程序的
切换? 并简单发地:说,由就同是一能用个一处个理处器理并轮器发示过换意程图地
运并行发多(个注程意序,。不或是者同说时是由!多)个
程地运序行轮多班个地程占序的用计处算理机器管理这系个统资。源。 且在占用这个资源期间,并不一 定能够把程序运行完毕。
讲座的主要内容
一.计算机操作系统的基本概念 二.操作系统中常用的数据结构 三.并发操作系统的概念 四.任务的要素 五. μC/OS-II的任务管理(任务调度) 六. μC/OS-II的中断和时钟 七. μC/OS-II的任务的同步与通信 八. μC/OS-II的存储管理 九.硬件抽象层和测试台
什么是计算机操作系统
同,但每个元素ቤተ መጻሕፍቲ ባይዱ有一个编号; a+1
4。元素名去掉编号(下标), 得到的是数组名,数组名是个
a+2
指针。
a+3
int a[10] a[0] a[1] a[2] a[3]
使用上的特点:
1。分类存放; 2。检索速度快且恒 定; 3。缺点:占用连续 空间大
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分D
.OSTCBOpt 存放有关任务的附加信息。
当用户将OS_TASK_CREATE_EXT_EN设为1 时,这个变量才有效。
通过设置该选项,可起用任务栈检查功能。
例如:作为参数传给OSTaskCreateExt()。
μC/OS-Ⅱ目前只支持 3 个选择项:OS_TASK_OTP_STK_CHK, OS_TASK_OPT_STK_CLR 和OS_TASK_OPT_SAVE_FP 。
OS_TASK_OTP_STK_CHK 用于告知TaskCreateExt(),在任务建立的时候任务栈检验功能得到了允许。
S_TASK_OPT_STK_CLR 表示任务建立的时候任务栈要清零,只有在用户需要有栈检验功能时,才需要将栈清零。
如果不定义OS_TASK_OPT_STK_CLR,而后又建立、删除了任务,栈检验功能报告的栈使用情况将是错误的。
假如任务一旦建立就决不会被删除,且用户初始化时,已将RAM 清过零,就不需要再定义OS_TASK_OPT_STK_CLR,这样可以节约程序执行时间。
传递了OS_TASK_OPT_STK_CLR 将增加TaskCreateExt()函数的执行时间,因为要将栈空间清零。
栈容量越大,清零花的时间越长。
最后一个选择项OS_TASK_OPT_SAVE_FP 通知TaskCreateExt(),任务要做浮点运算。
如果微处理器有硬件的浮点协处理器,则所建立的任务在做任务调度切换时,会保存浮点寄存器的内容。
.OSTCBId 用于存储任务的识别码。
该变量现在没有使用,留给将来扩展用。
.OSTCBNext 和.OSTCBPrev 用于任务控制块OS_TCBs 的双向使用表链接,该链表在时钟节拍函数OSTimeTick()中使用,用于刷新各个任务的任务延迟变量.OSTCBDly。
OSTCBNext、OSTCBPrev:用于将任务控制块OS_TCB插入到空闲链表;或在任务建立的时候链接到双向使用链表中;或在任务删除的时候从链表中被删除。
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分E
根据给定的优先级通过设定就续表,使任务进入就绪态(参见程序清单L3.1.7)的例子:●假设要使优先级为12的任务进入就绪状态,12(1100b)即任务的标识号,就是要将OSRdyTbl[1]的第4位置1,且将OSRdyGrp的第1位置1。
依照算法,将该任务放入就绪表的相应数学表达式为:OSRdyGrp |=0x02 ;OSMapTbl[12>>3]OSRdyTbl[1] |=0x10 ;OSMapTbl[4]●而要让优先级为21的任务进入就绪态,21(10101b)即任务的标识号,就是要将OSRdyTbl[2]的第5位置1,且将OSRdyGrp的第2位置1。
依照算法,将该任务放入就绪表的相应数学表达式为:OSRdyGrp |=0x04 ;OSMapTbl[21>>3]OSRdyTbl[2] |=0x20 ;OSMapTbl[5]从上面的计算可知:若要将OSRdyGrp及OSRdyTbl[]的第n位置1,可通过分别把OSRdyGrp及OSRdyTbl[]的值与2n 相或来实现。
在μC/OS-Ⅱ中,已经把2n的n=0-7的8个值先计算好作为常数存在数组OSMapTbl[7]中了,这正是前面的表3.1 OSMapTbl[]: OSMapTbl[0] = 20 = 0x01(0000 0001)OSMapTbl[1] = 21 = 0x02(0000 0010)……OSMapTbl[4] = 24 = 0x10(0001 0000)……OSMapTbl[7] = 27 = 0x80(1000 0000)(4)任务调度器调度是内核的主要职责之一,就是要决定该轮到哪个任务运行了。
在时间片轮转调度法中,当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间片,然后切换给另一个任务。
所以,也叫做时间片调度。
内核在满足以下条件时,把CPU控制权交给下一个处于就绪态的任务:●当前任务已无事可做●当前任务在时间片还没结束时已经完成了。
嵌入式操作系统读书笔记
嵌入式操作系统—读书笔记上网查了一些关于嵌入式操作系统的一些资料,现整理如下:由于嵌入式实时操作系统可以支持多任务,使得程序开发更加容易,在便于维护的同时还能提高系统的稳定性和可靠性,所以逐步成为嵌入式系统的重要组成部分,对嵌入式操作系统的研究变得尤为重要。
1.任务管理概述:任务管理是嵌入式实时操作系统的核心和灵魂,决定了操作系统的实时性能。
它通常包含优先级设置、多任务调度机制和时间确定性等部分。
1 优先级设置嵌入式操作系统支持多任务,每个任务都具有优先级,任务越重要,赋予的优先级应越高。
优先级的设置分为静态优先级和动态优先级两种。
静态优先级指的是每个任务在运行前都被赋予一个优先级,而且这个优先级在系统运行期间是不能改变的;动态优先级则是指每个任务的优先级(特别是应用程序的优先级)在系统运行时可以动态地改变。
2 多任务调度机制任务调度主要是协调任务对计算机系统资源的争夺使用。
对系统资源非常匮乏的嵌入式系统来说,任务调度尤为重要,它直接影响到系统的实时性能。
通常,多任务调度机制分为基于优先级抢占式调度和时间片轮转调度。
基于优先级抢占式调度:系统中每个任务都有一个优先级,内核总是将CPU分配给处于就绪态的优先级最高的任务运行。
如果系统发现就绪队列中有比当前运行任务更高的优先级任务,就把当前运行任务置于就绪队列中,调入高优先级任务运行。
系统采用优先级抢占方式进行调度,可以保证重要的突发事件及时得到处理。
时间片轮转调度:让优先级相同的处于就绪状态的任务按时间片使用CPU,以防止同优先级的某一任务长时间独占CPU。
在一般情况下,嵌入式实时操作系统采用基于优先级抢占式调度与时间片轮转调度相结合的调度机制。
3 时间的可确定性嵌入式实时操作系统甬数调用与服务的执行时间应具有可确定性。
系统服务的执行时间不依赖于应用程序任务的多少。
2.任务调度概述:任务调度(schedulers)是内核的主要职责,实际上它就是一个法官,决定当前由哪个任务占用CPU,多数实时内核都是基于优先级调度算法的,每个任务根据其重要程度的不同被赋予一定的优先级。
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第二部分
③链接器选项设置。
在Debug Settings 对话框中选择ARM Linker 列表项,将出现如图1-15所示的ARM Linker选项组对话框。
其中Output 选项卡用于控制链接器进行链接操作的类型。
选择Simple链接类型时,在Output 选项卡的Simple image 文本框中设置链接的Read-Only (只读)和Read-Write(读写)地址,如图2-5所示,链接器将依照所设定的地址映像方式,生成简单的ELF格式的映像文件。
地址0x30008000是开发板上SDRAM 的真实地址,是由系统的硬件决定的。
0x30200000 指的是系统可读写的内存地址。
也就是说,在0x30008000∼0x30200000 之间是只读区域,存放程序的代码段,从0x30200000 开始是程序的数据段,可读可写。
图1-15 设置链接地址范围以上只是一种简单设置,如果程序需要用到标准C 库函数时,可使用scatter 文件来设置链接地址;在标准C 中使用malloc 及其相关的函数,需要使用系统的堆(Heap)空间时,也可以通过scatter 文件来描述系统HEAP 段的位置。
这时,需要按图1-16进行链接地址的设置。
图1-16 通过scatter 文件设置链接地址如图1-16,在Output 选项卡中,选择LinkType 为Scattered,输入scatter文件名为scat_ram.scf;然后切换到Options 选项卡在Image Entry Point 框中输入0x30008000,把程序的入口定位在0x30008000。
(也可以在图1-16 的Command Line 框中直接输入-entry 0x30008000 -scatter scat_ram.scf 进行上述设置。
)针对2410-S 开发板,scat_ram.scf 文件内容如下:LOAD 0x30008000 ;load region{RAM_EXEC +0 ;PC{startup.o (init, +FIRST)* (+RO)}L0PAGETABLE 0x30200000 UNINIT ;about 2MByte offset SDRAM{pagetable.o (+ZI)}STACKS +0x100000 UNINIT ;64KByte under L0 pagetable{stack.o (+ZI)}RAM +0{* (+RW,+ZI)}HEAP +0 UNINITheap.o (+ZI)}EXCEPTION_EXEC 0 OVERLAY ;exception region{exception.o (+RO)}}该文件创建了一个RAM_LOAD程序区域,起始地址为0x30008000和6个数据区域(ROM_EXEC, RAM_EXEC, RAM, HEAP, STACKS, EXCEPTION_EXEC)。
UCOS-II移植ARM的读书笔记
UCOS-II移植ARM的读书笔记导读:昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了,关键是我是第一次也是正式开始移植的学习之路啊,今天在工作之前先把昨天的笔记重新回顾一下,UCOS-II的移植需要提供2,真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是件好事,可以让我今天在不借助其他的帮助的情况下自己看代码自己跟自己讲一遍,其实很多看起来是倒霉看起来是灰心的事情把我们的观点换一下那么就是一件好事。
这样的情况发生在我的身上已经挺多次了。
好啦,废话不说,开始补昨天的日记UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型只是按照不同的编译器编写对应的数据类型的typedef对应于ARM7的数据类型的编写如下typedef unsigned char BOOLEAN; /* 布尔变量*/typedef unsigned char INT8U; /* 无符号8位整型变量*/typedef signed char INT8S; /* 有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed short INT16S; /* 有符号16位整型变量*/typedef unsigned int INT32U; /* 无符号32位整型变量*/typedef signed int INT32S; /* 有符号32位整型变量*/typedef float FP32; /* 单精度浮点数(32位长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32Utypedef INT32U OS_STK; /* 堆栈是32位宽度*/接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式*/接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。
《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记
《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记第一章嵌入式实时操作系统的概念1.计算机操作系统:对计算机系统资源进行管理,并向计算机用户提供若干服务。
OR:计算机操作系统是计算机硬件的一个软件包装,它为应用程序设计人员提供了一个更便于使用的虚拟计算机。
2.操作系统功能:1)处理器的管理:(1)中断管理;(2)对处理器工作进行调度;2)存储的管理:3)设备的管理:4)文件的管理:5)网络和通信的管理:6)提供用户接口:3.嵌入式系统:对对象进行自动化控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。
4.嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件。
5.实时操作系统:(1)多任务系统;(2)任务切换时间与系统中的任务数无关;(3)中断延时的时间可预知并尽可能短。
第二章uC/OS-II中的任务1.uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。
2.UC/OS-II的任务组成部分:(1)任务程序代码:任务的执行部分;(2)任务堆栈:保存任务工作环境;(3)任务控制块:保存任务属性。
3.uC/OS-II的两种任务:用户任务:由应用程序设计者编写的任务。
系统任务:系统提供的任务。
4.任务的状态:(1)睡眠状态:是否配置或剥夺任务控制块的配置情况;(2)就绪状态:任务就绪表进行就绪登记,等待优先级,具备运行充分条件;(3)运行状态:获得CPU使用权限,任何时候只有一个任务处于运行状态。
(4)等待状态:正在运行的任务,需要等待一段时间或一件事件发生在运行,暂时交出CPU使用权。
5.用户任务代码结构:任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构叫做超循环结构。
6.OSTakCreate()用来创建任务的函数;OSStart()用来启动各项任务的函数,启动后,任务就交由操作系统来管理和调度了。
uCOS-II嵌入式实时操作系统原理与移植
1,决定是否进行上下文切换 2,保存当前执行进程的上下文
包括程序计数器PC、通用寄存器、 与任务有关的数组、表格、链等。
uC/OS-II采用可
剥夺实时内核,
含义是最高优先
0
级任务一旦就绪,
总能得到CPU使
1
用权。
系统保留4个
2
最高优先级
3
4
5
执行该任务
6
7
……
uC/OS-II 的中断(ISR)
任务2—TCB--就绪—任务堆栈
任务3--TCB--等待—任务堆栈
任务4--TCB --睡眠—任务堆栈
uC/OS-II的任务之间通信
任务之间共享的信息成为事件,同一时刻只能有一个任务使 用共享信息,因此为每个事件构建一个事件控制块ECB来保 证任务之间安全共享信息。事件控制块总数由OS_CFG.H中的 OS_MAX_EVENTS定义。事件包括信号量、邮箱、消息队列。
内存组配置文件 储存器映射MMU初始化与操作 Nand flash控制器初始化与操作
与CPU相关的配置选项 开机画面BMP文件 开机画面BMP文件 开机画面BMP文件 初始化mini2440目标板 定义任务优先级、堆栈大小及函数原型声明 初始化操作系统定时器0 开机画面BMP文件
关于信号量和等待的API功能函数
//任务循环
{
OSPrintf("\nEnter Main Task\n");
OSTimeDly(OS_TICKS_PER_SEC); //将任务延迟一段时间,进入等待态
}
}
uC/OS-II的任务都运行在无限循环中。
欢迎访问机电技术博客:/spurtltl@126/
uCOSII原理及应用
任务控制块
用于存储任务的运行状态和控制信息,包括任 务的优先级、状态、堆栈指针等。
任务切换函数
用于实现任务之间的切换,包括保存当前任务的上下文和恢复下一个任务的上 下文。
ucosii的任务管理
创建任务
通过调用ucosii提供的函数, 创建新的任务并分配相应的 资源。
在物联网应用中,ucosii能够为各种智能硬件提供统一的操 作系统平台,实现设备的互联互通和智能化管理。同时, ucosii还提供了丰富的中间件和驱动程序,方便开发者快速 开发出各种智能硬件和应用软件。
ucosii在嵌入式系统中的应用
嵌入式系统是指嵌入到硬件中的计算机系统,具有特定的功能和性能要求。ucosii作为一种实时操作 系统,在嵌入式系统中也有着广泛的应用。
调试工具
使用JTAG、SWD等调试工具,通过串口、网络等方式与目标板进行通信,实现程序的 下载、运行、断点设置等操作。
调试步骤
首先确认硬件连接正确,然后通过调试工具将程序下载到目标板中,设置断点并运行程 序,观察程序运行过程中变量的变化和程序的执行流程。
常见问题
硬件连接问题、调试工具配置问题、程序编译错误等。
ucosii的性能分析
性能指标
响应时间、吞吐量、资源利用率等。
分析方法
通过代码审查、性能测试、瓶颈分析等方法,找出影响性能的 关键因素,如算法复杂度、内存访问模式、IO性能等。
优化建议
针对分析结果,提出优化建议,如改进算法、优化数据结 构、减少IO操作等。
ucosii的优化建议
算法优化
通过改进算法,减少计算量和复杂度,提高程序执行效率。
易用性
ucos学习笔记
1、其他大2、学习UCOS过程也是学习c语言的过程。
3、只有不断使用才能真正的学会------只看代码是永远学不会的:作者是在使用中创作的,使用者也必须在使用中学习---------很多知识、道理都是如此。
4任务属于软中断,中断则是硬中断,总体上因此任何切换都会做好现场保护,从而保证无缝链接。
5、:寄存器又往往是以结构体的形式存在6、学习计划------第一遍学习仅仅是了解,远远———————————————————————————————————————thumb指令要点Pending-------挂起;CFG---configuration----配置;Stack----堆(读dui)Kernel----内核;bsp----板级支持包;core----要点核心。
Tcb---任务控制部件IMPORT--------外部c函数定义,内部汇编使用EXPORT--------内部定义,供外部c代码使用使用THUMB-----------表明以下为thumb指令汇编标号----------无需在后面加冒号“;”或者其他任何符号------如os_cpu_a.asm与启动代码中都有的PRESERVE8。
LR-------链接寄存器(存储函数,中断,异常等的返回地址------very important)---LR赋给PC 后从断点处开始执行原来任务********。
Ctr------所有的ctr都表示计数器Pend------挂起(挂件)、悬而未决;suspend---使悬浮,使延缓POST-------释放、发送、解挂。
Mbox----邮箱;sem----信号量(semaphore)----发信号,打旗语Q-----消息队列;mutex----------互斥型信号量项管理Mem-------memory内存管理移植要点Task为进程1、需要移植的文件:(仅仅需要移植与处理器相关的代码---名称带有CPU)OS_CPU.HOS_CPU_C.COS_CPU_A.ASM2、堆栈(stack)--------用于任务切换时保存被调度任务的寄存器内容(包括PC,LR等等)———————————————————————————————————————UCOS摘要OS启动过程:调用OSInit进行初始化--------使用TaskCreate创建几个进程/Task-------调用OSStart。
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分A
还可以多个事件组合发信号给多个任务,如图3-10 所示。
典型地,8 个、16 个或32个事件可以组合在一起,每个事件占一位(bit)。
任务或中断服务可以给某一位置位或复位,当任务所需的事件都发生了,该任务继续执行,至于哪个任务该继续执行,是在一组新的事件发生时确定的,即在事件位置位时确定的。
事件图3-10 事件标志 许多内核,如μC/OS-Ⅱ,支持事件标志,提供事件标志置位、事件标志清零和等待事件标志等服务。
事件标志既可以是独立型也可以是关联型的。
任务间通信当需要任务与中断服务程序(ISR )通信时,只能通过全局变量或在ISR 定义的静态局部变量,这样才能保证,ISR 结束后传递内容依然存在。
要注意的是,必须保证每个任务或中断服务子程序独享该变量。
在ISR 中确保独享的唯一办法是关中断。
而且,任务不知道何时中断服务子程序修改了该变量,为此需要中断服务子程序以信号量方式发信号给它,或者是该任务以查询方式不断地周期性查询该变量的值。
如果是两个任务共享某变量,各任务实现独享该变量的方法可以是关中断,再开中断,也可以考虑使用信号量。
否则,就要考虑使用邮箱或消息队列。
消息邮箱通过内核服务还可以给任务发送消息。
典型的消息邮箱(message mail box )也称作交换消息,借助一个指针型变量,一个任务或一个中断服务程序通过内核服务,把一则消息(即一个指针)放到邮箱里去。
同样,一个或多个任务可以通过内核服务接收这则消息。
发送消息的任务和接收消息的任务约定,该指针指向的内容就是那则消息。
每个邮箱有相应的正在等待消息的任务列表,需要得到消息的任务会因为邮箱是空的而被挂起,且被记录到等待消息的任务表中,直到收到消息。
一般地说,内核允许用户定义等待超时,等待消息的时间超过了,仍然没有收到该消息,该任务进入就绪态,并返回出错信息,报告等待超时错误。
消息放入邮箱后,内核要么把该消息传给等待消息的任务表中优先级最高的那个任务(基于优先级),要么把消息传给最先开始等待消息的任务(基于先进先出)。
uCOS-II读书的一点笔记
uC/OS-II读书的一点笔记重入与不可重入:可重入函数指当一个函数在被调用时,同时还能被其他函数调用,且不会产生错误.不可重入函数则不能同时被多次调用,多次调用可能会产生错误.例子:某函数有一个变量为全局变量,则如果该函数有多个实例在交替运行的话,由于同时存取同一全局变量,导致该变量被不同实例改变而引起错误.信号量:与同一共享数据打交道(可能是全局变量,也可能是共享资源如UART,打印机等)的任务调用等待信号量函数OSSemPend(),处理完后调用释放信号量函数OSSemPost().为防止无限等待可设置等待超时.例子://任务Task要存取共享数据,如果该数据正在被其他任务使用,则任务Task只能等待别的任务用//完,然后分配给任务Task使用.用完后释放该信号量,以供给其他任务使用(或者说将资源归还//给操作系统).void Task(void){OSSemPend(...);perform operation; //porcess the dataOSSemPost(...);}信号量也可能是隐藏的.如多任务共享UART时,信号量可隐藏在驱动函数中.信号量操作:初始化/建立INITILIZE/CREATE等待信号/挂起W AIT/PEND给信号SIGNAL/POST信号量类型:二进制0/1计数型0 ~ 2^width - 1如果某种资源只有1个,可用二进制型信号量,如RS232接口.如果资源有多个,可用计数型信号量,如系统缓冲区一般有多个.死锁:两个任务无限期相互等待对方控制的资源.可用信号量等待超时来化解.事件标志(Event Flag)用于任务与多个事件同步.可用多个事件的组合发信号给多个任务.可将8/16/32个事件标志组合在一起,当任务所需的事件都发生了,任务结束挂起,继续运行任务间通讯(Intertask Communication)两个途径:1.通过全局变量.与中断函数进行通讯只能通过全局变量.2.发送消息给另一个任务.发送消息的方式有邮箱(Mail Box)和消息队列(Message Queue)邮箱(Mail Box)一个任务通过内核服务给另一个任务发消息.内核提供的邮箱服务:邮箱内消息内容初始化;将消息放入邮箱(POST);等待有消息进入邮箱(PEND);例子:TASK1 --(POST)--> MAIL BOX --(PEND)--> TASK2可在主程序中创建邮箱,则在任务中就可直接使用.疑问:也可在任务中创建邮箱,但此时,邮箱能否接收其他任务发送消息?能否发送消息给其他任务?消息队列(Message Queue)实际上是邮箱阵列.任务或ISR可将消息放入消息队列(POST),一个或多个任务可从消息队列中得到消息.传递的消息实际上是传递的指针指向的内容.消息队列的进出通常有规则,如FIFO.例子:ISR --(POST)--> MSG QUEUE --(PEND)--> TASK疑问:消息队列属于某个任务?还是所有任务公用的?任务能从消息队列中取得消息,并执行相应的操作.任务也可以向外发送消息,但是是否应该指明发送的消息是送给谁的?在Windows系统的应用程序中,程序的运行是基于事件驱动,消息循环的.每个应用程序进程都有自己的消息队列.如一个进程1发送消息给进程2,进程2收到消息便继续往下执行,否则就挂起什么都不干.也即是没有事件的驱动,程序是不往下运行的.程序的运行就是依靠不断的消息循环来进行下去,程序从消息队列中接收自己的消息,而发送消息时需指明将消息送给哪个进程.某一个进程发送一条消息,指明了需要送给哪个进程,该消息进入系统的消息队列,系统将该则消息投递到目的进程的消息缓存中.而接收消息的进程则读取消息并处理消息.在这个过程中,系统就像一个邮局,进程发送消息就像寄信,系统投递消息就像邮递员送信.在uC/OS中,可以创建一个消息队列,并返回一个该消息队列的标识,用户任务就可以通过这个标识向队列中发送消息或接收消息,这样看来不在发送消息时指定接收消息的任务是可以的.但当任务较多,且创建了较多的消息队列后,多个任务使用消息队列时是否会产生误发送或误接收等问题.对于uC/OS中的其他类型资源如Mail Box也是如此.用户应用uC/OS系统的框架:main(){...OSInit();...OSTaskCreate();...OSStart();}OSInit()会进行一些初始化,包括Mail Box,Queue,Memory Partition等的初始化.并创建OS_Idle_Task.OSTaskCreate()用来创建用户任务,uC/OS应该也支持动态创建任务,即在用户任务中来创建其他任务,并可将其删除.不过uC/OS称任务被删除后,代码仍在,只是不再调度该任务.而Linux则是将任务从内存中释放.这可能与CPU有关.如果是哈佛结构的(如51单片机),代码是存放在ROM中的,无法删除,一般对于嵌入式系统而言,多数都是属于哈佛结构的CPU吧.而PC机的CPU是普林斯顿结构,程序代码和数据都是存放于内存中的,当一个任务不再运行了,就可释放其占据的内存空间,以供其他程序使用.OSStart()开始进行调度.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章嵌入式实时操作系统的概念1. 计算机操作系统:对计算机系统资源进行管理,并向计算机用户提供若干服务。
OR:计算机操作系统是计算机硬件的一个软件包装,它为应用程序设计人员提供了一个更便于使用的虚拟计算机。
2. 操作系统功能:1)处理器的管理:(1) 中断管理;(2)对处理器工作进行调度;2)存储的管理:3)设备的管理:4)文件的管理:5)网络和通信的管理:6)提供用户接口:3. 嵌入式系统:对对象进行自动化控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。
4. 嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件。
5. 实时操作系统:(1)多任务系统;(2)任务切换时间与系统中的任务数无关;(3)中断延时的时间可预知并尽可能短。
第二章uC/OS-II中的任务1. uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。
2. UC/OS-II的任务组成部分:(1)任务程序代码:任务的执行部分;(2)任务堆栈:保存任务工作环境;(3)任务控制块:保存任务属性。
3. uC/OS-II的两种任务:用户任务:由应用程序设计者编写的任务。
系统任务:系统提供的任务。
4. 任务的状态:(1)睡眠状态:是否配置或剥夺任务控制块的配置情况;(2)就绪状态:任务就绪表进行就绪登记,等待优先级,具备运行充分条件;(3)运行状态:获得CPU使用权限,任何时候只有一个任务处于运行状态。
(4)等待状态:正在运行的任务,需要等待一段时间或一件事件发生在运行,暂时交出CPU使用权。
5. 用户任务代码结构:任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构叫做超循环结构。
6. OSTaskCreate()用来创建任务的函数;OSStart()用来启动各项任务的函数,启动后,任务就交由操作系统来管理和调度了。
7. uC/OS-II预定义了两个为应用程序服务的系统任务:空闲任务:每个应用程都必须使用的,是CPU处于空闲时有事可做,也可在其中添加用户工作代码;统计任务:根据实际需要进行选择使用。
函数名OSTaskSTat(),统计CPU 的使用状态,以百分比形式存在变量OSCPUUsage中。
若要使用这个任务,则要必须把系统头文件OS_CFG.H中的配置常熟OS_TASK_STAT_EN设置为1,并在创建统计任务之前调用OSStatInit()对统计系统进行初始化。
8. 任务的优先权及优先级别(1)uC/OS-II有64个任务优先级别,“0”表示最高优先级,数字越大优先级越低。
(2)为了节省内存,可以根据需要设置OS_CFG.H中的最低优先级配置常数OS_LOWEST _PRIO,来说明应用程序中任务优先级的数目。
拥有优先级从“0”~“OS_LOWEST _PRIO”OS_LOWEST _PRIO+1个任务。
固定的OS_LOWEST _PRIO分配给空闲任务,若使用了统计任务,则OS_LOWEST _PRIO-1分配给统计任务。
因此用户可使用OS_LOWEST _PRIO-1个任务优先级。
9. 任务堆栈(1)堆栈就是根据存储器中数据“后进先出”的原则组织的连续存储空间,为了满足任务切换和响应中断时保存CPU寄存器中的内容及存储任务是有数据的需要,每个任务务必要有自己的堆栈。
(2)在OS_CPU.H中专门定义了一个数据类型OS_STK,用此来定义一个数组作为任务堆栈的栈区。
在用OSTaskCreate来创建一个任务时,把数组的指针传递给栈顶参数ptos,就可以把该数组与任务关联起来成为任务的堆栈。
(3)堆栈的增长方向因处理器不同而不同,有的处理器是向上增长的,则OSTaskCreate()中的数组指针从[0]开始;有的处理器是向下增长的,则OSTaskCreate()中的数组指针从[TASK_STK_SIZE-1]开始。
因此在编程时,为了提高可移植性,利用OS_CFG.H中的常数OS_STK_GROWTH作为选择开关来把两种代码都编写出来。
(4)任务堆栈初始化:就是将任务指针、任务堆栈指针、程序状态字等事先存放在任务堆栈中,当任务获得CPU使用权时,就把任务堆栈中数据读出启动任务。
初始化工作由操作系统负责,在OSTaskCreate()创建任务时,会通过调用任务堆栈初始化函数OSTaskStkInit()来完成。
需根据处理器的寄存器及堆栈的操作方式,在用户进行移植时进行编写。
10. 任务控制块(1)任务控制块(OS_TCB):用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性表。
(2)任务控制块主要负责吧任务代码和任务堆栈进行关联,使得任务控制块、任务代码和任务堆栈成为一个整体,并且系统要通过这个任务控制块来感知和管理一个任务。
任务控制块就相当于任务的身份证,没有身份证就不能被系统认知和管理。
(3)任务控制块是一个结构型数据,当用OSTaskCreate()创建任务时,就会对任务块中的所有成员赋予该任务相关的数据,并驻留在RAM中。
(4)uC/OS-II用两条链表来管理任务控制块,一是空任务链表(其中任务控制块没有分配给任务,调用OSInit()建立);二是任务块链表(中所有任务块已分配给任务,调用OSTaskCreate()建立)。
(5)uC/OS-II可以用OSTaskDel()删除一个任务,实质上就是把任务从任务控制链表中删除,并把它归还个空任务控制链表。
(6)任务块初始化:由操作系统负责,当调用OSTaskCreate()时,这个函数就会调用系统函数OSTCBInit()来为任务块进行初始化。
11.任务就绪表(1)uC/OS-II进行任务调度的依据就是任务调度表,而任务调度表的OSRdyGrp(8位二进制)与OSRdyTbl[](8位二进制)组合来表示任务的优先级。
(2)可将优先级这个单字节的数值转化为6位二进制数字(最大63为00111111),高3位用来指明变量OSRdyGrp的具体数据位置1,表示OSRdyTbl[*]任务组中有任务就绪,低3位用来指明任务组OSRdyTbl[*]中的具体数据位置1,表示任务组中的具体任务就绪。
(3)对任务就绪表的操作:从任务就绪表中读取最高优先级的任务。
12. 任务调度(1)任务调度是有任务调度器来完成的,任务调度器的任务:一是查找最高优先级别的就绪任务;二是实现任务的切换。
(2)在uC/OS-II中有两种任务调度器:任务级的调度器由OSSched()来实现;中断级的任务调度器由OSIntExit()实现。
(3)任务调度器切换任务的步骤:一,获得待运行任务的TCB指针;二,进行断点数据的切换。
(4)任务切换可依据OSTCBHighRdy和OSTCBCur这两个分别指向待运行任务控制块和当前任务控制块的指针在宏OS_TASK_SW()中实现。
(5)任务的切换就是断点数据的切换,断点数据的切换也就是CPU堆栈指针的切换,被终止运行任务的任务堆栈指针要保存到该任务的任务控制块中,待运行的任务堆栈指针要由该任务控制块转存到CPU的SP中。
这些操作就需要OSCtxSw()来实现。
(6)由于目前的处理器一般没有对程序指针寄存器PC的出栈和入栈指令,就利用中断,让中断向量指向OSCtxSW(),利用系统在跳转到中断服务程序时自动把断点指针压入堆栈,利用中断返回指令IRET把断点指针推入CPU的PC 寄存器,恢复运行任务的断点。
这样就实现了任务断点的保存和恢复了。
13. 任务的创建(1)任务的穿件实质上就是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个整体的任务。
(2)创建任务的函数:OSTaskCreate()和OSTaskCreateExt()。
后者是前者的扩展,并提供了一些附加功能。
14. 任务的挂起和恢复(1)用户任务可以通过调用系统函数OSTaskSuspend()来挂起自身或者除空闲任务之外的其他任务,只能在其他任务中调用恢复函数OSTaskResume()使其恢复为就绪状态。
15. 其他任务管理函数(1)任务优先级别的修改:OSTaskChangePrio(INT8U oldprio,INT8U newprio);(2)任务的删除:OSTaskDel(INT8U prio);(3)请求删除任务:OSTaskDelReq(INT8U prio);(4)查询任务的信息:OSTaskQuery(INT8U prio,OS_TCB *pdata); 16.uC/OS-II的初始化OS_Init();17.uC/OS-II的启动OSStart();第三章uC/OS-II的中断和时钟1.uC/OS-II的中断(1)uC/OS-II使用全局变量OSIntNesting记录中断嵌套层数;(2)编写中断服务程序时,要用到OSIntErnet()和OSIntExit();OSIntErnet()经常在中断服务程序保存被中断任务的断点数据之后,运行中断服务代码之前调用,在中断服务程序中要调用退出中断服务函数OSIntExit()。
(3)在退出中断服务函数时,当中断层数计数器为0,调度器未被锁定且任务就绪表中查找到的最高级就绪任务又不是被中断的任务条件下将要进行任务切换,这时就要调用中断级任务切换函数OSCtxSw()来进行任务切换。
其内容与任务级切换函数OSCtxSw()相似。
(4)应用程序的临界段:通过调用OS_ENTER_CRITICAL()和OS_EXT_CRITICAL()来控制合适关中断和开中断。
有3种实现方法。
2.uC/OS-II的时钟(1)硬件定时器以时钟节拍为周期定时的产生中断,该中断服务程序叫做OSTickISR(),中断服务程序通过调用OSTimeTick()来完成系统在每个时钟街拍时需要做的工作。
(2)OSTimeTick()的任务就是在每个时钟节拍了解每个任务的延时状态,是其中已经到了延时时限的非挂起任务进入就绪状态。
3.时间的管理(1)除了空闲任务之外的所有任务碧玺在任务中合适的位置调用系统提供的函数OSTimeDly(),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,一让出CPU的使用权。
还有一个可以用时、分、秒为参数的任务延时函数OSTimeDlyHMSM()。
当达到规定的延时,或者其他任务调用了取消延时函数OSTimeDlyResume(INT8U prio)时,被暂停的任务立即进入就绪状态。
(2)获取和设置系统时间:调用函数OSTimeGet()卡可以获得OSTime的值,OSTime是用来记录系统发生的时钟拍数的全局变量;调用OSTimeSet()可以设置OSTime的值。