硬汉嵌入式论坛

 找回密码
 立即注册
查看: 821|回复: 3
收起左侧

[ThreadX全家桶] threadx 消息队列问题

[复制链接]

14

主题

54

回帖

96

积分

初级会员

积分
96
发表于 2024-7-20 00:00:51 | 显示全部楼层 |阅读模式
本帖最后由 Superusrss 于 2024-7-20 08:34 编辑

threadx 的创建信号量时候有说message_size指的是多少个word(4byte)大小, 有几个问题

1:我创建了uart缓冲区 uint8_t uart_buffer[512] 使用这个直接发送是否有点大,是否 tx_queue_create(&uart1_data_queue, "uart1_rx_queue", 128, uart1_rx_buff, 512) 就可以。还是直接全局数组就行
2:由于threadx的queue是直接复制,如此大的消息会不会很占时间; 若传递指针如何实现
3,若单次传递uint8_t类型,使用queue有点浪费了,有什么好的方法
4,我想一个队列传递给两个进程,是否要创建两个队列这样的话,还得再建两个512字节的缓冲区用作tx_queue_receive。。好不方便

ps: 问过所有AI都声称message_size的单位是1个字节而不是word,然而手册上明明白白写着是word
ps2: 吐槽一下,threadx源文件太多了,编译要好久,不如freertos那么简练


最新进展,queue发送一个字符很好用,要发送一个数组时候乱码,代码如下
[C] 纯文本查看 复制代码

uint8_t rx_data;
uint16_t uart1_rx_buff_index = 0;

uint8_t rx_buff1[RX_BUFFER_SIZE];
uint8_t rx_buff2[RX_BUFFER_SIZE];

uint8_t uart_buffer[12];
uint8_t uart_receive_buffer[12];

#define RX_BUFFER_SIZE 5

/* UART RX callback function */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        /* receive data from UART1 */
        HAL_UART_Receive_IT(&huart1, &rx_data, 1);
        if (uart1_rx_buff_index <= RX_BUFFER_SIZE - 1)
        {
            current_rx_buffer[uart1_rx_buff_index++] = rx_data;
        }
        else
        {
            /* queue full, discard data */
            ret = tx_queue_send(&uart1_data_queue, currentt_rx_buffer, TX_NO_WAIT);
            if (TX_SUCCESS != ret)
            {
                // App_Printf("UART1 RX queue full, discard data\r\n");
                tx_queue_receive(&uart1_data_queue, &uart_receive_buffer, TX_NO_WAIT);
                App_Printf("queue data %s", &uart_receive_buffer);
            }
            uart1_rx_buff_index = 0;
            current_rx_buffer = (current_rx_buffer == rx_buff1) ? rx_buff2 : rx_buff1;
            current_rx_buffer[uart1_rx_buff_index++] = rx_data;
        }
    }
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-7-20 09:47:18 | 显示全部楼层
512字节太大,别用消息队列直接发,消息队列是数据的复制粘贴,搞512字节的复制粘贴非常消耗时间,当前thread这种消息队列用法也不支持这么大,限制了最大复制粘贴次数。

解决办法可以是发送数据的地址做消息队列传递即可。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 昨天 18:29 | 显示全部楼层
eric2013 发表于 2024-7-20 09:47
512字节太大,别用消息队列直接发,消息队列是数据的复制粘贴,搞512字节的复制粘贴非常消耗时间,当前thre ...

那很不方便了,还不如定义一个BUFF[],然后用信号量获取释放操作了;发送原数据的地址,如果有很多个不同类型的原数据,就要定义很多buff[]了;
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 9 小时前 | 显示全部楼层
Yinyulong88 发表于 2025-4-24 18:29
那很不方便了,还不如定义一个BUFF[],然后用信号量获取释放操作了;发送原数据的地址,如果有很多个不同 ...

结构体封装下,传递结构体地址即可
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 20:59 , Processed in 0.208329 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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