网站大量收购闲置独家精品文档,联系QQ:2885784924

μCOS-II笔记.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
μCOS-II笔记

μCOS-II常用概念理解 μCOS-II系统创建-标准-常用 句柄 首先我人为,句柄不是指针(哪怕说是指针的指针,要知道指针包含了太多的信息),若说句柄含有指针的某些意思(或在某种模式情况下就是指针)似乎更好; 而把句柄当做一个人的名字,并可以通过名字(句柄),实现对句子的引用和访问,感觉这种比喻好象贴近,但问题是可能有许多人叫同一个名字,但句柄所以有意义正因为它具有唯一性,所以这种比喻也有问题,如果换个说法,说句柄是表示你的进程与外界的i/o连接,把它当作是一个连接的名字是不是更恰当些? 至于文件句柄么,记得曾有资料给出这样的解释(大意):它类似于门把手,有它你可找到“门”这个对象,就可以控制对象门了,但觉得把它类比于门把手似乎并不贴切,感觉象是直译句柄这个词的词意,我们知道,其实文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整数),代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码; 当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代 句柄和指针的区别 打个比方: 你朋友给你写信,他直接写你名字邮局是找不到你的,他就写出你家的门牌号,邮局通过门牌就能找到你了,那么门牌就是指针,而你本身就是指针指向的内存值. 你由于去砸110车窗户被关进局子(打比方呵呵,别打我~),和你一起的有老外,有外星人,大家名字都很长,很难记,监狱长为了方便,给每个犯人一个标号,比如你是0001,而另一个火星人是0002,那么以后监狱长碰到0001就知道是你了,不会去找火星人麻烦的.那么这个编号就是句柄,而你就是0001所代表的资源. 一个是指向,一个是代表,2个有很大的区别.代表的话,我用0001是代表,用abcdef还是代表,而门牌,就要按照规矩来,你不能用0003来代表XX街XX号的门牌 就是这个意思呵呵,希望我的比方对LZ有帮助 Z::就是将线程的物理地址映射为唯一的句柄,知道句柄后,可以在某一固定的列表里查到到与之对应的线程物理地址 与句柄相关的函数 得到当前线程句柄: GetCurrentThread(void) 得到当前线程ID: GetCurrentThreadId(void) 根据句柄得到线程ID: GetThreadId 根据窗口句柄得到此窗口所在线程的ID(同时得到进程的ID): GetWindowThreadProcessId 根据ID得到线程句柄: OpenThread(unsigned long) 挂起用SuspendThread 唤醒用ResumeThread (强制)结束TerminateThread 主线程切换上下文 事件的流水账记录如下: (1)任务A呼叫SVC来请求任务切换(例如,等待某些工作完成) (2)OS接收到请求,做好上下文切换的准备,并且悬起一个PendSV异常。 (3)当CPU退出SVC后,它立即进入PendSV,从而执行上下文切换。 (4)当PendSV执行完毕后,将返回到任务B,同时进入线程模式。 (5)发生了一个中断,并且中断服务程序开始执行 (6)在ISR执行过程中,发生SysTick异常,并且抢占了该ISR。 (7)OS执行必要的操作,然后悬起PendSV异常以作好上下文切换的准备。 (8)当SysTick退出后,回到先前被抢占的ISR中,ISR继续执行 (9)ISR执行完毕并退出后,PendSV服务例程开始执行,并且在里面执行上下文切换(10)当PendSV执行完毕后,回到任务A,同时系统再次进入线程模式 时间调度 假如:有两个任务:任务1的优先级高于任务2 任务1 void Task1(void *pdata) { ??pdata = pdata;???// 避免编译警告 ??while(1) ??{ ????GPIO_SetBits(GPIOF, GPIO_Pin_6); ????OSTimeDly(100);??????? ????} } 任务2 void Task2(void *pdata) { ??pdata = pdata;???// 避免编译警告 ??while(1) ??{ ????GPIO_ResetBits(GPIOF, GPIO_Pin_6); ????OSTimeDly(80);??????????????? ????} } 开始执行任务1 当执行到???OSTimeDly(100);??时,将任务挂起,然后每个OSTimeDly进行任务调度,查找当前最高优先级的任务,即任务2,那么当执行到任务2的 OSTimeDly(80);??时,此时任务一的OSTimeDly(100); 和OS

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档