ucos 学习

1.UCOSII 早期版本只支持 64 个任务,但是从 2.80 版本开始,支持任务数提高到 255 个,不
过对我们来说一般 64 个任务都是足够多了,一般很难用到这么多个任务。 UCOSII 保留了最高
4 个优先级和最低 4 个优先级的总共 8 个任务,用于拓展使用,单实际上, UCOSII 一般只占用
了最低 2 个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下给我
们使用的任务最多可达 255-2=253 个

Ucos 的原理本质上也是这
样的,当一个任务 A 正在执行的时候,如果他释放了 cpu 控制权,先对任务 A 进行现场保护,
然后从任务就绪表中查找其他就绪任务去执行,等到任务 A 的等待时间到了,它可能重新获得
cpu 控制权,这个时候恢复任务 A 的现场,从而继续执行任务 A,这样看起来就好像两个任务
同时执行了。实际上,任何时候,只有一个任务可以获得 cpu 控制权。这个过程很负责,场景
也多样,这里只是举个简单的例子说明。
所谓的任务,其实就是一个死循环函数,该函数实现一定的功能,一个工程可以有很多这
样的任务(最多 255 个), UCOSII 对这些任务进行调度管理,让这些任务可以并发工作(注
意不是同时工作!!,并发只是各任务轮流占用 CPU,而不是同时占用,任何时候还是只有 1
个任务能够占用 CPU),这就是 UCOSII 最基本的功能。

前面我们学习的所有实验,都是一个大任务(死循环),这样,有些事情就比较不好处理,
比如: MP3 实验,在 MP3 播放的时候,我们还希望显示歌词,如果是 1 个死循环(一个任务),
那么很可能在显示歌词的时候, MP3 声音出现停顿(尤其是高码率的时候),这主要是歌词显
示占用太长时间,导致 VS1053 由于不能及时得到数据而停顿。而如果用 UCOSII 来处理,那
么我们可以分 2 个任务, MP3 播放一个任务(优先级高),歌词显示一个任务(优先级低)。
这样,由于 MP3 任务的优先级高于歌词显示任务, MP3 任务可以打断歌词显示任务,从而及
时给 VS1053 提供数据,保证音频不断,而显示歌词又能顺利进行。这就是 UCOSII 带来的好
处。

使用 CPU 的时候,优先级高(数值小)的任务比优先级低的
任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得 CPU 使用权,只有高优先级
的任务让出 CPU 使用权(比如延时)时,低优先级的任务才能获得 CPU 使用权。 UCOSII 不支
持多个任务优先级相同,也就是每个任务的优先级必须不一样。

任务优先级相同,也就是每个任务的优先级必须不一样。
任务堆栈,就是存储器中的连续存储空间。为了满足任务切换和响应中断时保存 CPU 寄存
器中的内容以及任务调用其他函数时的需要,每个任务都有自己的堆栈。在创建任务的时候,
任务堆栈是任务创建的一个重要入口参数。
任务控制块 OS_TCB,用来记录任务堆栈指针,任务当前状态以及任务优先级等任务属性。
UCOSII 的任何任务都是通过任务控制块( TCB)的东西来控制的,一旦任务创建了,任务控
制块 OS_TCB 就会被赋值。每个任务管理块有 3 个最重要的参数: 1,任务函数指针; 2,任务
堆栈指针; 3,任务优先级;任务控制块就是任务在系统里面的身份证( UCOSII 通过优先级识
别任务),任务控制块我们就不再详细介绍了,详细介绍请参考任哲老师的《嵌入式实时操作
系统 UCOSII 原理及应用》一书第二章。
任务就绪表,简而言之就是用来记录系统中所有处于就绪状态的任务。它是一个位图,系
统中每个任务都在这个位图中占据一个进制位,该位置的状态( 1 或者 0)就表示任务是否处于
就绪状态。
任务调度的作用一是在任务就绪表中查找优先级最高的就绪任务,二是实现任务的切换。
比如说,当一个任务释放 cpu 控制权后,进行一次任务调度,这个时候任务调度器首先要去任
务就绪表查询优先级最高的就绪任务,查到之后,进行一次任务切换,转而去执行下一个任务。
关于任务调度的详细介绍,请参考《嵌入式实时操作系统 UCOSII 原理及应用》一书第三章相
关内容。
1) 建立任务函数
如果想让 UCOSII 管理用户的任务,必须先建立任务。 UCOSII 提供了我们 2 个建立任
务的函数: OSTaskCreat 和 OSTaskCreateExt,我们一般用 OSTaskCreat 函数来创建任务,
该函数原型为:
OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)。
该函数包括 4 个参数: task:是指向任务代码的指针; pdata:是任务开始执行时,传
递给任务的参数的指针; ptos:是分配给任务的堆栈的栈顶指针; prio 是分配给任务的优
先级。
每个任务都有自己的堆栈,堆栈必须申明为 OS_STK 类型,并且由连续的内存空间组
成。可以静态分配堆栈空间,也可以动态分配堆栈空间。
OSTaskCreateExt 也可以用来创建任务,是 OSTaskCreate 的扩展版本,提供一些附件
功能。详细介绍请参考《嵌入式实时操作系统 UCOSII 原理及应用》 3.5.2 节。
2) 任务删除函数
所谓的任务删除,其实就是把任务置于睡眠状态,并不是把任务代码给删除了。 UCOSII
提供的任务删除函数原型为:
INT8U OSTaskDel(INT8U prio);
其中参数 prio 就是我们要删除的任务的优先级,可见该函数是通过任务优先级来实现
任务删除的。
特别注意:任务不能随便删除,必须在确保被删除任务的资源被释放的前提下才能删
除!
3) 请求任务删除函数

时间: 2024-08-02 16:22:15

ucos 学习的相关文章

UCOS学习之内存管理

本文和大家分享的主要是UCOS中的内存管理相关内容,一起来看看吧,希望对大家学习ucos有所帮助. 在 嵌 入 式设备中,持续的调用malloc()和free()容易产生内存碎片,长时间的运行最终会导致内存消耗殆尽.UCOS提供了一套内存管理机制,在系统初始化的时候就分配好内存空间,将所有可用的空间组织成链表,需要申请内存的时候直接从链表中申请,释放内存的时候直接将内存归还到空余内存链表中即可.使用这种方法不仅避免了内存碎片的产生,而且使得在常数时间内分配内存空间成为可能. UCOS中内存管理的

ucos实时操作系统学习笔记——任务间通信(信号量)

ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代码的学习心得,供以后回来看看,不过比较遗憾的是没有仔细学习扩展代码的功能实现部分.ucos操作系统的内核代码实现相对简单,但是对理解其他操作系统内核相同功能有帮助. ucos的任务间通信机制主要是基于event实现的,其实理解这个event不用翻译成中文事件,就叫event感觉还更容易接收.下面是操

ucos实时操作系统学习笔记——操作系统在STM32的移植

使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只有几千行代码的操作系统,也没所有的代码都看,只是看了其中部分内容.自己还自不量力的尝试着去写过简单的操作系统,最后写着写着就被带到了ucos的设计思路上了,后来干脆就“copy”代码了,虽说对操作系统内核的理解有很大的帮助,但是很是惭愧啊,智力不够,对操作系统内核的设计者更加仰慕,O(∩_∩)O哈哈

ucos实时操作系统学习笔记——任务间通信(消息)

ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了queue机制还要用mbox呢,只要设置queue的msg只有一个不就行了?其实很简单,就是为了节约资源,因为使用queue的话需要专门描述queue的机构体os_q,同时需要分配一段内存用来存放msg,而如果直接使用mbox机制的话,就好多了,节约..... 首先从mbox的创建开始,mbox创建的函

ucos实时操作系统学习笔记——任务间通信(互斥锁)

想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥锁是设置信号量值为1时候的特殊情况,与之不同的地方是互斥锁为了避免优先级反转采用了优先级继承机制,本文主要讲一下互斥锁的创建,pend和post,对应的函数是OSMutexCreate,OSMutexPend,OSMutexPost,当然讲函数也不会所有的扩展功能都讲,只是讲一下主干部分,下面贴出来

关于嵌入式如何学习(看了不后悔,给学技术的同行一条光明的路)

关于嵌入式如何学习,我相信有很多大牛回答得很专业,最近在知乎上看到一网名为----李brooks,~的网友对此进行了总结,我个人觉得非常好,还有其他两位网友li crifan和Tony Ho,毕竟我工作以来也还有好多东西没有接触,就有他说的那些中的部分内容,我们来看看他们说了什么内容: 有一位大学生四年级的网友提出这样的问题: 本人大四学生,专业为电气类的,有C语言,单片机,模电,数电的基础,一直想从事嵌入式方面的工作(感兴趣),但是以目前的水平,暂时还不能找到这方面的工作,所以一直在纠结是先找

uc/os学习入门:在32位pc机上搭建编译环境

由于学习ucos的入门资料中所使用的编译器大多都是Borland c ++ 3.1或者Borland c++4.5,为了降低学习的难度最好所用的编译器与书本上的一致.由于4.5版本稍高,所以最终决定用Borland C++ 4.5,毕竟是很老的东西,甚是难找,最后也不知道在哪找到了,经测试能在windows xp上安装(在64位系统上是不能用的,我所采用的方法是虚拟机中装Windows xp)编译器下载链接http://pan.baidu.com/s/1bO3nVS 解压bc45_setup.z

STM32环境搭建/学习观点/自学方法 入门必看

文章转自armfly开发板V4软件开发手册,分享学习~ 今天有幸看到armfly的开发板软件开发手册,开头的基础知识,真的很有用,还好有看到,一切都不迟,感悟很多,摘抄部分,学习分享~ 关于开发环境的搭建 (个人认为,好用的工具,顺手的开发环境,对于编程是一种好的习惯,也是一种好的享受,所以,在环境搭建方面,我还是比较在意软件的互相联合使用,工程建立的规范化等等,这样可以尽量少的在后期更换不同的环境,变软会很浪费时间,一次到位,一路顺风顺水~) 个人偏好的环境搭建: 集成开发环境(IDE):Ke

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,