搜索
查看: 13421|回复: 7

[求助] 用FreeRTOS,使用队列怎么发送一个结构体呢?osMessagePut有局...

[复制链接]

该用户从未签到

9

主题

46

帖子

0

蝴蝶豆

中级会员

最后登录
2021-2-23
发表于 2016-9-12 11:14:15 | 显示全部楼层 |阅读模式


在函数osMessageGet 只能返回一个4个字节啊。在xQueueReceive它只传了一个uint32_t  v啊,只有四个字节。
那就限制了最大的数据就是四个字节了,感觉应该不会是这样啊,那么我怎么使用队列,发送一个12个字节的结构体呢?


osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)
{
  portBASE_TYPE taskWoken;
  TickType_t ticks;
  osEvent event;
...................
...............
  else {
    if (xQueueReceive(queue_id, &event.value.v, ticks) == pdTRUE) {
      /* We have mail */
  }
    return event;
}

typedef struct  {
  osStatus                 status;     ///< status code: event or error information
  union  {
    uint32_t                    v;     ///< message as 32-bit value
    void                       *p;     ///< message or mail as void pointer
    int32_t               signals;     ///< signal flags
  } value;   
union  {
    osMailQId             mail_id;     ///< mail id obtained by \ref osMailCreate
    osMessageQId       message_id;     ///< message id obtained by \ref osMessageCreate
  } def;                               ///< event definition


回复

使用道具 举报

该用户从未签到

4

主题

578

帖子

3

蝴蝶豆

高级会员

最后登录
2020-12-10
发表于 2016-9-12 13:21:15 | 显示全部楼层
发送一个指针类型的吧
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

46

帖子

0

蝴蝶豆

中级会员

最后登录
2021-2-23
 楼主| 发表于 2016-9-12 16:54:59 | 显示全部楼层
只有发送一个地址了,这样还得定义一个数组或者链表来做缓存。有点麻烦了。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

578

帖子

3

蝴蝶豆

高级会员

最后登录
2020-12-10
发表于 2016-9-13 08:20:32 | 显示全部楼层
这点麻烦算是上事,起码有个思路先跑通。后续可以再考虑优化。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

15

帖子

10

蝴蝶豆

中级会员

最后登录
2020-5-26
发表于 2016-9-13 13:57:59 | 显示全部楼层
寒风飘飘 发表于 2016-9-12 16:54
只有发送一个地址了,这样还得定义一个数组或者链表来做缓存。有点麻烦了。 ...

union里有void *p,直接传指针也可以的吧?

  1. typedef struct  {
  2.   osStatus                 status;     ///< status code: event or error information
  3.   union  {
  4.     uint32_t                    v;     ///< message as 32-bit value
  5.     void                       *p;     ///< message or mail as void pointer
  6.     int32_t               signals;     ///< signal flags
  7.   } value;  
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

46

帖子

0

蝴蝶豆

中级会员

最后登录
2021-2-23
 楼主| 发表于 2016-9-13 14:20:57 | 显示全部楼层
可以传指针,v和*p是一样的,因为可以强制转换,都可以用,都是4个字节。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

中级会员

最后登录
2018-7-18
发表于 2016-9-14 10:00:05 | 显示全部楼层
考虑到效率,都是用传指针的吧,转换回去就是了,如果要发送一个结构体如果是局部变量还要复制内存,多麻烦。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

初级会员

最后登录
2020-1-3
发表于 2019-11-5 23:47:31 | 显示全部楼层
只有用osMailPut (osMailQId queue_id, void *mail);了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-4 01:11 , Processed in 1.170175 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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