相对于动态任务,静态任务不需要动态分配内存,而是手动指定一个静态内存缓冲区,并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题,提高了系统的稳定性。
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer );
//调用方式
StackType_t xTask3Stack[10];
StaticTask_t xTask3STCB;
xTaskCreateStatic(Task3Function,"Task3",100,NULL,1,xTask3Stack,&xTask3STCB);
参数说明:
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
xTaskCreate(Task1Function,"Task1",100,NULL,1,NULL);
参数说明:
这里我创建3个任务,2个使用动态分配,一个静态分配,
void Task1Function(void * param)
{
while (1)
{
/* code */
printf("1");
}
}
void Task2Function(void * param)
{
while (1)
{
/* code */
printf("2");
}
}
void Task3Function(void * param)
{
while (1)
{
/* code */
printf("3");
}
}
//创建任务
xTaskCreate(Task1Function,"Task1",100,NULL,1,NULL);
xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
StackType_t xTask3Stack[100];
StaticTask_t xTask3STCB;
xTaskCreateStatic(Task3Function,"Task3",100,NULL,1,xTask3Stack,&xTask3STCB);
1、需要创建静态任务需打开configSUPPORT_STATIC_ALLOCATION这个宏
2、编译时会报错说缺少vApplicationGetIdleTaskMemory()函数,是需要我们自主实现的。
vApplicationGetIdleTaskMemory是FreeRTOS操作系统中的一个函数,用于获取空闲任务(Idle task)的堆栈和控制块(TCB)的内存大小。 空闲任务是在系统中没有其他任务要执行时运行的任务,它不执行任何有用的操作,只是等待其他任务需要CPU。
实现代码
/* 创建任务静态分配 */
StackType_t xIdeaTaskStack[100];
StaticTask_t xIdeaTaskTCB;
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{
/* 如果输入指针非空,则返回指向上述静态内存的指针。 */
if (ppxIdleTaskTCBBuffer)
{
*ppxIdleTaskTCBBuffer = &xIdeaTaskTCB;
}
if (ppxIdleTaskStackBuffer)
{
*ppxIdleTaskStackBuffer = &xIdeaTaskStack[0];
}
if (pulIdleTaskStackSize)
{
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
}
CPU:STM32F103VB
MDK5软件模拟提示没有读写权限,只能一步一步运行。提示代码如下:
error 65: access violation at 0x01000004 : no 'read' permission