RTOS任务堆栈分配
市面上很多RTOS的任务都是需要提前分配堆栈大小,也就是在创建任务的时候分配好堆栈的大小。
比如uCOS创建一个检测(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);
除了堆栈,其实还有像消息队列、消息邮箱等也是需要提前分配堆栈。
比如FreeRTOS创建CLI消息队列:
#define CLI_QUEUE_NUM 256 //CLI接收队列数
#define CLI_PACKAGE_LEN 2 //CLI数据包长度
QueueHandle_t xCLIRcvQueue = NULL;
/* 创建队列 */
if(xCLIRcvQueue == NULL)
{
xCLIRcvQueue = xQueueCreate(CLI_QUEUE_NUM, CLI_PACKAGE_LEN);
}
|