嵌入式实时操作系统uC/os-II
本专栏详细介绍嵌入式实时操作系统uC/os-II原理
无为扫地僧
这个作者很懒,什么都没留下…
展开
-
嵌入式实时操作系统uC/os-II(一)
1、嵌入式系统定义:嵌入式系统是对对象进行自动控制而是其具有智能化并可嵌入对象体系中的专用计算机系统。2、嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件。3、实时操作系统应满足的条件:多任务系统 任务的切换时间应与系统中的任务数无关 中断延时的时间可预知并尽可能短4、内核类型可剥夺型:在可剥夺型内核中,CPU总是运行多个任务中优先级别最高的那个任务,即使CPU正在运行某个低优先级别的任务,当有高优先级别的任务准备就绪时,原创 2020-08-07 11:55:06 · 531 阅读 · 0 评论 -
嵌入式实时操作系统uC/OS-II(二)
uC/OS-II中的任务uC/OS-II的任务由如图2-1所示的三个部分组成:任务程序代码(函数)、任务堆栈和任务控制块。 任务控制块就是关联任务代码的程序控制块,其记录了任务的各个属性;任务堆栈用于保存任务的工作环境。 图2-1uC/OS-II任...原创 2020-08-11 17:04:29 · 1036 阅读 · 0 评论 -
嵌入式实时操作系统uC/OS-II(三)-任务堆栈
任务堆栈堆栈定义:在存储器中按数据“后进先出(LIFO)”的原则组织的连续存储空间。 堆栈大小计算: TASK_STK_SIZE * sizeof(OS_STK) 堆栈的方向: 方向是随系统所使用的处理不同而不同的。如下图所示,因此在使用函数OSTaskCreate()创建任务时,一定要注意所使用的处理器所支持的堆栈增长方向。 如果使...原创 2020-08-12 09:24:01 · 811 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(四)-任务控制块
任务控制块uC/OS-II用来记录任务堆栈指针、任务的当前状态、任务的优先级等一些与任务管理有关的属性的表叫做任务控制块。系统通过任务控制块来感知和管理任务的,没有任务控制块的任务不能被系统承认和管理。任务控制块结构的定义如下: typedef struct os_tcb { OS_STK *OSTCBStkPtr; /* Pointer to current top of stack 指向任务堆栈栈顶的指针 */ #if OS_TAS...原创 2020-08-13 08:56:09 · 792 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(五)-任务就绪表
任务调度:就是通过一个算法在就绪任务中确定马上运行的任务,操作系统用于负责这项工作的程序模块就叫调度器。任务就绪表结构在uC/OS-II中,就绪表就是一个位图,系统中的每个任务都在这个位图中占据一个二进制位,该位值得状态(1或0)就表示任务是否处于就绪态。就绪表如下图所示。 从图中可以看到,由于每个任务的就绪状态只占据一位,因此OSRdyTbl[]的数组元素可表达8个任务的就绪状态。也就是说,每一个数...原创 2020-08-18 09:10:04 · 1308 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(六)-任务调度
uC/OS-II的任务调度的思想是:“近似地每时每刻让优先级最高的就绪任务处于运行状态”。调度器的定义:在多任务系统中,令CPU中止当前正在运行的任务转而去运行另一个任务的工作叫做任务切换,而按照某种规则进行任务切换的工作叫做任务的调度。uC/OS-II中,任务调度由任务调度器来完成。任务调度器的主要工作有两项:一是在任务就绪表中查找具有最高优先级别的就绪任务;二是实现任务的切换。调度器的种类任务级:函数OSSched()实现。 中断级:函数OSIntExt()实现。调度器把任务切换的工.原创 2020-08-20 09:20:19 · 1513 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(七)-任务创建
函数OSTaskCreate()创建任务 应用程序通过调用函数OSTaskCreate()来创建任务。函数OSTaskCreate()的源码如下: INT8U OSTaskCreate( void (* task)(void *pd), //指向任务的指针 void *pdata,...原创 2020-08-28 09:33:25 · 1962 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(八)-任务的初始化和启动
uC/OS-II的初始化函数OSInit()将对uC/OS-II的所有全局变量和数据结构(就绪链表、事件链表)进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永久的就绪态。 图2-17 uC/OS-II 初始化后的数据结构 由上图可...原创 2020-08-31 09:00:40 · 826 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(九)-任务中断
uC/OS-II的中断 中断的定义:任务在运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要的任务过程叫做中断。 中断服务子程序:应中断请求而运行的程序。 中断向量:中断服务子程序的入口地址。 uC/OS-II响应中断的过程:系统接收到中断请求后,如果这时CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行,或者转向运行另一个具有更高原创 2020-09-01 16:50:47 · 974 阅读 · 1 评论 -
嵌入式实时操作系统uC/os-II(十)-任务时钟
uC/OS-II 用硬件定时器产生一个周期为毫秒(ms)级的周期性中断来实现系统时钟。最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍。硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR()。其示意代码如下: Void OSTickISR(void) { OSIntEnter();...原创 2020-09-02 16:16:32 · 563 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十一)-事件控制块和事件处理函数
事件控制块的结构等待任务列表 对于事件来说,当其被占用时,会导致其他请求该事件的任务因暂时得不到该事件的服务而处于等待状态。对于这些等待任务具有两方面的管理功能,一是要对等待事件的所有任务进行记录并排序;二是应该允许等待任务有一个等待时限,即当等待任务认为等不及时可以退出对事件的请求。对于等待事件任务的记录,uC/OS-II又使用了与任务就绪表类似的位图,即定义一个INT8U类型的数组OSEventTbl[]作为等待事件任务的记录表。事件等待任务表类似任务的优先级就绪表操作一样...原创 2020-09-03 09:55:16 · 1081 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十二)-信号量及其操作
信号量信号量由信号量计数器和等待任务表两部分组成。信号量使用事件控制块OSEventCnt作为计数器,而使用数组OSEventTbl[]来充当等待任务表。每当有任务申请信号量时,如果信号量计数器OSEventCnt的值大于0,则把OSEventCnt减1并使任务继续运行;如果OSEventCnt的值为0,则会将任务列入任务等待表OSEventTbl[],使任务处于等待状态。如果有正在使用的信号量的任务释放了信号量,则会在任务等待表中找出优先级别最高的等待任务,并在使它就绪后调用调度器引发一次调度;如果任.原创 2020-09-04 09:37:07 · 799 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十三)-互斥型信号量和优先级反转
任务优先级的反转现象 定义:在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这就是所谓的任务优先级反转。 为了找到杜绝任务优先级反转现象的方法,下面就对优先级的反转现象做一个详细的分析。图5-1描述的任务A、B、C三个任务的运行情况。其中任务A的优先级高于任务B,任务B的优先级高于任务C。任务A和任务C都要使用同一个共享资源S,而用于保护该资源的信号量在同一时间只能允许一个任务以独占的方式对该资源进行访问,即这个信号...原创 2020-09-07 11:04:21 · 705 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十四)-消息邮箱及其操作
消息邮箱的定义 把数据缓冲区的指针赋给事件控制块成员OSEventPtr,同时使事件控制块的成员OSEventType为常数OS_EVENT_TYPE_MBOX,则该事件控制块就叫做消息邮箱。 消息邮箱的数据结构如图6-1所示。 图6-1 消息邮箱的数据结构消息邮箱的操作创建消息邮箱 ...原创 2020-09-08 16:00:52 · 1999 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十四)-消息队列
消息队列消息队列由三部分组成:事件控制块、消息队列、消息。当事件控制块成员OSEventType值为OS_OSEVENT_TYPE_Q时,该事件控制块代表一个消息队列。 消息队列的数据结构如图6-1所示。从图中可以看到,消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向一个叫做队列控制块(OS_Q)的结构,该结构管理着一个数组MsgTbl[],该数组中的元素都是指向消息的指针。 ...原创 2020-09-09 13:54:02 · 966 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十五)-消息队列操作
消息队列的操作 创建消息队列 创建一个消息队列首先需要定义一个指针数组,然后把各个消息数据缓冲区的首地址存入这个数组,最后在调用函数OSQCreate()来创建消息队列。创建消息队列函数OSQCreate()的原型如下: OS_EVENT *OSQCreate( void **start, //指针数组的地址 IN...原创 2020-09-10 14:08:42 · 685 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十六)-信号量集
信号量定义uC/OS-II提供了可处理多个信号量的信号量集。其实意图如图7-1所示。 图7-1 信号量集的示意图从图中可以看到,信号量实质上就是一个多输入、多输出的组合逻辑。其输入为其他任务发出的多个信号,而输出则是多个输入逻辑运算的结果。目前,uC/OS-II信号量集可以对信号量进行”与(AND或ALL)”和”或(OR或ANY)”两...原创 2020-09-14 14:25:30 · 542 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十七)-信号量集操作
创建信号量任务可以通过调用OSFlagCreate()来创建一个信号量集。该函数的原型如下:OS_FLAG_GRP *OSFlagCreate( OS_FLAGS flags, //信号的初始值 INT8U *err...原创 2020-09-16 09:07:19 · 447 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十八)-动态内存管理
内存控制块 uC/OS-II操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。内存分区和内存块的定义 在内存中定义一个内存分区及其内存块的方法非常简单,只要定义一个二维数组即可。例如:INT16U IntMemBuf[10][10];就定义了一个用来存储INT16U类型的数据,有10个内存块,每个内存块长度为10的内存分区。 真正可以动态分配的内存区,如图8-1(a)所示。只有把内存控制块与分区关联起来之...原创 2020-09-18 09:23:08 · 416 阅读 · 0 评论 -
嵌入式实时操作系统uC/os-II(十九)-动态内存管理操作
uC/OS-II用于动态内存管理的函数有:创建动态内存区分函数OSMemCreate()、请求获得内存块函数OSMemGet()、释放内存块函数OSMemPut()和查询动态内存分区状态函数OSMemQueru()等函数。创建动态内存分区应用程序可通过调用函数OSMemCreate()来建立一个内存分区。该函数的原型如下: OS_MEM *OSMemCreate( void *addr, INT32U...原创 2020-09-21 11:23:01 · 532 阅读 · 0 评论