hpdell 发表于 2023-8-29 09:38:52

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

请教下,大神最近移植 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,
        .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;


staticosThreadAttr_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 不支持这样使用吗 ?
                }



}









eric2013 发表于 2023-8-29 13:16:52

你这种的定义是不是没有8字节对齐
AppTaskStartStk   = (void *)mymalloc(SRAM2, APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t));

hpdell 发表于 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 字节对齐的吧 ?

eric2013 发表于 2023-8-29 15:51:42

hpdell 发表于 2023-8-29 15:38
之前在 freertos 上使用这种方式貌似是没有问题的




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

hpdell 发表于 2023-8-29 16:43:11

eric2013 发表于 2023-8-29 15:51
可以单步调试进去看看从那个地方反馈的错误,方便修改。
仿真不方便啊,我把 申请到的内存地址打印出地址看看是不是 8 字节对齐的地址

eric2013 发表于 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;

hpdell 发表于 2023-8-30 12:08:40

eric2013 发表于 2023-8-30 11:18
可以这样测试,直接把这两个改成静态数组看看是否正常,如果正常,那就是分配的问题造成的。

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

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

caicaptain2 发表于 2023-9-1 16:46:37

hpdell 发表于 2023-8-30 12:08
我改用数组的形式时, 任务创建成功,而且运行正常,

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

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

hpdell 发表于 2023-9-2 13:54:19

caicaptain2 发表于 2023-9-1 16:46
RTOS支持动态分配是基本功能。
可以使用mdk的RTE自动生成一个项目进行对比。 或者RTE中应该可以找到示 ...

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

其他的 os 系统 任务堆栈我使用内存申请的方法都是没有问题的,就唯独这个 rtx5 不行 啊
页: [1]
查看完整版本: 请教下,大神最近移植 rtx5 ,任务堆栈使用数组定义的形式工作正常,使用内存管理申请的方式则不行 ?