ucos怎么尽量减少全局变量的使用以及传递结构体数据方法
如题,在ucos如何尽量减少全局变量的使用,以及任务之间需要传递结构体数据有什么方法,求大神指教~ 不是有消息邮箱么 申请内存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接收内存 另一函数里
RfCanForm * can_msg;
while (1)
{
can_msg = (RfCanForm *)OSQPend(RfQSysCtl, 0, &merr);//等待CAN接收发送的消息
略
}
RfCanForm和CanRxMsg都是结构体 didadida 发表于 2014-11-27 12:36
不是有消息邮箱么
邮箱不是只能传数据或者数组吗? silence_sky 发表于 2014-11-27 12:49
另一函数里
RfCanForm * can_msg;
while (1)
不错的方法,学习了 tian_zi 发表于 2014-11-27 13:01
邮箱不是只能传数据或者数组吗?
消息队列可以传递数据结构的指针 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类型结构体数据吗? 只看书学习过UCOS,没实战经验。标记就下。以后可能会用到。 10xjzheng 发表于 2014-11-27 13:07
消息队列可以传递数据结构的指针
测试了一下,消息邮箱也是可以像消息队列一样传送结构体参数的 我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。 chun2495 发表于 2014-11-28 11:06
我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。 ...
全局变量太多就不好了吧,太容易发生资源共享冲突,还得加互斥信号或者开关中断 chun2495 发表于 2014-11-28 11:06
我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。 ...
这样的话,用pt thread就可以了。 tian_zi 发表于 2014-11-28 11:12
全局变量太多就不好了吧,太容易发生资源共享冲突,还得加互斥信号或者开关中断 ...
我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗 chun2495 发表于 2014-11-28 11:25
我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗 ...
其中一个主任务传递的接收数据结构类型比较多,要等待其余的多个任务传递的各种数据,比如字符命令类,数组数据(数据长度,数据内容,校验)。这些任务传递的数据都不一样,但是我的主任务要收集这些任务的全部数据打包处理,你有什么好的方法? 现在一直在裸跑,之所以没上系统就是因为全局变量太多,又怕处理不好各任务的通信、信号互斥之类的 tian_zi 发表于 2014-11-28 11:55
其中一个主任务传递的接收数据结构类型比较多,要等待其余的多个任务传递的各种数据,比如字符命令类,数 ...
不知道你的分任务复杂不?要是不复杂的话可以整合到一个任务里,循环扫描就行。主任务查询各个任务。全局结构体{task, length,crc,...ready},通过ready来判断是否就绪。不知可否? chun2495 发表于 2014-11-28 12:32
不知道你的分任务复杂不?要是不复杂的话可以整合到一个任务里,循环扫描就行。主任务查询各个任务。全局 ...
这样子不就是状态机模式了,而且全部变量放在一起,程序可读性太差了 markucos只看过,米有实战经验~~~~ 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然后就卡死了。 消息队列没用过吗? 队列,信号量。呵呵,楼上的名字 zhenghe 发表于 2014-11-30 17:37
队列,信号量。呵呵,楼上的名字
怎么了? 楼主关注我后续发的帖子 MARK!!!!!!!! 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
全局变量简单,不容易出错
全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的内聚和耦合怎么考虑呢? tian_zi 发表于 2014-12-2 09:25
全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的 ...
我觉得立标志位可行,首先每个程序其实都是轮循的机制,说从微观上,同一时间只能有一个任务被执行 tian_zi 发表于 2014-12-2 09:25
全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的 ...
楼主百度:基于uCOS的电梯控制 这个详细的代码里有很多变量的处理 可以参考。
页:
[1]