OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12213|回复: 9

UCOSIII里的消息队列问题

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-6-17
在线时间
5 小时
发表于 2015-6-17 21:43:43 | 显示全部楼层 |阅读模式
5金钱

1.OSQPend的返回值是个指针,那这个指针指向哪?
2.如果OSQPend返回的指针指向的是OSQPost传入的指针,那这个指针是不是就不能用局部变量了?
3.如果OSQPend返回的指针指向的是OSQPost传入的指针,那如果我一次传入多个字节(比如一个数组a[8]),那在OSQPend里我该如何调回?
4.OSQPost(&CAN1Q,&c,1,OS_OPT_POST_FIFO,&err);
    OSQPost(&Usart1Q,&c,1,OS_OPT_POST_FIFO,&err); 这样同时将同一个变量传入是不是有问题?
5.消息队列做中断服务和任务的通信是否合适?

最佳答案

查看完整内容[请看2#楼]

1、返回的指针就是你消息的位置。 2、是的,消息指针不能用局部变量。 3、把你要传递的数据写到一个数组里面,数组要是全局变量,或者你可以使用内存管理申请一段内存来存放要传递的数据,然后将这个数组的首地址通过OSQPost()来发送,你调用OSQPend()请求到的就是这个数组的首地址。 4、用法上来讲没有任何问题,但是不建议这么用。 5、消息队列就是为了任务与任务,中断服务函数与任务之间通信做的,你觉得合适吗?!不过在中断 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-6-17 21:43:44 | 显示全部楼层
1、返回的指针就是你消息的位置。
2、是的,消息指针不能用局部变量。
3、把你要传递的数据写到一个数组里面,数组要是全局变量,或者你可以使用内存管理申请一段内存来存放要传递的数据,然后将这个数组的首地址通过OSQPost()来发送,你调用OSQPend()请求到的就是这个数组的首地址。
4、用法上来讲没有任何问题,但是不建议这么用。
5、消息队列就是为了任务与任务,中断服务函数与任务之间通信做的,你觉得合适吗?!不过在中断服务函数中只能Post,不能Pend。任务就无所谓了
开往春天的手扶拖拉机
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-6-17
在线时间
5 小时
 楼主| 发表于 2015-6-20 20:30:12 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
按照我的理解我写了个程序,实现将收到的CAN数据发回去,但是回来的数据不对,不知道是哪里的问题,能不能帮我看一下:
代码:
发送任务函数
static void AppTaskCAN(void *p_arg)
{
OS_ERR      err;
CPU_SR_ALLOC();
u8 *qout,i;
u8 *data;
OS_MSG_SIZE size;
(void)p_arg;
qout=malloc(100);
data=malloc(100);
while(1)
{
qout=OSQPend(&CAN1Q,0,OS_OPT_PEND_BLOCKING,&size,NULL,&err);
i=*qout;
       printf("TaskCan:%x\r\n",i);
memcpy(data,qout,size);
CAN1_Send(data,size);
}   
}
中断服务函数:
void CAN1_RX0_IRQHandler(void)
{ int i;
OS_ERR      err;
CanRxMsg RxMessage;

OSIntEnter();

CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
for(i=0;i<RxMessage.DLC;i++)
{
Can1RxData=RxMessage.Data;
}
        printf("directly out:%x",Can1RxData[0]);
OSQPost(&CAN1Q,&Can1RxData,RxMessage.DLC,OS_OPT_POST_FIFO,&err);
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
OSIntExit();
}
要传递的数据变量是CAN1RxData,是个u8的指针,在开始任务里我也给他分配空间了,发回来的数据字节数倒是对的,但数据不对,而且没有变化,一直是固定的几个数>
回复

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
发表于 2015-12-28 16:13:44 | 显示全部楼层
楼主 最后登录时间1970-1-1  楼主穿越了
回复

使用道具 举报

16

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2013-11-23
在线时间
6 小时
发表于 2015-12-29 10:08:02 | 显示全部楼层
这尼玛简直就是惊天bug
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-18
在线时间
9 小时
发表于 2016-4-17 14:46:39 | 显示全部楼层
zuozhongkai 发表于 2015-6-17 21:43
1、返回的指针就是你消息的位置。
2、是的,消息指针不能用局部变量。
3、把你要传递的数据写到一个数组里 ...

有没有声明外部消息队列的说法,就是在某个.C文件声明的消息队列,在别的.C文件里面可以调用不?
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-31
在线时间
8 小时
发表于 2017-10-16 22:27:21 | 显示全部楼层
mllen858585 发表于 2016-4-17 14:46
有没有声明外部消息队列的说法,就是在某个.C文件声明的消息队列,在别的.C文件里面可以调用不?

外部声明您这里有解决么?可否告知一下
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-7-5
在线时间
2 小时
发表于 2018-7-5 14:32:26 | 显示全部楼层
zuozhongkai 发表于 2015-6-17 21:43
1、返回的指针就是你消息的位置。
2、是的,消息指针不能用局部变量。
3、把你要传递的数据写到一个数组里 ...

ucosiii的消息队列是用来传递 地址的,有两点不同意你的观点,用一个数组的话,如果能够执行一个POST 然后一个pend 的话那是没有问题的,而如果要是多个post 的话,最终消息队列满了的话,所有消息队列的消息都和最后一条消息一样,因为每次保存的地址都是 那个全局数组的地址 ,POST可以发送局部变量,你们用mymalloc的例程不也是这样操作的吗
回复

使用道具 举报

26

主题

356

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-10-29 16:56:13 | 显示全部楼层
zuozhongkai 发表于 2015-6-17 21:43
1、返回的指针就是你消息的位置。
2、是的,消息指针不能用局部变量。
3、把你要传递的数据写到一个数组里 ...

虽然是老帖,不过解决了困扰我一天的疑问,赞
回复

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2018-10-29 17:56:33 | 显示全部楼层
陈皮皮 发表于 2018-10-29 16:56
虽然是老帖,不过解决了困扰我一天的疑问,赞

之前也被搞混过。ucos的消息队列不会进行数据拷贝,只是发送指针过来。而freeRTOS则会原原本本地拷贝消息本身。个人觉得freeRTOS的消息队列才是真正的队列。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 08:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表