静态任务的创建
在freertos中,静态任务通过如下两个函数进行创建
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer )
与
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer = pxIdleTaskTCB;
*ppxIdleTaskStackBuffer = pxIdleTaskStack;
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
与动态创建相区别,静态创建需要:
单独的对栈的大小进行分配,再对任务名做标识
再单独的对静态内存区域进行申请,为该任务独立的创建一块区域,方便索引
静态任务的删除
TaskHandle_t xTaskCreateStatic(...)
该句返回一个特定的句柄,不像动态创建时可以规定一个句柄;因此需要删除该特定的句柄对静态创建的任务进行删除
任务栈的溢出
void task1func( void *pvParameters )
{
volatile char a[500];
int i;
while(1)
{
printf("1");
for(i = 0;i<500;i++){
a[i] = 0;
}
}
}
/**...**/
xTaskCreate(task1func, "Task1", 100, NULL, 1, NULL );
由于volatile类型的数据阻止了编译器的自动优化,创建了需要500个字节的空间;而在创建任务时,只创建了栈深为100的空间(一单位栈深使用4字节的空间)。由于栈由高地址向下生长,栈满溢出:
将会被编译器自动定位到硬件错误