ucos 编程

查看:  371 | 回复:  27
打印  上一主题  下一主题

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

[复制链接]
   

210

积分

172

莫元

162

飞币

中级会员

跳转到指定楼层
1
  发表于 2014-11-27 12:30:59  |  只看该作者  回帖奖励
如题,在ucos如何尽量减少全局变量的使用,以及任务之间需要传递结构体数据有什么方法,求大神指教~
   
 
 

437

积分

267

莫元

117

飞币

中级会员

2
  发表于 2014-11-27 12:36:36  |  只看该作者
不是有消息邮箱么
 
 
 

716

积分

539

莫元

54

飞币

高级会员

3
  发表于 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接收内存
技术宅拯救世界。谁来拯救技术宅
 
 
公益广告:本论坛不得使用、宣传Q群。 有讨论请在论坛里进行。 违者将封锁ID.

716

积分

539

莫元

54

飞币

高级会员

4
  发表于 2014-11-27 12:49:54  |  只看该作者
另一函数里
RfCanForm * can_msg;    
while (1)
{
    can_msg = (RfCanForm *)OSQPend(RfQSysCtl, 0, &merr);//等待CAN接收发送的消息 

}

RfCanForm和CanRxMsg都是结构体
技术宅拯救世界。谁来拯救技术宅
 
 
公益广告:发表招聘帖子需要缴费,有需要可以联系网站工作人员王小姐:13711915767.

210

积分

172

莫元

162

飞币

中级会员

5
  楼主 |  发表于 2014-11-27 13:01:02  |  只看该作者
didadida 发表于 2014-11-27 12:36
不是有消息邮箱么

邮箱不是只能传数据或者数组吗?
 
 
 
公益广告:广告只能发在本论坛的广告区,否则将封锁ID。

210

积分

172

莫元

162

飞币

中级会员

6
  楼主 |  发表于 2014-11-27 13:07:11  |  只看该作者
silence_sky 发表于 2014-11-27 12:49
另一函数里
RfCanForm * can_msg;    
while (1)

不错的方法,学习了
 
 
 

788

积分

454

莫元

138

飞币

高级会员

7
  发表于 2014-11-27 13:07:44  |  只看该作者
tian_zi 发表于 2014-11-27 13:01
邮箱不是只能传数据或者数组吗?

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

210

积分

172

莫元

162

飞币

中级会员

8
  楼主 |  发表于 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[MSG_QUEUE_SIZE];//队列排队
任务task1在发送消息的时候,发送自定义的一个结构体
typedef struct {
        INT32U ulMsgID;                         //消息ID
        INT8U aucData[4];                         //消息内容
}STRU_MSG
void task1(void *pvData)
{
       STRU_MSG pMsg;
        pMsg.ulMsgID=1;
        g_pOS_MsgQ_Task1=OSQCreate (&MboxQ_Table[0],MSG_QUEUE_SIZE);
       while(1)
       {  
           INT32U addr;
           addr = & pMsg;   
           OSQPost(g_pOS_MsgQ_Task1, addr); 
       }
}
下面是task2接收接收消息的处理。
void task2(void *pvData)
{
       STRU_MSG * msgRcvd;
       INT8U  ucOSError; 
       while(1)
       {  
           msgRcvd = (STRU_MSG *)OSQPend(g_pOS_MsgQ_Task1,0, &ucOSError);     
       }
}
然后,*msgRcvd 就是刚才过来的结构体了
这样可以实现每个MboxQ_Table传递一个STRU_MSG类型结构体数据吗?
 
 
   

385

积分

213

莫元

1701

飞币

中级会员

9
  发表于 2014-11-27 13:53:45  |  只看该作者
只看书学习过UCOS,没实战经验。标记就下。以后可能会用到。
 
 
   

210

积分

172

莫元

162

飞币

中级会员

10
  楼主 |  发表于 2014-11-28 10:54:54  |  只看该作者
10xjzheng 发表于 2014-11-27 13:07
消息队列可以传递数据结构的指针

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

317

积分

252

莫元

27

飞币

中级会员

11
  发表于 2014-11-28 11:06:02  |  只看该作者
我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。
满招损,谦受益。
 
   

210

积分

172

莫元

162

飞币

中级会员

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

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

4943

积分

283

莫元

445

飞币

金牌会员

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

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

317

积分

252

莫元

27

飞币

中级会员

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

我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗
满招损,谦受益。
 
   

210

积分

172

莫元

162

飞币

中级会员

15
  楼主 |  发表于 2014-11-28 11:55:30  |  只看该作者
chun2495 发表于 2014-11-28 11:25
我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗 ...

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

113

积分

108

莫元

297

飞币

注册会员

16
  发表于 2014-11-28 11:56:13  |  只看该作者
现在一直在裸跑,之所以没上系统就是因为全局变量太多,又怕处理不好各任务的通信、信号互斥之类的
 
 
   

317

积分

252

莫元

27

飞币

中级会员

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

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

210

积分

172

莫元

162

飞币

中级会员

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

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

260

积分

143

莫元

696

飞币

中级会员

19
  发表于 2014-11-28 13:51:26  |  只看该作者
mark  ucos  只看过,米有实战经验~~~~
 
 
   

406

积分

323

莫元

6

飞币

中级会员

20
  发表于 2014-11-28 20:47:04  |  只看该作者
zhongjp85 发表于 2014-11-28 13:51
mark  ucos  只看过,米有实战经验~~~~

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

typedef  struct 
{
                uint8_t  type;        //
                uint8_t  param;      
                 
}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  然后就卡死了。
 
 
   
21
  发表于 2014-11-28 20:56:07  |  只看该作者
消息队列没用过吗?
 
 
   

219

积分

183

莫元

66

飞币

中级会员

22
  发表于 2014-11-30 17:37:36  |  只看该作者
队列,信号量。呵呵,楼上的名字
 
 
   
23
  发表于 2014-11-30 17:53:39  |  只看该作者
zhenghe 发表于 2014-11-30 17:37
队列,信号量。呵呵,楼上的名字

怎么了? 楼主关注我后续发的帖子
蓝牙控制器 
蓝牙控制器 淘宝链接
 
   

127

积分

114

莫元

48

飞币

注册会员

24
  发表于 2014-12-1 09:26:44  |  只看该作者
MARK!!!!!!!!
 
 
   

210

积分

172

莫元

162

飞币

中级会员

25
  楼主 |  发表于 2014-12-1 13:43:56  |  只看该作者
yxylxj 发表于 2014-11-28 20:47
奇怪呢  刚才试了下 就出错了

typedef  struct

试一下这样:
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);        
        }
}
 
 
   

181

积分

161

莫元

3

飞币

注册会员

26
  发表于 2014-12-1 19:15:00  |  只看该作者
全局变量简单,不容易出错
 
 
   

210

积分

172

莫元

162

飞币

中级会员

27
  楼主 |  发表于 2014-12-2 09:25:46  |  只看该作者
xiaozuowei118 发表于 2014-12-1 19:15
全局变量简单,不容易出错

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

181

积分

161

莫元

3

飞币

注册会员

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

我觉得立标志位可行,首先每个程序其实都是轮循的机制,说从微观上,同一时间只能有一个任务被执行
豪情逞萬里,浩氣震九宵;浮沉隨浪逝,狂歌趁今朝。
 
   
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读

本版积分规则  

阿莫电子论坛, 原"中国电子开发网"

© 2004-2014 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值