原创 F28335开发板:uCOS/II移植TMS320F28335经验总结

2010-3-1 12:35 4235 3 3 分类: 处理器与DSP
uCOS/II移植TMS320F28335经验总结
总结:

       互斥量是一种不能同时访问的资源,互斥量是一种事件类型,这非常重要
       任务可以用互斥型信号量实现对共享资源的独占式处理,互斥型信号量也称作mutex,mutex是二值信号量,即表示资源是否可以使用和不可以使用,在ucos中是用置顶优先级翻转来实现的,除了有普通信号量的机制外,还有些其他特性(如降解优先级反转的问题)。
互斥型信号量由3个元素组成:

       (1)1个标志,指示mutex是否可以使用(0或1);

       (2)1个优先级,准备一旦高优先级的任务需要这个mutex,赋给占有mutex的任务;

   (3)一个等待该mutex的任务列表。

   建立一个互斥型信号量 OSMutexCreate()

   删除一个互斥型信号量 OSMutexDel()

   等待一个互斥型信号量 OSMutexPend()

   释放一个互斥型信号量 OSMmtexPost()

   无等待的获取互斥型信号量(任务不挂起) OSMutexAccept()

   获取互斥型信号量的当前状态 OSMutexQuery()

   这章里变得6个函数和上一章的主要区别就在于: 互斥型信号量主要用于对共享资源进行独占式处理;并且增加了一个用于解决优先级反转的优先级。

互斥量的pend和post必须在一个任务中

互斥量和临界区很相似,只不过它们可以被用来同步多个进程间的数据访问。为此,两个进程间的某个线程必须拥有同一互斥量对象的进程相关句柄。

   事件标志组由2部分组成:

       (1)用来保存当前事件组中各事件状态的一些标志位;

       (2)等待这些标志位置位或清除的任务列表。  

       与前面的信号量、互斥型信号量一样,也需要通过OS_CFG.H中的事件标志组控制开关量的选择如OS_FLAG_EN 来使用或禁止事件标志组。

       当一个任务开始等待某些事件标志位时,就建立一个OS_FLAG_NODE数据结构。当这些等待的事件标志位发生以后,这个数据结构就会被删除。

       换句话说:当调用OSFlagPend()时,建立OS_FLAG_NODE.

       建立一个事件标志组 OSFlagCreate()

       删除一个事件标志组 OSFlagDel()

       等待事件标志组的事件标志位 OSFlagPend()

       置位或清0事件标志组中的事件标志 OSFlagPost()

       无等待地获得事件标志组中的事件标志 OSFlagAccept()

       这个函数和OSFlagPend()非常相似,不同仅在于:如果等待的事件标志没有发生,那么该函数并不停止任务的运行以等待事件标志 ,而是简单的返回一个出错代码。 这个函数可以在中断服务子程序中调用。

       查询事件标志组的状态 OSFlagQuery()

       消息邮箱,信号量,消息队列都是由三部分组成: (1):事件(2):等待事件列表(3):等待任务列表


       总结信号量,邮箱,消息队列他们的机制,这里主要是看post和pend函数(多了事件的任务等待矩阵)


       pend:如果可以得到事件的内容就得到,如果不能得到就加入该事件的等待任务组,当然等待也是有时间的,然后调度,


                  如果时间到,可以得到事件就得到,不能得到就超时处理

       post:看该事件的等待任务组中是否有等待任务,有就加入准备好,然后调度,如果没有就加到该事件的内容中

       总结互斥量的pend和post函数(多了事件的任务等待矩阵,多了优先级翻转)


       pend:如果可以得到互斥量事件就得到互斥量事件,如果不能得到,就将正在使用互斥量的任务进行优先级翻转(当然正在使用互斥量的任务优先级比较低,如果比较高就不翻转),然后将该任务加入互斥量事件的任务等待组,当然等待也是有时间的,然后调度,

       如果时间到,不能得到互斥量事件就超时处理

       post:看传递的任务是否拥有互斥量事件,如果拥有就其任务的优先级还原(当然正在使用互斥量的任务优先级应该是PIP,如果不是就不还原),然后看该互斥量事件的等待任务组中是否有等待任务,有就加入准备好,然后调度,如果没有就将互斥量事件置成可以得到

       总结事件标志的pend和post函数(多了事件标志的等待任务组)


       pend:确定等待类型,如果标志位准备好就得到并返回,如果没有准备好,就加入等待,并确定延时,然后调度,如果超时就把任务置成准备好,如果标志位准备好就得到并返回

       post:清理或者设置标志位,看标志位是否准备好,如果准备好就调度,如没有准备好,就返回标志位


总结:

       要理解任务的五种状态非常重要,我明白这五种状态是如何转换的

   "所以从这里来看,os中的各个功能单元管理着自己的事情,就像面向对象的封装一样,"

   "事件就绪控制矩阵和任务就绪控制矩阵和事件标志结点是各个对象独立自治的关键因素"
   "其他对象,都努力说服自己相信别的对象是独立的、可信任的、安全的"
           这些所有的东西都是和多任务联系起来的,他们一起为多任务的实现来服务

---------------------------------------------------------------------------

F28335开发板:28335EVM-I开发套件详细资料
网址:http://www.61ic.com/Shop/DSP/C2000/200801/57.html

F28335开发板:DSK28335-II开发套件详细资料
网址:http://www.61ic.com/Shop/DSP/C2000/200803/59.html

F28335开发板:DSK28335-I开发套件详细资料
网址:http://www.61ic.com/Shop/DSP/C2000/200803/58.html

F28335开发板高端系列‘
网址:http://www.tichinese.com/Article/MCU/C2000/200903/124.html

----------------------------------------------------------------------------
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条