打印
[uCOS/RTOS]

新手学习ucos,有问题请大神指教~~~

[复制链接]
1029|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小弟初学ucos,恳请大神指教
问题描述:如下是建立一个消息队列的源码
OS_EVENT *OSQCreate (void **start, INT16U size)
{
    OS_EVENT *pevent;
    OS_Q     *pq;

    OS_ENTER_CRITICAL();
    pevent = OSEventFreeList;                  
    if (OSEventFreeList != (OS_EVENT *)0) {     
        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
    }
    OS_EXIT_CRITICAL();
    if (pevent != (OS_EVENT *)0) {               
        OS_ENTER_CRITICAL();                     
        pq = OSQFreeList;/*从空闲队列控制块链表中取得一个空闲队列控制块*/
        if (OSQFreeList != (OS_Q *)0) {/*指向非空,说明空闲链表中还有空闲队列控制块*/
            OSQFreeList = OSQFreeList->OSQPtr;/*调整空闲队列链表的表头,使它指向下一个节点*/
        }
        OS_EXIT_CRITICAL();
        if (pq != (OS_Q *)0) {                   /*如何理解这句?这个pq会指向哪里呢?(如下面这张图)*/
            pq->OSQStart        = start;        
           ~~~~~~


相关帖子

沙发
liuchang890811|  楼主 | 2015-7-14 14:33 | 只看该作者
如代码倒数第二行
此时如果pq不指向空(NULL),那它会指向哪里呢?

使用特权

评论回复
板凳
john_lee| | 2015-7-14 16:29 | 只看该作者
指向OS_MAX_QS中的某一个OS_Q

使用特权

评论回复
地板
liuchang890811|  楼主 | 2015-7-14 17:28 | 只看该作者
谢谢大神:
再请教大神一个问题:积分不多,恳请大神见谅啊~~~
1 针对ucos中的消息队列,每个消息队列都是一个指针数组,这个没问题吧
2 这个数组指针中可以存储各种不同类型的数据,例如char a,int b
3 如果这时候有个mytask任务,它可以直接申请这个消息队列中的char a这个数据吗?还是必须一次申请整个消息队列?4 针对这个消息队列,是不是应该有个变量,告诉任务,我一次可以让至多多少个任务同时共享这个资源(这个消息队列),是不是可以这样理解呢?

使用特权

评论回复
5
liuchang890811|  楼主 | 2015-7-14 17:31 | 只看该作者
小弟看的是邵贝贝的那本书,有些地方不能理解,恳请大神不惜赐教,拜谢了~~~

使用特权

评论回复
6
john_lee| | 2015-7-14 18:08 | 只看该作者
队列中的数据空间,虽然定义为指针数组,但这只是表示它的每个单位数据的长度与指针的长度相同,可以存放小于或等于该长度的任何数据。
比如指针的长度为 2,char 长度为 1,int 长度为 2,long 长度为 4,那么队列可以存放 char、int,而不能存放 long。
只是存放的时候要把这些数据强制转换为指针。
任务pend队列,队列只能顺序地把存放的数据交给任务,而不能随机访问。
确实有这个变量,称为任务阻塞队列,在ucos中表现为一个bitmap,这个bitmap在所有同步对象(信号量、邮箱、队列、事件标志)中都有。

使用特权

评论回复
7
liuchang890811|  楼主 | 2015-7-15 08:49 | 只看该作者
感谢大神细心指导!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

87

帖子

0

粉丝