硬汉嵌入式论坛

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

[RTOS] threadx 队列问题

[复制链接]

8

主题

25

回帖

49

积分

初级会员

积分
49
发表于 2023-3-2 15:17:09 | 显示全部楼层 |阅读模式
我信仰要崩了


threadx 的队列 拿来当 freertos的队列一样来使用

下面是具体内容:

串口中断这里初始化中断接收缓冲区

uint8_t UartRecv[1024] ={0};

中断里面处理省略(基本都一样)


发送缓冲区数据

if (tx_queue_send(&RS422_0_Queue,(VOID *)&rs422Recv, TX_NO_WAIT) == TX_SUCCESS)
{

}

任务初始化如下:
TX_QUEUE  Queue;

uint8_t *mem_Queue_ptr = NULL;
uint32_t Queue_stack_size = (1 *1024);
status = tx_byte_allocate(MemHeapPtr,(void **)&mem_Queue_ptr,Queue_stack_size,TX_NO_WAIT);
if (status != TX_SUCCESS)
{
        mem_rs422Queue_ptr = NULL;
        status = TX_START_ERROR;
}
else
{
        //清空默认脏数据
        memset(mem_Queue_ptr,0,Queue_stack_size);
}

if (tx_queue_create(&Queue, (CHAR*)"Message Queue",TX_1_ULONG,mem_Queue_ptr,Queue_stack_size) != TX_SUCCESS)
    {
        status = TX_QUEUE_ERROR;
        Error_Handler((char*)__FILE__,__LINE__);
    }

发送的数据如下:(16进制)
0 1 2 3 4 5 6 7 8 9 a b c d e f 5a 54 12 13 14 15 16 17 18 19 0 5a fe
接收数据如下16进制)
1 23 45 0 0 0 0 0

修改几个

TX_1_ULONG
TX_2_ULONG
TX_4_ULONG
TX_8_ULONG
TX_16_ULONG
都是只能接收几个字节

我发的数据是200多字节
这坑怎们填

回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-3-2 16:03:45 | 显示全部楼层
我想传输1024字节数据
回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-3-2 16:59:42 | 显示全部楼层
而且接收显示出来数据错位了
回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-3-2 18:04:22 | 显示全部楼层
错位问题是我的问题,不是 threadx 的问题,但是怎们样能传输1KB的数据从队列发送函数发送到队列接收端呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-3-3 00:49:11 | 显示全部楼层
rog 发表于 2023-3-2 18:04
错位问题是我的问题,不是 threadx 的问题,但是怎们样能传输1KB的数据从队列发送函数发送到队列接收端呢

ThreadX的消息队列是数据的复制粘贴,所以他限制消息队列的消息大小 1-16,每个消息 4 字节。

如果超过了,直接传递缓冲地址,比如你说的1KB,这个就太大了,复制粘贴太慢,直接传地址。
回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-3-3 09:33:24 | 显示全部楼层
eric2013 发表于 2023-3-3 00:49
ThreadX的消息队列是数据的复制粘贴,所以他限制消息队列的消息大小 1-16,每个消息 4 字节。

如果超 ...

主要是想把它当作fifo使用,一边收数据,另一边发送数据,它自身作为缓冲区
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2023-3-3 11:02:41 | 显示全部楼层
本帖最后由 morning_enr6U 于 2023-3-3 11:04 编辑

由于ThreadX是功能安全的RTOS,那么,你给予FreeRTOS的经验,是不太合适的。

换个思路, 发送端申请内存,拷贝数据,把数据区首地址,发送到队列, 接收队列,数据还原指针,安全检查,拷贝数据,释放内存。
以上是基于大量数据传递的。  少量的数据,就直接用ThreadX的队列传递,就好了。
回复

使用道具 举报

38

主题

291

回帖

405

积分

高级会员

积分
405
发表于 2023-3-3 11:11:21 | 显示全部楼层
morning_enr6U 发表于 2023-3-3 11:02
由于ThreadX是功能安全的RTOS,那么,你给予FreeRTOS的经验,是不太合适的。

换个思路, 发送端申请内存 ...

你可以用队列传递数据缓冲区地址
回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-3-3 11:21:16 | 显示全部楼层
morning_enr6U 发表于 2023-3-3 11:02
由于ThreadX是功能安全的RTOS,那么,你给予FreeRTOS的经验,是不太合适的。

换个思路, 发送端申请内存 ...

数据是从中断发过来的,有数据格式,但长度不定,短的几百字节,长的几KB字节,而且是一对多 ,像你这样说的话我是不是需要多做几个buffer
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2023-3-3 11:49:39 | 显示全部楼层
这种场景,你用一个ring buffer就好了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-3-3 12:02:10 | 显示全部楼层
rog 发表于 2023-3-3 09:33
主要是想把它当作fifo使用,一边收数据,另一边发送数据,它自身作为缓冲区

消息队列本身已经是FIFO,然后每次用1K,你用动态内存申请1KB传递其地址即可,接收处理完毕了释放即可,简单易实现。
回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-3-3 13:44:16 | 显示全部楼层
eric2013 发表于 2023-3-3 12:02
消息队列本身已经是FIFO,然后每次用1K,你用动态内存申请1KB传递其地址即可,接收处理完毕了释放即可, ...

地址拷贝的话,数据buffer怎们处理,要做多个 buffer 嘛?不太会,有范例吗
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2023-3-3 15:39:24 | 显示全部楼层
rog 发表于 2023-3-3 13:44
地址拷贝的话,数据buffer怎们处理,要做多个 buffer 嘛?不太会,有范例吗

每组数据加个识别数据头,尾 进行判断是神马类型的数据,然后根据这些类型的数据再进行处理就完事了

比如,你规定第一个或者第二个字节为数据 xx, 。。。。
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2023-12-3 18:53:53 | 显示全部楼层
rog 发表于 2023-3-3 13:44
地址拷贝的话,数据buffer怎们处理,要做多个 buffer 嘛?不太会,有范例吗

数据buffer应该就是动态申请的1k内存;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 14:35 , Processed in 0.292635 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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