tian_zi 发表于 2014-11-27 12:30:59

ucos怎么尽量减少全局变量的使用以及传递结构体数据方法

如题,在ucos如何尽量减少全局变量的使用,以及任务之间需要传递结构体数据有什么方法,求大神指教~

didadida 发表于 2014-11-27 12:36:36

不是有消息邮箱么

silence_sky 发表于 2014-11-27 12:47:49

申请内存
RfCanForm *cfmsg;
CanRxMsg *crxmsg;
crxmsg = (CanRxMsg *)OSQPend(RfQCDataRecv, 0, &qerr);//等待CAN接收
cfmsg->pr= CAN_ID2F_PRIOTITY(crxmsg->ExtId);       //取出优先级
cfmsg->s   = CAN_ID2F_S_MODULE(crxmsg->ExtId);       //取出源ID

OSQPost(RfQSysCtl, (void *)cfmsg);//传输数据
OSMemPut(RfQCanRxBuf,crxmsg);//释放CAN接收内存

silence_sky 发表于 2014-11-27 12:49:54

另一函数里
RfCanForm * can_msg;   
while (1)
{
    can_msg = (RfCanForm *)OSQPend(RfQSysCtl, 0, &merr);//等待CAN接收发送的消息

}

RfCanForm和CanRxMsg都是结构体

tian_zi 发表于 2014-11-27 13:01:02

didadida 发表于 2014-11-27 12:36
不是有消息邮箱么

邮箱不是只能传数据或者数组吗?

tian_zi 发表于 2014-11-27 13:07:11

silence_sky 发表于 2014-11-27 12:49
另一函数里
RfCanForm * can_msg;   
while (1)


不错的方法,学习了

10xjzheng 发表于 2014-11-27 13:07:44

tian_zi 发表于 2014-11-27 13:01
邮箱不是只能传数据或者数组吗?

消息队列可以传递数据结构的指针

tian_zi 发表于 2014-11-27 13:53:21

10xjzheng 发表于 2014-11-27 13:07
消息队列可以传递数据结构的指针

消息队列可以传递结构体信息,像这样有问题吗
创建了两个任务task1 和 task2,同时创建消息队列,在task1中发送消息给task2,如在task1中创建一个消息队列
#define MSG_QUEUE_SIZE 3                //消息队列长度
OS_EVENT *g_pOS_MsgQ_Task1;                //消息名
void *MboxQ_Table;//队列排队
任务task1在发送消息的时候,发送自定义的一个结构体
typedef struct {
        INT32U ulMsgID;                         //消息ID
        INT8U aucData;                         //消息内容
}STRU_MSG
void task1(void *pvData)
{
       STRU_MSG pMsg;
        pMsg.ulMsgID=1;
        g_pOS_MsgQ_Task1=OSQCreate (&MboxQ_Table,MSG_QUEUE_SIZE);
       while(1)
       {
           INT32U addr;
         addr = & pMsg;   
         OSQPost(g_pOS_MsgQ_Task1, addr);
       }
}
下面是task2接收接收消息的处理。
void task2(void *pvData)
{
       STRU_MSG * msgRcvd;
       INT8UucOSError;
       while(1)
       {
         msgRcvd = (STRU_MSG *)OSQPend(g_pOS_MsgQ_Task1,0, &ucOSError);   
       }
}
然后,*msgRcvd 就是刚才过来的结构体了
这样可以实现每个MboxQ_Table传递一个STRU_MSG类型结构体数据吗?

32MCU 发表于 2014-11-27 13:53:45

只看书学习过UCOS,没实战经验。标记就下。以后可能会用到。

tian_zi 发表于 2014-11-28 10:54:54

10xjzheng 发表于 2014-11-27 13:07
消息队列可以传递数据结构的指针

测试了一下,消息邮箱也是可以像消息队列一样传送结构体参数的

chun2495 发表于 2014-11-28 11:06:02

我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。

tian_zi 发表于 2014-11-28 11:12:14

chun2495 发表于 2014-11-28 11:06
我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。 ...

全局变量太多就不好了吧,太容易发生资源共享冲突,还得加互斥信号或者开关中断

fengyunyu 发表于 2014-11-28 11:20:51

chun2495 发表于 2014-11-28 11:06
我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。 ...

这样的话,用pt thread就可以了。

chun2495 发表于 2014-11-28 11:25:06

tian_zi 发表于 2014-11-28 11:12
全局变量太多就不好了吧,太容易发生资源共享冲突,还得加互斥信号或者开关中断 ...

我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗

tian_zi 发表于 2014-11-28 11:55:30

chun2495 发表于 2014-11-28 11:25
我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗 ...

其中一个主任务传递的接收数据结构类型比较多,要等待其余的多个任务传递的各种数据,比如字符命令类,数组数据(数据长度,数据内容,校验)。这些任务传递的数据都不一样,但是我的主任务要收集这些任务的全部数据打包处理,你有什么好的方法?

yjysss 发表于 2014-11-28 11:56:13

现在一直在裸跑,之所以没上系统就是因为全局变量太多,又怕处理不好各任务的通信、信号互斥之类的

chun2495 发表于 2014-11-28 12:32:12

tian_zi 发表于 2014-11-28 11:55
其中一个主任务传递的接收数据结构类型比较多,要等待其余的多个任务传递的各种数据,比如字符命令类,数 ...

不知道你的分任务复杂不?要是不复杂的话可以整合到一个任务里,循环扫描就行。主任务查询各个任务。全局结构体{task, length,crc,...ready},通过ready来判断是否就绪。不知可否?

tian_zi 发表于 2014-11-28 13:37:59

chun2495 发表于 2014-11-28 12:32
不知道你的分任务复杂不?要是不复杂的话可以整合到一个任务里,循环扫描就行。主任务查询各个任务。全局 ...

这样子不就是状态机模式了,而且全部变量放在一起,程序可读性太差了

zhongjp85 发表于 2014-11-28 13:51:26

markucos只看过,米有实战经验~~~~

yxylxj 发表于 2014-11-28 20:47:04

zhongjp85 发表于 2014-11-28 13:51
markucos只看过,米有实战经验~~~~

奇怪呢刚才试了下 就出错了

typedefstruct
{
                uint8_ttype;      //
                uint8_tparam;      
              
}CMD_t;

CMD_t Cmd1,*pCmd1=&Cmd1;

void Task1(void *pdata)
{       
        while(1)
        {       
                               
                                 printf("\r\n task1");
                              pCmd1->param++;
                                 pCmd1->type++;
                                 OSMboxPost(Mbox_Cmd, (void *)(pCmd1));
                OSTimeDlyHMSM(0,0,0,20);       
        }
}


void Task2(void *pdata)
{       
        while(1)
        {       
                               
                                 printf("\r\n task2");
      
                                  pCmd1=(CMD_t *)OSMboxPend(Mbox_Cmd, 1, &err);
                                  printf("\r\n pCmd1->type = %x",pCmd1->type);
                                    printf("\r\n pCmd1->param = %x",pCmd1->param);
                OSTimeDlyHMSM(0,0,0,20);       
        }
}





运行结果过:
task1
task1
task2
pCmd1->type = 1
pCmd1->param = 1
task1
task2
pCmd1->type = 2
pCmd1->param = 2
task1
task2
pCmd1->type = 3
pCmd1->param = 3
task1
task2
pCmd1->type = 4
pCmd1->param = 4
task1
task2
pCmd1->type = 58
pCmd1->param = 37
task1然后就卡死了。

磊磊映画 发表于 2014-11-28 20:56:07

消息队列没用过吗?

zhenghe 发表于 2014-11-30 17:37:36

队列,信号量。呵呵,楼上的名字

磊磊映画 发表于 2014-11-30 17:53:39

zhenghe 发表于 2014-11-30 17:37
队列,信号量。呵呵,楼上的名字

怎么了? 楼主关注我后续发的帖子

杨遥 发表于 2014-12-1 09:26:44

MARK!!!!!!!!

tian_zi 发表于 2014-12-1 13:43:56

yxylxj 发表于 2014-11-28 20:47
奇怪呢刚才试了下 就出错了

typedefstruct


试一下这样:
CMD_t Cmd1;
void Task1(void *pdata)
{         
      while(1)
      {                              
                printf("\r\n task1");
                Cmd1.param=1;
                Cmd1.type=2;
                OSMboxPost(Mbox_Cmd, &Cmd1);
                OSTimeDlyHMSM(0,0,0,20);      
      }
}

void Task2(void *pdata)
{         
        u8 err;
        CMD_t *pCmd2;
      while(1)
      {      
                printf("\r\n task2");
                pCmd2=(CMD_t *)OSMboxPend(Mbox_Cmd, 0, &err);
                printf("\r\n pCmd2.type = %x",pCmd2->type);
                printf("\r\n pCmd2.param = %x",pCmd2->param);
                OSTimeDlyHMSM(0,0,0,20);      
      }
}

xiaozuowei118 发表于 2014-12-1 19:15:00

全局变量简单,不容易出错

tian_zi 发表于 2014-12-2 09:25:46

xiaozuowei118 发表于 2014-12-1 19:15
全局变量简单,不容易出错

全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的内聚和耦合怎么考虑呢?

xiaozuowei118 发表于 2014-12-2 12:45:00

tian_zi 发表于 2014-12-2 09:25
全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的 ...

我觉得立标志位可行,首先每个程序其实都是轮循的机制,说从微观上,同一时间只能有一个任务被执行

gerbansh520 发表于 2014-12-27 11:52:15

tian_zi 发表于 2014-12-2 09:25
全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的 ...

楼主百度:基于uCOS的电梯控制 这个详细的代码里有很多变量的处理 可以参考。
页: [1]
查看完整版本: ucos怎么尽量减少全局变量的使用以及传递结构体数据方法