硬汉嵌入式论坛

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

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

[复制链接]

19

主题

62

回帖

119

积分

初级会员

积分
119
发表于 2022-4-25 23:24:35 | 显示全部楼层 |阅读模式
因为移植OPENAMP的需求,将操作系统从RTX5切换到FreeRTOS,发现虽然用了CMSIS_RTOS_V2封装,但是无法给任务直接指定堆栈(指定后都无法进入任务),是我用法不对还是其他问题?

[C] 纯文本查看 复制代码
int main(void)
{
....
osKernelInitialize(); // 内核初始化 
TaskIdleId = osThreadNew(TaskIdle, NULL, &TaskIdle_Attr); // 创建空闲任务	
osKernelStart(); // 启动内核
....

}
//任务堆栈
uint64_t taskLv1Stk[LV1_STK_SIZE];
uint64_t taskLv2Stk[LV2_STK_SIZE];
uint64_t taskLv3Stk[LV3_STK_SIZE];
uint64_t taskIdleStk[IDLE_STK_SIZE];
//任务属性
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);		
    }
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106614
QQ
发表于 2022-4-26 00:27:48 | 显示全部楼层
1、不用切,RTX5标配的CMSIS-RTOS V2封装层。
2、你楼主位的代码,由于你注释掉了
//    .stack_mem = taskLv1Stk,
//    .stack_size = sizeof(taskLv1Stk),

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

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-4-26 08:43:51 | 显示全部楼层
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106614
QQ
发表于 2022-4-26 09:20:55 | 显示全部楼层
mojinpan 发表于 2022-4-26 08:43
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

...

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

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2022-4-27 10:54:04 | 显示全部楼层
mojinpan 发表于 2022-4-26 08:43
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

...

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

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-4-28 17:58:17 | 显示全部楼层
caicaptain2 发表于 2022-4-27 10:54
动态堆栈,静态堆栈的切换,最好用ide重新生成一遍。 涉及到一些宏定义,自己改代码不好找。

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

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-4-30 23:04:02 | 显示全部楼层
mojinpan 发表于 2022-4-26 08:43
我开始是尝试静态分配的,但是任务跑不起来,查了很久,才发现是堆栈问题,注释掉后改成静态堆栈,就跑起来了

...

请问: 动态堆栈和静态堆栈 ,分别怎么设置的?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 12:12 , Processed in 0.304565 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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