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);
- }
|