ucos 编程

来源:互联网 发布:有利网高收益网络理财 编辑:程序博客网 时间:2024/04/24 13:03
开启辅助访问

amoBBS 阿莫电子论坛

jenney |我的 |设置 |消息 |提醒 |退出

积分: 16 |用户组: 新手上路

快捷导航
  • 首页
  • 全部帖汇总
  • 技术帖汇总
  • 非飞思汇总
  • 非技术帖子
  • 阿莫电子邮购
 帖子
热搜:净化器雕刻机阿莫邮购
amoBBS 阿莫电子论坛»论坛首页操作系统嵌入式OSucos怎么尽量减少全局变量的使用以及传递结构体数据方法 ...
bottom↓
返回列表发新帖回复
查看: 371|回复: 27
打印 上一主题 下一主题

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

[复制链接]  
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

举报

 
论坛公益广告:使用360产品将会被封锁ID。周流氓枪毙1万次也无法弥补3721犯下的罪行。
didadida

437

积分

267

莫元

117

飞币

中级会员

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

举报

 
公益广告:发表新主题时,务必起一个能说明帖子内容的清晰标题,否则将会被封锁ID(点击查看详细说明)
silence_sky

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.
silence_sky

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.
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

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

举报

 
公益广告:广告只能发在本论坛的广告区,否则将封锁ID。
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

不错的方法,学习了
  
回复

举报

 
本论坛禁止与网站产品有冲突的广告,如雕刻机、PCB、空气净化器等
10xjzheng

788

积分

454

莫元

138

飞币

高级会员

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

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

举报

  
tian_zi

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类型结构体数据吗?
  
回复

举报

  
32MCU

385

积分

213

莫元

1701

飞币

中级会员

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

举报

  
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

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

举报

  
chun2495

317

积分

252

莫元

27

飞币

中级会员

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

举报

  
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

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

举报

  
fengyunyu

4943

积分

283

莫元

445

飞币

金牌会员

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

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

举报

  
chun2495

317

积分

252

莫元

27

飞币

中级会员

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

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

举报

  
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

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

举报

  
yjysss

113

积分

108

莫元

297

飞币

注册会员

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

举报

  
chun2495

317

积分

252

莫元

27

飞币

中级会员

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

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

举报

  
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

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

举报

  
zhongjp85

260

积分

143

莫元

696

飞币

中级会员

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

举报

  
yxylxj

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  然后就卡死了。
  
回复

举报

  
磊磊映画

1202

积分

704

莫元

135

飞币

金牌会员

  • 发消息
21
 发表于 2014-11-28 20:56:07 | 只看该作者
消息队列没用过吗?
  
回复

举报

  
zhenghe

219

积分

183

莫元

66

飞币

中级会员

  • 发消息
22
 发表于 2014-11-30 17:37:36 | 只看该作者
队列,信号量。呵呵,楼上的名字
  
回复

举报

  
磊磊映画

1202

积分

704

莫元

135

飞币

金牌会员

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

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

举报

  
杨遥

127

积分

114

莫元

48

飞币

注册会员

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

举报

  
tian_zi

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);        
        }
}
  
回复

举报

  
xiaozuowei118

181

积分

161

莫元

3

飞币

注册会员

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

举报

  
tian_zi

210

积分

172

莫元

162

飞币

中级会员

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

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

举报

  
xiaozuowei118

181

积分

161

莫元

3

飞币

注册会员

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

我觉得立标志位可行,首先每个程序其实都是轮循的机制,说从微观上,同一时间只能有一个任务被执行
豪情逞萬里,浩氣震九宵;浮沉隨浪逝,狂歌趁今朝。
 
回复

举报

  
返回列表发新帖回复
up↑
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
{:smile:}{:sad:}{:biggrin:}{:cry:}{:huffy:}{:shocked:}{:tongue:}{:shy:}{:titter:}{:sweat:}{:mad:}{:lol:}{:loveliness:}{:funk:}{:curse:}{:dizzy:}{:shutup:}{:sleepy:}{:hug:}{:victory:}{:time:}{:kiss:}{:handshake:}{:call:}
高级模式
BColorImageLinkQuoteCodeSmilies|

本版积分规则 

举报|手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 ) 

GMT+8, 2014-12-17 22:55

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

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

0 0
原创粉丝点击