硬汉嵌入式论坛

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

[RL-RTX] 请教下,大神最近移植 rtx5 ,任务堆栈使用数组定义的形式工作正常,使用内存管理申请的方式则不行 ?

[复制链接]

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
发表于 2023-8-29 09:38:52 | 显示全部楼层 |阅读模式
请教下,大神最近移植 rtx5 ,任务堆栈使用数组定义的形式工作正常,使用内存管理申请的方式则不行 ?


这是为何呀 ??


a. 任务堆栈使用数组形式定义:
   这样形式定义工作完全正常 ok

__ALIGN_8BYTES( os_thread_t   AppTaskStartTCB);
__ALIGN_8BYTES( uint64_t       AppTaskStartStk[(APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t))/8]);



static const osThreadAttr_t vTaskStart_Attr = {
        .name       = "vTaskStart",
        .attr_bits  = osThreadDetached,
        .priority   = (osPriority_t)APP_CFG_TASK_START_PRIO,
        .stack_size = APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t),
        .stack_mem  = (void *)&AppTaskStartStk[0],
        .cb_mem     = &AppTaskStartTCB,
        .cb_size    = sizeof(os_thread_t),
};



                xHandleTask_Start = osThreadNew(vTaskStart, NULL, &vTaskStart_Attr);
                if(xHandleTask_Start != 0) {
                        __log("vTaskStart creat ok ...\r\n");
                }
                else {
                        __log("vTaskStart creat err ...?\r\n");
                }


b. 任务堆栈使用内存管理进行申请方式

os_thread_t   *AppTaskStartTCB = 0;
uint64_t       *AppTaskStartStk = 0;


static  osThreadAttr_t vTaskStart_Attr ;

int main(void)
{
    ....

          AppTaskStartTCB   = (os_thread_t *)mymalloc(SRAM2, sizeof(os_thread_t));
        if(AppTaskStartTCB == NULL)
        {
                My_Printf("AppTaskStartTCB fail ...\r\n");
                while(1) {}
        }
        AppTaskStartStk   = (void *)mymalloc(SRAM2, APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t));
        if(AppTaskStartStk == NULL)
        {
                My_Printf("AppTaskStartStk fail ...\r\n");
                while(1) {}
        }


        vTaskStart_Attr .name       = "vTaskStart";
        vTaskStart_Attr .attr_bits  = osThreadDetached;
        vTaskStart_Attr .priority   = (osPriority_t)APP_CFG_TASK_START_PRIO;
        vTaskStart_Attr .stack_size = APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t);
        vTaskStart_Attr .stack_mem  = (void *)AppTaskStartStk;
        vTaskStart_Attr .cb_mem     = AppTaskStartTCB,;
        vTaskStart_Attr .cb_size    = sizeof(os_thread_t);



                xHandleTask_Start = osThreadNew(vTaskStart, NULL, &vTaskStart_Attr);
                if(xHandleTask_Start != 0) {
                        __log("vTaskStart creat ok ...\r\n");
                }
                else {
                        __log("vTaskStart creat err ...?\r\n");   // 这里就会产生错误 了 哟 ,... ?  难道是 rtx5 不支持这样使用吗 ?
                }



}









回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-8-29 13:16:52 | 显示全部楼层
你这种的定义是不是没有8字节对齐
AppTaskStartStk   = (void *)mymalloc(SRAM2, APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t));
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2023-8-29 15:38:43 | 显示全部楼层
eric2013 发表于 2023-8-29 13:16
你这种的定义是不是没有8字节对齐
AppTaskStartStk   = (void *)mymalloc(SRAM2, APP_CFG_TASK_START_STK ...


之前在 freertos 上使用这种方式貌似是没有问题的


内存申请是 #define ULONG             unsigned long      对齐的,这个应该是 8 字节对齐的吧 ?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-8-29 15:51:42 | 显示全部楼层
hpdell 发表于 2023-8-29 15:38
之前在 freertos 上使用这种方式貌似是没有问题的

可以单步调试进去看看从那个地方反馈的错误,方便修改。
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2023-8-29 16:43:11 | 显示全部楼层
eric2013 发表于 2023-8-29 15:51
可以单步调试进去看看从那个地方反馈的错误,方便修改。

仿真不方便啊,我把 申请到的内存地址打印出地址看看是不是 8 字节对齐的地址
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-8-30 11:18:49 | 显示全部楼层
hpdell 发表于 2023-8-29 16:43
仿真不方便啊,我把 申请到的内存地址打印出地址看看是不是 8 字节对齐的地址

可以这样测试,直接把这两个改成静态数组看看是否正常,如果正常,那就是分配的问题造成的。

vTaskStart_Attr .stack_size = APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t);
        vTaskStart_Attr .stack_mem  = (void *)AppTaskStartStk;
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2023-8-30 12:08:40 | 显示全部楼层
eric2013 发表于 2023-8-30 11:18
可以这样测试,直接把这两个改成静态数组看看是否正常,如果正常,那就是分配的问题造成的。

vTaskSta ...

我改用数组的形式时, 任务创建成功,而且运行正常,

当又重新改用 内存管理的方式就又不行了哟,难道是内存管理方式分配的地址不符合 rtx5  的要求 ?
但是内存申请分配的地址 我看了 却实是 8 字节对齐的,现在又有些迷糊了啊 。
还是说 这个 rtx5 任务堆栈不支持 指针的形式 ?
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-9-1 16:46:37 | 显示全部楼层
hpdell 发表于 2023-8-30 12:08
我改用数组的形式时, 任务创建成功,而且运行正常,

当又重新改用 内存管理的方式就又不行了哟,难道 ...

RTOS支持动态分配是基本功能。
可以使用mdk的RTE自动生成一个项目进行对比。 或者RTE中应该可以找到示例项目。
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2023-9-2 13:54:19 | 显示全部楼层
caicaptain2 发表于 2023-9-1 16:46
RTOS支持动态分配是基本功能。
可以使用mdk的RTE自动生成一个项目进行对比。 或者RTE中应该可以找到示 ...

目前还没有找到 rtx5 使用指针的形式 + 内存申请的方法 例程啊,

其他的 os 系统 任务堆栈我使用内存申请的方法都是没有问题的,就唯独这个 rtx5 不行 啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 01:54 , Processed in 0.251993 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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