ucos 总结.docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ucos 总结

以前在学校的时候硬着头皮读过uCOSII的源代码,可能是当时没做详细笔记,貌似读懂了,用的时候思路还是比较混乱,后面在电信学院,王老师有次要我写个uCOSII的总结,当时知道迟早会离开那里,只是一心想抓紧机会多接触点新东西,以后出去就没这么好机会了,没那个耐心静下来看代码,最近有点时间,重新梳理了一边源代码。 刚接触操作系统的时候觉得这个最神秘,到底里面做了什么,怎么就成了个操作系统,它到底有什么用,为什么要引进来着个东东。学了之后才知道,原来最根本的思想还是源于汇编里面的跳转和压栈,以调用一个函数为例,编译后的汇编肯定是先通过SP压入当前代码段地址然后就是保存一些寄存器的值放栈里面(51单片机好像不是这样),然后执行程序,完了之后,出栈把寄存器恢复,最后把原来存的代码段地址付给PC然后回到原来的程序,这是汇编执行函数的做法,而操作系统人为强行的模拟这样操作,把代码写成不同代码块假定为A、B,要相互之间执行似乎不受影响,是这么实现的,假设首先代码在A中执行,代码段一直往下指,如果我要执行B,首先把A的代码段压入栈,所有的寄存器值存入A的栈,然后让SP强行指到B的栈执行出栈操作,把寄存器恢复成B的,B的代码段地址放入PC,这样就B在执行,如果又要A接着上次执行,又强行把B的寄存器、当前代码段地址压入B的栈,然后SP强行指到A的栈恢复的时候恢复成A最近一次保存的东西(和函数调用不同每次切换栈里面的东西是随机的),这样,可以很自由的在A、B中切换,如果切换足够快,A、B看以来好像同时在执行,这就是并行,A、B就是任务。如果这个切操作放到定时器函数中来做,就可以严格按照时间来切换,这就是操作系统雏形。另外,各个任务之间有存在一定的关系,有逻辑上的先后等,必须引进全局的结构体、变量来标记一些信息,全局的这些数据是不会被释放的,所以所有的任务可以去通过读、写这些数据来实现各个程序块交流信息,实现所谓的同步、互斥。这就是操作系统的原理,而这些不同的通信方式按功能细分就成事件管理、内存管理啥玩意。有这些基本的管理就是一个只有内核操作系统了。配上文件系统、图形界面这些个模块功能就能做出想Window这样的东东。只有引入操作系统才能更好的写程序,才能让性能发挥到极致。具体到uCOSII也是这样:首先是主函数,然后是OSInit(),这个函数就是对那些全局的数据结构初始化,建立希望的链表等数据结构,为后面全局变量通信做好准备,并且创建了1-2个系统任务(空闲任务必须,统计任务可选),而所谓的创建任务OSTaskCreate(另外在这个系统里还有个OSTaskCreateExt也是一种创建任务函数,只不过多了些检测栈、清楚栈的功能而已)就是把一个函数,的函数地址、自己的栈建立联系、优先级啥弄好为任务切换做好准备。设置好定时切换的相关信息类似定时器,按照节拍在中断中进行任务切换判断、发生切换,这个时候还没有开启开关,所以的任务创建完成后,启动多任务函数OSStart(),这个函数是让SP指到其中的一个站然后出栈就跳到一个任务函数里去了,接下来就是正常的任务运行了。 ? 内存管理部分 函数名 功能简介 OS_MemInit(); 初始化分区控制块OS_MEM构建空闲内存控制块MCB空闲链表,OSInit()内部调用。 OSMemCreate(); 实际上是定义一个二维数组,一维也是可以的只是没那么直观方便而已,通过一个从空闲内存控制块链表上取一个OS_MEM来管理这块内存,做法是按用户参数分成小块内存(一般大小为第二维大小,直观),填写控制块的相关信息,用户调用 OSMemGet() 从指定的分区上取一个内存块 OSMemPut(); 释放一个内存块到指定的分区 OSMemQuery(); 查询某个指定的分区信息 OSMemNameSet(); 设置某个指定分区的名 OSMemNameGet(); 得到某个指定分区的名 ?????????????????????????事件管理部分 公用函数: 函数名 功能简介 OS_InitEvenList() 初始化事件控制块OS_EVENT链表,OSInit()内部调用 OS_EventWaitListInit() 仅仅清零指定事件控制块的等待任务表,等待任务组,实际上我觉得这个函数没有必要,因为创建链表的时候所有ECB全部清0,被系统用过后返回回去时都是调用OS_EventTaskRdy或删除事件函数,也都进行过清0,所以从空闲ECB链表取下来的ECB肯定等待表、组都是0。 OS_EventTaskWait() 阻塞当前任务,登记就绪表、组,等待任务表、组,TCB指向ECB OS_EventTaskRemove() 仅仅清指定ECB的等待任务表、组 OS_EventTaskRdy() 选

文档评论(0)

mhk8089 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档