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这个宏
在这里插入图片描述

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里面就好了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wiyoo0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值