uCOS-II读书的一点笔记.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  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-II读书的一点笔记

uC/OS-II读书的一点笔记重入与不可重入: 可重入函数指当一个函数在被调用时,同时还能被其他函数调用,且不会产生错误. 不可重入函数则不能同时被多次调用,多次调用可能会产生错误. 例子:某函数有一个变量为全局变量,则如果该函数有多个实例在交替运行的话,由于同时存取 同一全局变量,导致该变量被不同实例改变而引起错误. 信号量: 与同一共享数据打交道(可能是全局变量,也可能是共享资源如UART,打印机等)的任务调用等待 信号量函数OSSemPend(),处理完后调用释放信号量函数OSSemPost(). 为防止无限等待可设置等待超时. 例子: //任务Task要存取共享数据,如果该数据正在被其他任务使用,则任务Task只能等待别的任务用 //完,然后分配给任务Task使用.用完后释放该信号量,以供给其他任务使用(或者说将资源归还 //给操作系统). void Task(void) { ? ? OSSemPend(...); ? ? perform operation;? ? //porcess the data ? ? OSSemPost(...); } 信号量也可能是隐藏的.如多任务共享UART时,信号量可隐藏在驱动函数中. 信号量操作: 初始化/建立 INITILIZE/CREATE 等待信号/挂起 WAIT/PEND 给信号 SIGNAL/POST 信号量类型: 二进制? ? 0/1 计数型? ? 0 ~ 2^width - 1 如果某种资源只有1个,可用二进制型信号量,如RS232接口. 如果资源有多个,可用计数型信号量,如系统缓冲区一般有多个. 死锁: 两个任务无限期相互等待对方控制的资源.可用信号量等待超时来化解. 事件标志(Event Flag) 用于任务与多个事件同步. 可用多个事件的组合发信号给多个任务. 可将8/16/32个事件标志组合在一起,当任务所需的事件都发生了,任务结束挂起,继续运行 任务间通讯(Intertask Communication) 两个途径: 1.通过全局变量.与中断函数进行通讯只能通过全局变量. 2.发送消息给另一个任务. 发送消息的方式有邮箱(Mail Box)和消息队列(Message Queue) 邮箱(Mail Box) 一个任务通过内核服务给另一个任务发消息. 内核提供的邮箱服务: 邮箱内消息内容初始化; 将消息放入邮箱(POST); 等待有消息进入邮箱(PEND); 例子: TASK1 --(POST)-- MAIL BOX --(PEND)-- TASK2 可在主程序中创建邮箱,则在任务中就可直接使用. 疑问:也可在任务中创建邮箱,但此时,邮箱能否接收其他任务发送消息?能否发送消息给其他任务? 消息队列(Message Queue) 实际上是邮箱阵列. 任务或ISR可将消息放入消息队列(POST),一个或多个任务可从消息队列中得到消息. 传递的消息实际上是传递的指针指向的内容.消息队列的进出通常有规则,如FIFO. 例子: ISR --(POST)-- MSG QUEUE --(PEND)-- TASK 疑问:消息队列属于某个任务?还是所有任务公用的?任务能从消息队列中取得消息, 并执行相应的操作.任务也可以向外发送消息,但是是否应该指明发送的消息是送给谁的? 在Windows系统的应用程序中,程序的运行是基于事件驱动,消息循环的.每个应用程序进程 都有自己的消息队列.如一个进程1发送消息给进程2,进程2收到消息便继续往下执行,否则 就挂起什么都不干.也即是没有事件的驱动,程序是不往下运行的.程序的运行就是依靠不 断的消息循环来进行下去,程序从消息队列中接收自己的消息,而发送消息时需指明将消息 送给哪个进程. 某一个进程发送一条消息,指明了需要送给哪个进程,该消息进入系统的消息队列,系统将 该则消息投递到目的进程的消息缓存中.而接收消息的进程则读取消息并处理消息. 在这个过程中,系统就像一个邮局,进程发送消息就像寄信,系统投递消息就像邮递员送信. 在uC/OS中,可以创建一个消息队列,并返回一个该消息队列的标识,用户任务就可以通过 这个标识向队列中发送消息或接收消息,这样看来不在发送消息时指定接收消息的任务是 可以的.但当任务较多,且创建了较多的消息队列后,多个任务使用消息队列时是否会产生 误发送或误接收等问题.对于uC/OS中的其他类型资源如Mail Box也是如此. 用户应用uC/OS系统的框架: main() { ? ? ... ? ? OSInit(); ? ? ... ? ? OSTaskCreate(); ? ? ... ? ? OSStart(); } OSInit()会进行一些初始化,包括Mail Box,

文档评论(0)

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

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

1亿VIP精品文档

相关文档