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) 请求任务删除函数
ucos 学习的更多相关文章
- 曾经的UCOSii
首先记住一句话:实时操作系统,并非真的实时.操作系统必须有延时,一个系统执行好几个任务,实质是任务之间不停的切换,有延时才有切换任务的余地,如果没有.....应该都见识过卡机,任务切换不过来了 如果你 ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
- ucos实时操作系统学习笔记——任务间通信(信号量)
ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代 ...
- ucos实时操作系统学习笔记——操作系统在STM32的移植
使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...
- 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析
前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...
- ucos实时操作系统学习笔记——任务间通信(队列)
ucos操作系统中的queue机制同样使用了event机制来实现,其实和前面的sem,mutex实现类似,所不同的是对sem而言,任务想获得信号量,对mutex而言,任务想获得的是互斥锁.任务间通信的 ...
- ucos实时操作系统学习笔记——任务间通信(互斥锁)
想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...
- ucos实时操作系统学习笔记——内核结构和任务创建
对于ucos实时操作系统,邵贝贝的那本书已经写得很详细了,我因为之前不深的研究过ucos,所以在这里做一个笔记,写一些个人对该操作系统的理解,仅仅是个人理解,如果有人看到这边随笔有不对的地方,望给我指 ...
- 任务学习-ucos
1.任务(task)也称作一个线程: 2.一个任务有5种状态:休眠,就绪,运行,挂起,被中断 休眠:任务驻留在程序空间中,还没有交给ucos管理,把任务交给ucos 是通过调用OSTaskCreate ...
随机推荐
- CSS+DIV两栏式全屏布局
在网上找了很久,发现大部分都是固定宽度设置两栏,全屏情况下的布局很少.最后终于完成了,写出来备查,也供大家参考. <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- Linux多线程实例练习 - pthread_create()
Linux多线程实例练习 pthread_create():创建一个线程 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, ...
- c# Dictionary的遍历和排序(转)
c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 foreach: 需要实现ienume ...
- EhCache WebCache 与 SpringMVC集成时 CacheManager冲突的问题
转自:点击打开链接 http://www.cnblogs.com/daxin/p/3560989.html EhCache WebCache 与 SpringMVC集成时 CacheManager冲突 ...
- TestStand与LabVIEW UI 交互
交互起因 客户觉得TestStand界面复杂,希望一个简单的界面即可进行序列执行,采用LabVIEW调用TestStand引擎可实现快速设计,将TestStand拆解到LabVIEW.然而,这样做需要 ...
- HDU2955 背包DP
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- DEDECMS里面DEDE函数解析
下面来解说下DEDECMS织梦CMS模板里面的函数说明 在文件include/inc_function.php里面 GetCurUrl() 获贴切前的脚本的URL GetAlabNum($str) 把 ...
- 关于oracle的笔记
1.查看一个表暂用的表空间大小: SELECT bytes/1024/1024||'MB',a.*FROM user_segments a WHERE a.segment_name ='TL_SP_N ...
- 【转】NumPy-快速处理数据
2.0 简介 标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针(为了保存各种类型的对象,只能牺牲空间).这样 ...
- 使用MyBatis Generator生成DAO
虽然MyBatis很方便,但是想要手写全部的mapper还是很累人的,好在MyBatis官方推出了自动化工具,可以根据数据库和定义好的配置直接生成DAO层及以下的全部代码,非常方便. 需要注意的是,虽 ...