ucos实时操作系统基础理解

一,基础理解

1,ucos系统的任务表示:
需要在里面添加中断的代码的,以便于它能跳转到其他的任务中执行,切换任务的时候,判断优先级进行任务之间的切换的工作。

void  task1(void * param)
{
 for( ; ;)
        {
                          //用户编写的任务代码

                          //不需要返回的无类型函数
        }
}

2,UCOS系统代码结构

ucos实时操作系统基础理解

二,UCOSS实时操作系统基本功能:

1,内存管理:

内存管理主要是动态内存的管理,当应用程序需要使用内存的时候,可以利用操作系统所提供内存分配函数来获得足够的内存空间。,动态内存就是指malloc、free函数的分配,就是从堆里面拿内存,因为我们本来嵌入式系统的内存分配就比较少,所以这里很关键。将所有已经分配好的空间计算好,利用全局变量分配到静态的代码空间中。实际使用时调用自己编写好的内存管理函数从这块静态空间中申请内存。内存的总体大小是受控的,所有涉及到动态内存的地方实际上都已经被预先分配好,在编译时候写在静态代码区。

MMUType     MMUPool[MMU_BUFF_MAX];  //Store all the MMUs
MMUType    *MMUFree;                //Pointer to the available MMUType in MMUPool
MMUType    *MMUBuff8;            //Controller of Buff8U
MMUType    *MMUBuff16;           //Controller of Buff16U

所有需要实际存储的指针都由数组来保存,所有指针最终指向一个实际的变量,诺要使用这种内存管理,第一步要做的就是初始化MMUPOOL初始化内存池。调用MEMInit()之后将内部所有的成员形成一个链表,由MMUFree指向最开头的一个。

这样一来就可以为内存管理块分配一个实际的对象了,调用MemCreate()可以分配一个实际的对象给内存管理块,并且将内存管理与实际的内存存储去联系在一起。

2,多任务管理:

裸机就是一个单任务的前后台的程序,就是一个任务加上中断的机器的实现方法。程序设计人员就可以按照多线程来设计自己的程序,程序的耦合性和单元测试方面就会比较的容易。创建任务的时候,是将任务的函数名,传递给任务堆栈,然后任务堆栈再传到CPU的SR寄存器中,实现任务切换的。所谓的指向任务的指针:其实就是任务的函数的函数名。下面是

(1)任务控制块是来管理任务的。
(2)UCOSII把所有的任务都是通过双向链表来连接到一起的(在整个操作系统中,因为我们不知道用户到底需要多少个任务,所以使用链表的话,在编译后才确认的话,数组的方式优秀很多)
3,外围资源管理:

除了本身自己必须需要的东西,内存和CPU,还有很多输入型设备和输出型设备需要管理。

由于资源是有限的,因此操作系统必须对这些资源进行合理的调度和管理,才能保证每个要使用

资源的任务在运行时可以获得足够的资源。

三,UCOSII操作系统任务之间通信

UCOSII的任务是一个特殊的函数,没有类型,没有返回值,是一个死循环。它之所以的话,在用户需要添加的代码中一定是有一个任务切换的函数调用的,它能够跳出来跟别的任务进行通信。实质上是CPU的SR寄存器中的任务堆栈的切换的过程。

linux和ucos任务进行通信对比异同:
Linux的进程间通信:信号量(互斥型信号量)、消息队列、共享内存、消息邮箱、事件标志组。

UCOSII任务之间进行通信的方式:除了共享内存,其余都存在。

其中有好几个是类型的:比如信号量和互斥型信号量。使用这个是可以占用资源,或者同步任务的运行。比如消息邮箱和消息队列,消息队列也称为多个消息邮箱,都是用来在任务之间传递数据的。事件标记组:首先请求事件标记组的时候,通过一个整型数的某几个位,如果那几个位都已经置位或者都是为空的话,那么请求事件标记组的任务可以得到运行。
由于会产生任务优先级的反转问题,所以需要互斥型信号量。

什么是优先级反转?高优先级任务被低优先级任务剥脱CPU的使用权。
(1)假设现在有一个低的优先级任务占有CPU的内核,同时他占有了一些资源。
(2)此时,来了一个高优先级的任务,它想要得到这个资源,但是这个资源已经被低优先级的任务占有了。
(3)在后来来了一个中等优先级的任务,它因为优先级比低优先级的任务高,但是它的优先级没有高的优先级高,所以它强占CPU的使用权,继续执行。
(4)形成的情况就是中等优先级的任务比高优先级的任务更加早的执行,形成优先级反转的问题。

解决方案A:
如果低优先级任务占有的那个资源后,后面有更高的优先级任务到来的话,那么就把自己的优先级提高到那个想要占有优先级的任务。

解决方案B:
使用互斥型信号量。因为互斥型信号量,只有你自己请求,自己释放,不能通过别的任务释放,如果你请求一个已经请求过的互斥性信号量的话,那么直接跳过执行。

四,UCOSII操作系统运行状态:前四个状态不可缺少

1,睡眠态:首先我们的任务是按需分配的,你想要多少个任务的话,那么我们就可以创建多少个任务。刚刚创建的任务是处于睡眠的状态的。

2,就绪状态:如果系统为任务配备了任务控制块并且在任务的就绪表中进行了就绪登记的话,则任务就具备了运行的充分条件,这时候任务的状态就叫做就绪态。

3,运行状态:处于就绪状态的任务如果经过UCOSII的位图机制,判断为处于最高优先级的任务的话,那么它就可以获得CPU的使用权,这时候就是运行状态。

4,中断服务状态:这个真的就没有什么好说的了,连前后台系统都会存在的状态,触发到中断的条件,就会进入中断态,而且不管你是否处于运行态还是怎么样?

5,等待状态:这个状态的话,是可以通过裁剪UCOSII内核去掉的,其实这个状态就是为了满足任务之间的通讯和任务与中断服务子程序通信产生的一种状态。
 

上一篇:uCOS-III内核源码分析笔记 - 任务级调度器 void OSSched(void)


下一篇:ucos(9)互斥锁和死锁