硬汉嵌入式论坛

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

[ThreadX全家桶] 关于threadx 的 内存申请疑惑

[复制链接]

10

主题

38

回帖

68

积分

初级会员

积分
68
发表于 2024-12-5 20:37:04 | 显示全部楼层 |阅读模式
如果我们在FreeRTOS下申请一段堆内存,可以用 char* ch = pvPortMalloc(1000), 释放用vPortFree(ch), 那么问题来了, 如果在Threadx下做同样的操作,应该怎么申请和释放呢?
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2024-12-5 22:44:53 | 显示全部楼层
先用tx_byte_pool_create()创建内存池;
用tx_byte_allocate()申请;
用tx_byte_release()释放。
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-12-9 11:40:24 | 显示全部楼层
借贴问个问题,因为我希望在 threadx 内核开启并正常运行后才进行大部分系统外设的初始化,有这样的内容。这样是不是会存在隐藏的 bug ?



创建初始化任务的内容
[C] 纯文本查看 复制代码
/* 内存池创建 */
    if(tx_byte_pool_create(&TxBytePool, "Tx App memory pool", TxBytePoolBuffer, TX_APP_MEM_POOL_SIZE) != TX_SUCCESS)
        HardErrorHandler(__FILE__, __LINE__);
    /* 尝试从内存池获得足够的内存区域 */
    if(tx_byte_allocate(&TxBytePool, (VOID **)&pointer, 1024, TX_NO_WAIT) != TX_SUCCESS)
        HardErrorHandler(__FILE__, __LINE__); // 初始化线程非常重要,未获得足够内存进入硬件错误

    if(tx_thread_create(&ThreadInit,      /*任务控制块地址*/
                        "Thread Init",    /*任务名*/
                        ThreadInitSys,    /*启动任务函数地址*/
                        0,                /*传递给任务的参数*/
                        pointer,          /*堆栈基地址*/
                        1024,             /*堆栈空间大小*/
                        0,                /*任务优先级*/
                        0,                /*任务抢占阈值*/
                        TX_NO_TIME_SLICE, /*不开启时间片*/
                        TX_AUTO_START)    /*创建后立即启动*/
       != TX_SUCCESS)
        HardErrorHandler(__FILE__, __LINE__);


然后初始化外设的任务是这样
[C] 纯文本查看 复制代码
static void ThreadInitSys(unsigned long thread_input)
{
    /* 一些外设和驱动初始化 */
   // ...... 比如串口初始化
    

    /* 释放内存区域 */
    if(tx_byte_release((VOID *)pointer) != TX_SUCCESS)
        HardErrorHandler(__FILE__, __LINE__);
}


我的释放内存是在任务还没有完成的时候进行的,一直是这么干,但是似乎没有问题。

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-12-10 08:21:00 | 显示全部楼层
yono 发表于 2024-12-9 11:40
借贴问个问题,因为我希望在 threadx 内核开启并正常运行后才进行大部分系统外设的初始化,有这样的内容。 ...

正确的姿势就是这样的,我们新作的例子全部采用这种思路了。可以方便排查OS本身的启动问题和底层驱动的初始化问题。都放在main函数里面排查不方便。
回复

使用道具 举报

10

主题

38

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2024-12-10 13:54:49 | 显示全部楼层
eric2013 发表于 2024-12-10 08:21
正确的姿势就是这样的,我们新作的例子全部采用这种思路了。可以方便排查OS本身的启动问题和底层驱动的初 ...

threadx要出新教程吗?
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-12-10 20:34:05 | 显示全部楼层
eric2013 发表于 2024-12-10 08:21
正确的姿势就是这样的,我们新作的例子全部采用这种思路了。可以方便排查OS本身的启动问题和底层驱动的初 ...

忘记在哪看到了,说是threadX推荐在内核启动后再初始化外设,好像是他们的邮件列表?
但是任务还没有完成就释放这个任务堆栈的内存真的没问题吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-12-11 09:18:42 | 显示全部楼层
yono 发表于 2024-12-10 20:34
忘记在哪看到了,说是threadX推荐在内核启动后再初始化外设,好像是他们的邮件列表?
但是任务还没有完 ...

细看了下,你的和我的还不一样。你的任务栈的动态分配释放,我们全部静态数组分配的。

然后main里面什么外设初始化都不做,仅仅是初始化HAL库和系统时钟并创建启动任务。

进入启动任务后,初始化各种外设并创建各种通信组件,并且这个启动任务不会被删除,继续作为一个启动任务使用。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-12-11 09:19:15 | 显示全部楼层
capw 发表于 2024-12-10 13:54
threadx要出新教程吗?

没有做新教程,我这里意思是我们后来出的例子。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 21:28 , Processed in 0.270506 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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