FreeRTOS学习记录(2)——静态创建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

动态创建比较简单,可以参考我上一篇的历程。在freertos_demo.c文件里

移植C8T6

提示:以下是本篇文章正文内容,下面案例可供参考

一、前期准备

1.打开宏定义

configSUPPORT_STATIC_ALLOCATION 这个宏定义默认关闭,现在打开置为1
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
现在进行编译会发现有两个报错
双击vTaskStartScheduler
在这里插入图片描述
右键追踪过去,这个函数FreRTOS已经定义过了,只需要我们写一个就行
在这里插入图片描述
重新双击vTaskStartScheduler右键追踪,向下滑动
在这里插入图片描述
可以看见这个函数。这是说明创建任务后默认会使用定时器
而回到FreeRTOSConfig.h文件,查找软件定时器
我们可以看见软件定时器这里是1,所以我们需要写一个软件定时器函数
在这里插入图片描述
右键xTimerCreateTimerTask追踪,这就是我们需要重新写的函数

在这里插入图片描述

2.写两个接口函数

vApplicationGetIdleTaskMemory
获得空闲任务堆栈和地址
vApplicationGetTimerTaskMemory
获得定时器堆栈和地址

//空闲任务堆栈数组
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
//定时器堆栈数组
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];

//空闲任务控制块
static StaticTask_t Idle_Task_TCB;	
//定时器任务控制块
static StaticTask_t Timer_Task_TCB;
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&Idle_Task_TCB;//控制块内存
	*ppxIdleTaskStackBuffer=Idle_Task_Stack;//堆栈数组
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;//堆栈内存
}
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&Timer_Task_TCB;
	*ppxTimerTaskStackBuffer=Timer_Task_Stack;
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}

3.定义任务参数

//开始任务优先级
#define START_TASK_PRIO		1
//内存大小
#define START_STK_SIZE 		128
//任务句柄  
TaskHandle_t StartTask_Handler;
//堆栈数组
StackType_t StartTaskStack[START_STK_SIZE];
//控制块
StaticTask_t StartTaskTCB;

//开始任务优先级
#define task1_PRIO		2
//内存大小
#define task1_STK_SIZE 		50
//任务句柄  
TaskHandle_t task1_Handler;
//堆栈数组
StackType_t task1_stack[task1_STK_SIZE];
//控制块
StaticTask_t task1_tcb;

//开始任务优先级
#define task1_PRIO		3
//内存大小
#define task1_STK_SIZE 		50
//任务句柄  
TaskHandle_t task2_Handler;
//堆栈数组
StackType_t task2_stack[task2_STK_SIZE];
//控制块
StaticTask_t task2_tcb;

二、创建任务

代码如下(示例):

void task2_void(void *pvParameters);
void task1_void(void *pvParameters);
//void start_task(void *pvParameters);//我在.h文件定义了,这里就注释掉了
/*
xTaskCreateStatic是静态创建任务的函数
他会返回该任务的句柄,所欲需要提前定义函数句柄
*/
//开始任务
void freertos_begin(void)
{
	StartTask_Handler=xTaskCreateStatic((TaskFunction_t	)start_task,//任务函数
										(const char* 	)"start_task",	//任务名字
										(uint32_t 		)START_STK_SIZE,//堆栈内存大小
										(void* 		  	)NULL,				
										(UBaseType_t 	)START_TASK_PRIO, //优先级
										(StackType_t*   )StartTaskStack,//堆栈数组
										(StaticTask_t*  )&StartTaskTCB);//任务控制模块	  
		vTaskStartScheduler(); 
}
//下面的函数按照上面的格式进行书写就好
void start_task(void *pvParameters)
{ 
	taskENTER_CRITICAL();
	     task1_Handler=xTaskCreateStatic((TaskFunction_t	)task1_void,		
										(const char* 	)"task1_void",		
										(uint32_t 		)task1_STK_SIZE,	
										(void* 		  	)NULL,				
										(UBaseType_t 	)task1_PRIO, 	
										(StackType_t*   )task1_stack,	
										(StaticTask_t*  )&task1_tcb);
     task1_Handler=xTaskCreateStatic((TaskFunction_t	)task2_void,		
										(const char* 	)"task2_void",		
										(uint32_t 		)task2_STK_SIZE,	
										(void* 		  	)NULL,				
										(UBaseType_t 	)task2_PRIO, 	
										(StackType_t*   )task2_stack,	
										(StaticTask_t*  )&task2_tcb);
    vTaskDelete(NULL);
		taskEXIT_CRITICAL();    
} 
void task1_void(void *pvParameters)
{
    while(1)
    {
			OLED_ShowString(1,1,"1");
			vTaskDelay(500);
    }
}
void task2_void(void *pvParameters)
{
	    while(1)
    {
			OLED_ShowString(2,1,"2");
			vTaskDelay(500);
    }
}

来看看我的.h文件
代码如下(示例):

#ifndef _FREERTOS_DEMO_H
#define _FREERTOS_DEMO_H
#include "system.h"
#include "SysTick.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "Delay.h"
#include "OLED.h"
void start_task(void *pvParameters);
void freertos_begin(void);


#endif



编译上传后会看见OLED同时显示1和2


一个报错的原因

网上很多历程的默认开发板内存都比C8T6大,所以定义的堆栈内存都大
所以编译没问题,上传就不显示
所以我们应当更改第三行选项
也就是 configTOTAL_HEAP_SIZE 的大小
我这里是更改过的,原来是361024
更改为10
1024后运行正常

在这里插入图片描述

完结撒花

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值