ucos 编程
来源:互联网 发布:有利网高收益网络理财 编辑:程序博客网 时间:2024/04/24 13:03
开启辅助访问
jenney |我的 |设置 |消息 |提醒 |退出
积分: 16 |用户组: 新手上路
快捷导航
- 首页
- 全部帖汇总
- 技术帖汇总
- 非飞思汇总
- 非技术帖子
- 阿莫电子邮购
amoBBS 阿莫电子论坛
论坛首页 操作系统 嵌入式OS ucos怎么尽量减少全局变量的使用以及传递结构体数据方法 ...bottom↓
返回列表
371| 27
ucos怎么尽量减少全局变量的使用以及传递结构体数据方法
210
积分172
莫元162
飞币中级会员
如题,在ucos如何尽量减少全局变量的使用,以及任务之间需要传递结构体数据有什么方法,求大神指教~
收藏2
回复
举报
论坛公益广告:使用360产品将会被封锁ID。周流氓枪毙1万次也无法弥补3721犯下的罪行。
437
积分267
莫元117
飞币中级会员
不是有消息邮箱么
回复
举报
公益广告:发表新主题时,务必起一个能说明帖子内容的清晰标题,否则将会被封锁ID(点击查看详细说明)
716
积分539
莫元54
飞币高级会员
申请内存
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 *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
飞币高级会员
另一函数里
RfCanForm * can_msg;
while (1)
{
can_msg = (RfCanForm *)OSQPend(RfQSysCtl, 0, &merr);//等待CAN接收发送的消息
略
}
RfCanForm和CanRxMsg都是结构体
RfCanForm * can_msg;
while (1)
{
can_msg = (RfCanForm *)OSQPend(RfQSysCtl, 0, &merr);//等待CAN接收发送的消息
略
}
RfCanForm和CanRxMsg都是结构体
回复
举报
公益广告:发表招聘帖子需要缴费,有需要可以联系网站工作人员王小姐:13711915767.
210
积分172
莫元162
飞币中级会员
邮箱不是只能传数据或者数组吗?
回复
举报
公益广告:广告只能发在本论坛的广告区,否则将封锁ID。
210
积分172
莫元162
飞币中级会员
不错的方法,学习了
回复
举报
本论坛禁止与网站产品有冲突的广告,如雕刻机、PCB、空气净化器等
788
积分454
莫元138
飞币高级会员
消息队列可以传递数据结构的指针
回复
举报
210
积分172
莫元162
飞币中级会员
消息队列可以传递结构体信息,像这样有问题吗
创建了两个任务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
飞币中级会员
只看书学习过UCOS,没实战经验。标记就下。以后可能会用到。
回复
举报
210
积分172
莫元162
飞币中级会员
测试了一下,消息邮箱也是可以像消息队列一样传送结构体参数的
回复
举报
317
积分252
莫元27
飞币中级会员
我一般都用全局变量传递,简单好操作,ucos只用到任务创建,同时跑四个任务。
回复
举报
210
积分172
莫元162
飞币中级会员
全局变量太多就不好了吧,太容易发生资源共享冲突,还得加互斥信号或者开关中断
回复
举报
4943
积分283
莫元445
飞币金牌会员
这样的话,用pt thread就可以了。
回复
举报
317
积分252
莫元27
飞币中级会员
我的任务没有那么复杂,任务和任务之间通信比较简单,你的通信机制很复杂吗
回复
举报
210
积分172
莫元162
飞币中级会员
其中一个主任务传递的接收数据结构类型比较多,要等待其余的多个任务传递的各种数据,比如字符命令类,数组数据(数据长度,数据内容,校验)。这些任务传递的数据都不一样,但是我的主任务要收集这些任务的全部数据打包处理,你有什么好的方法?
回复
举报
113
积分108
莫元297
飞币注册会员
现在一直在裸跑,之所以没上系统就是因为全局变量太多,又怕处理不好各任务的通信、信号互斥之类的
回复
举报
317
积分252
莫元27
飞币中级会员
不知道你的分任务复杂不?要是不复杂的话可以整合到一个任务里,循环扫描就行。主任务查询各个任务。全局结构体{task[number], length,crc,...ready},通过ready来判断是否就绪。不知可否?
回复
举报
210
积分172
莫元162
飞币中级会员
这样子不就是状态机模式了,而且全部变量放在一起,程序可读性太差了
回复
举报
260
积分143
莫元696
飞币中级会员
mark ucos 只看过,米有实战经验~~~~
回复
举报
406
积分323
莫元6
飞币中级会员
奇怪呢 刚才试了下 就出错了
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
飞币金牌会员
消息队列没用过吗?
回复
举报
219
积分183
莫元66
飞币中级会员
队列,信号量。呵呵,楼上的名字
回复
举报
1202
积分704
莫元135
飞币金牌会员
怎么了? 楼主关注我后续发的帖子
回复
举报
127
积分114
莫元48
飞币注册会员
MARK!!!!!!!!
回复
举报
210
积分172
莫元162
飞币中级会员
试一下这样:
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
飞币注册会员
全局变量简单,不容易出错
回复
举报
210
积分172
莫元162
飞币中级会员
全局变量不是不可重入吗,如果多任务访问全局变量还得加互斥信号和开关中断处理。而且全局变量多,程序的内聚和耦合怎么考虑呢?
回复
举报
181
积分161
莫元3
飞币注册会员
我觉得立标志位可行,首先每个程序其实都是轮循的机制,说从微观上,同一时间只能有一个任务被执行
回复
举报
返回列表
举报|手机版|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
- ucos 编程
- ucos:ucos 应用编程大全
- ucos
- ucos
- ucos
- UCOS
- ucos
- 基于uCOS-II的UDP网络编程
- 基于uCOS-II的UDP网络编程
- 基于uCOS-II的UDP网络编程
- ucos资料
- ucos-recorde1
- ucos-recorde2
- 移植ucos
- ucos---信号量
- ucos---优先级
- UCOS 简介
- bc31+uCOS
- 算法竞赛入门经典(第二版)第3章部分学习实现(上)
- Unity视频播放可添加控制按钮方案
- windows系统下mysql出现Error 1045(28000) Access Denied for user 'root'@'localhost'
- The diameter of a binary tree
- 如何让End Device进入低功耗状态,休眠时间是如何设定的?
- ucos 编程
- 逆向工程第004篇:跨越CM4验证机制的鸿沟(中)
- 地形DEM中立体等高线的3D表达和处理
- 黑马程序员-Object-C语言对象与函数参数的总结
- Windows下的半自动线程锁
- 如何重启MySQL服务,正确重启mysql
- list remove-----删除数据
- 设计模式之适配器模式
- Apple不认Android的AMR?用暴风转码给它脱胎换骨吧