静态任务和动态任务的区别
相对于动态任务,静态任务不需要动态分配内存,而是手动指定一个静态内存缓冲区,并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题,提高了系统的稳定性。
静态任务
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);
参数说明:
- pxTaskCode: 任务函数指针,任务必须实现一个 (void *pvParameters) 原型。
- pcName: 任务名称(字符串)。
- ulStackDepth: 任务堆栈大小(字节)。
- pvParameters: 任务参数,指向会传递给任务函数的数据。
- uxPriority: 任务优先级,取值范围为 configMAX_PRIORITIES 以内的数值。
- puxStackBuffer: 任务堆栈缓冲区指针。
- pxTaskBuffer: 任务缓冲区指针。
动态任务
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);
参数说明:
- pxTaskCode - 任务的函数指针,指向任务代码的函数。
- pcName - 任务的名称,以便于调试和跟踪任务。
- usStackDepth - 任务的堆栈大小,以字节为单位。
- pvParameters - 传递给任务函数的参数。
- uxPriority - 任务的优先级。
- pxCreatedTask - 任务的句柄,用于后续引用该任务。
创建实验
这里我创建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;
}
}
3、编译程序在线仿真。
成功打印出321啦。
遇到*** error 65: access violation at 0x01000004 : no ‘read’ permission解决方法
CPU:STM32F103VB
MDK5软件模拟提示没有读写权限,只能一步一步运行。提示代码如下:
error 65: access violation at 0x01000004 : no 'read' permission
解决方法
更改下面参数
对照这你对应的芯片参数修改
将红框的内容对应的写入target的debug里面就好了