最近有小伙伴问了这样一个问题:我有个任务中的代码量很多,是不是这个任务的堆栈需要分配很大才行?
下面就围绕任务代码量,以及堆栈进行描述相关内容。
1任务堆栈分配
市面上很多RTOS的任务都是需要提前分配堆栈大小,也就是在创建任务的时候分配好堆栈的大小。 比如创建一个检测(Check)任务:
// 任务优先级#define TASK_CHECK_PRIO 6 // 任务堆栈大小#define TASK_CHECK_STK_SIZE 128 // 堆栈OS_STK TaskCheckStk[TASK_CHECK_STK_SIZE]; // 创建任务 - 信号检测OSTaskCreateExt((void (*)(void *)) AppTaskCheck, (void *) 0, (OS_STK *)&TaskCheckStk[TASK_CHECK_STK_SIZE-1],
(INT8U ) TASK_CHECK_PRIO, (INT16U ) TASK_CHECK_PRIO, (OS_STK *)&TaskCheckStk[0], (INT32U ) TASK_CHECK_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); // 任务应用实现void AppTaskCheck(void *p_arg){ // 代码··· (void)p_arg; for(;;) { // 代码··· }} FreeRRTOS创建一个任务类似,也是在创建时分配堆栈大小:
#define TASK_CHECK_PRIO 6#define TASK_CHECK_STK_SIZE 128 BaseType_t xReturn; xReturn = xTaskCreate(AppTaskCheck, “AppTaskCheck”, TASK_CHECK_STK_SIZE, NULL, TASK_CHECK_PRIO, NULL); 除了堆栈,其实还有像消息队列、消息邮箱等也是需要提前分配堆栈。 比如创建CLI消息队列:
#define CLI_QUEUE_NUM 256 //CLI接收队列数#define CLI_PACKAGE_LEN 2 //CLI