请教下,大神最近移植 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 不支持这样使用吗 ?
}
}
你这种的定义是不是没有8字节对齐
AppTaskStartStk = (void *)mymalloc(SRAM2, APP_CFG_TASK_START_STK_SIZE * sizeof(uint32_t)); eric2013 发表于 2023-8-29 13:16
你这种的定义是不是没有8字节对齐
AppTaskStartStk = (void *)mymalloc(SRAM2, APP_CFG_TASK_START_STK ...
之前在 freertos 上使用这种方式貌似是没有问题的
内存申请是 #define ULONG unsigned long 对齐的,这个应该是 8 字节对齐的吧 ?
hpdell 发表于 2023-8-29 15:38
之前在 freertos 上使用这种方式貌似是没有问题的
可以单步调试进去看看从那个地方反馈的错误,方便修改。 eric2013 发表于 2023-8-29 15:51
可以单步调试进去看看从那个地方反馈的错误,方便修改。
仿真不方便啊,我把 申请到的内存地址打印出地址看看是不是 8 字节对齐的地址 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;
eric2013 发表于 2023-8-30 11:18
可以这样测试,直接把这两个改成静态数组看看是否正常,如果正常,那就是分配的问题造成的。
vTaskSta ...
我改用数组的形式时, 任务创建成功,而且运行正常,
当又重新改用 内存管理的方式就又不行了哟,难道是内存管理方式分配的地址不符合 rtx5的要求 ?
但是内存申请分配的地址 我看了 却实是 8 字节对齐的,现在又有些迷糊了啊 。
还是说 这个 rtx5 任务堆栈不支持 指针的形式 ?
hpdell 发表于 2023-8-30 12:08
我改用数组的形式时, 任务创建成功,而且运行正常,
当又重新改用 内存管理的方式就又不行了哟,难道 ...
RTOS支持动态分配是基本功能。
可以使用mdk的RTE自动生成一个项目进行对比。 或者RTE中应该可以找到示例项目。 caicaptain2 发表于 2023-9-1 16:46
RTOS支持动态分配是基本功能。
可以使用mdk的RTE自动生成一个项目进行对比。 或者RTE中应该可以找到示 ...
目前还没有找到 rtx5 使用指针的形式 + 内存申请的方法 例程啊,
其他的 os 系统 任务堆栈我使用内存申请的方法都是没有问题的,就唯独这个 rtx5 不行 啊
页:
[1]