提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
动态创建比较简单,可以参考我上一篇的历程。在freertos_demo.c文件里
移植C8T6
提示:以下是本篇文章正文内容,下面案例可供参考
一、前期准备
1.打开宏定义
configSUPPORT_STATIC_ALLOCATION 这个宏定义默认关闭,现在打开置为1
现在进行编译会发现有两个报错
双击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
更改为101024后运行正常
完结撒花