FreeRTOS创建静态任务教程及所遇到的问题解决方法

静态任务和动态任务的区别

相对于动态任务,静态任务不需要动态分配内存,而是手动指定一个静态内存缓冲区,并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题,提高了系统的稳定性。

静态任务

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这个宏
FreeRTOS创建静态任务教程及所遇到的问题解决方法_第1张图片

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、编译程序在线仿真。
FreeRTOS创建静态任务教程及所遇到的问题解决方法_第2张图片
FreeRTOS创建静态任务教程及所遇到的问题解决方法_第3张图片
成功打印出321啦。

遇到*** error 65: access violation at 0x01000004 : no ‘read’ permission解决方法

CPU:STM32F103VB
MDK5软件模拟提示没有读写权限,只能一步一步运行。提示代码如下:

error 65: access violation at 0x01000004 : no 'read' permission

解决方法

更改下面参数
FreeRTOS创建静态任务教程及所遇到的问题解决方法_第4张图片
对照这你对应的芯片参数修改
FreeRTOS创建静态任务教程及所遇到的问题解决方法_第5张图片
FreeRTOS创建静态任务教程及所遇到的问题解决方法_第6张图片
将红框的内容对应的写入target的debug里面就好了

你可能感兴趣的:(stm32,FreeRTOS,arm,嵌入式硬件,单片机,stm32)