mojinpan 发表于 2022-4-25 23:24:35

基于CMSIS_RTOS_V2封装的FreeRTOS任务堆栈分配问题

因为移植OPENAMP的需求,将操作系统从RTX5切换到FreeRTOS,发现虽然用了CMSIS_RTOS_V2封装,但是无法给任务直接指定堆栈(指定后都无法进入任务),是我用法不对还是其他问题?


int main(void)
{
....
osKernelInitialize(); // 内核初始化
TaskIdleId = osThreadNew(TaskIdle, NULL, &TaskIdle_Attr); // 创建空闲任务       
osKernelStart(); // 启动内核
....

}
//任务堆栈
uint64_t taskLv1Stk;
uint64_t taskLv2Stk;
uint64_t taskLv3Stk;
uint64_t taskIdleStk;
//任务属性
const osThreadAttr_t TaskLv1_Attr = {
        .name = "TaskLv1",
        .attr_bits = osThreadDetached,
//    .stack_mem = taskLv1Stk,
//    .stack_size = sizeof(taskLv1Stk),
          .stack_size = 128 * 4,
        .priority = osPriorityNormal3,
};
const osThreadAttr_t TaskLv2_Attr = {
        .name = "TaskLv2",
        .attr_bits = osThreadDetached,
//    .stack_mem = taskLv2Stk,
//    .stack_size = sizeof(taskLv2Stk),
          .stack_size = 128 * 4,
        .priority = osPriorityNormal2,
};
const osThreadAttr_t TaskLv3_Attr = {
        .name = "TaskLv3",
        .attr_bits = osThreadDetached,
//    .stack_mem = taskLv3Stk,
//    .stack_size = sizeof(taskLv3Stk),
          .stack_size = 128 * 4,
        .priority = osPriorityNormal1,
};
const osThreadAttr_t TaskIdle_Attr = {       
        .name = "TaskIdle",
        .attr_bits = osThreadDetached,
//    .stack_mem = taskIdleStk,
//    .stack_size = sizeof(taskIdleStk),
.stack_size = 128 * 4,
//        .priority = osPriorityIdle,
        .priority = osPriorityIdle,
};
//任务id
osThreadId_t TaskLv1Id = NULL;
osThreadId_t TaskLv2Id = NULL;
osThreadId_t TaskLv3Id = NULL;
osThreadId_t TaskIdleId = NULL;

/*******************************************************************************
* @brief 进程LV1 1ms执行一次
*******************************************************************************/
void TaskLv1(void *arg)
{

    while(1)
    {
                osDelay(1);
    }
}
/*******************************************************************************
* @brief 进程LV2 10ms执行一次
*******************************************************************************/
void TaskLv2(void *arg)
{
    while(1)
    {

      osDelay(10);
    }
}
/*******************************************************************************
* @brief 进程LV3 1000ms执行一次
*******************************************************************************/
void TaskLv3(void *arg)
{
    while(1)
    {
                GPIO_Toggle(LED_RED);
                GPIO_Toggle(LED_BLUE);
      osDelay(1000);
    }
}
/*******************************************************************************
* @brief    空闲任务
*******************************************************************************/
void TaskIdle(void *arg)
{

        //创建任务
    TaskLv1Id = osThreadNew(TaskLv1, NULL, &TaskLv1_Attr);
    TaskLv2Id = osThreadNew(TaskLv2, NULL, &TaskLv2_Attr);
    TaskLv3Id = osThreadNew(TaskLv3, NULL, &TaskLv3_Attr);
        HAL_ResumeTick();
        while(1)
    {       
                shellTask(&SysShell);               
    }
}


eric2013 发表于 2022-4-26 00:27:48

1、不用切,RTX5标配的CMSIS-RTOS V2封装层。
2、你楼主位的代码,由于你注释掉了
//    .stack_mem = taskLv1Stk,
//    .stack_size = sizeof(taskLv1Stk),

那么你这里是用的全局动态内存分配的。

mojinpan 发表于 2022-4-26 08:43:51

我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

从这个 也可以看出来,FreeRTOS带CMSIS-RTOS V2封装后的并不能无脑用,和RTX5还是有差距的

eric2013 发表于 2022-4-26 09:20:55

mojinpan 发表于 2022-4-26 08:43
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

...

仅你楼主位的这种代码,不管是FreeRTOS还是RTX5都是可以随意配置的。

caicaptain2 发表于 2022-4-27 10:54:04

mojinpan 发表于 2022-4-26 08:43
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

...

动态堆栈,静态堆栈的切换,最好用ide重新生成一遍。 涉及到一些宏定义,自己改代码不好找。

mojinpan 发表于 2022-4-28 17:58:17

caicaptain2 发表于 2022-4-27 10:54
动态堆栈,静态堆栈的切换,最好用ide重新生成一遍。 涉及到一些宏定义,自己改代码不好找。

我直接去掉了CMSIS_RTOS_V2封装,还是直接用方便省事点

中尴人 发表于 2022-4-30 23:04:02

mojinpan 发表于 2022-4-26 08:43
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

...

请问: 动态堆栈和静态堆栈 ,分别怎么设置的?
页: [1]
查看完整版本: 基于CMSIS_RTOS_V2封装的FreeRTOS任务堆栈分配问题