什么叫FreeRTOS
RTOS(Real Time Operating System)即为实时操作系统,Free 指的是免费的。 一开始遵从GPLv2 开源协议,2018年被亚马逊收购后,开源协议变为了MIT(与前者相比,为所欲为的开放)。
GPLv2开源协议
这里的开源指的是你可以免费或得FreeRTOS的源码,且当你的产品使用了FreeRTOS且没有修改FreeRTOS的源码的时候,你得产品的全部代码可以闭源。但是当你修改了FreeRTOS的源码时,就必须将修改的这部分开源,反馈给社区,其他的部分不用开源。著名的linux使用的就是GPL协议。
静态任务与动态任务
静态任务
1 需要预先定义好全局的静态的任务控制块空间, 和任务堆栈。
2 创建任务方式
// 创建 APPTaskCreate任务
xReturn = xTaskCreateStatic(
(TaskFunction_t)AppTaskCreate, // 任务函数1
(const char*)"AppTaskCreate", // 任务名称
(uint16_t) 512, // 任务堆栈大小
(void*) NULL, // 传递给任务函数的参数
(UBaseType_t) 1, // 任务优先级, 空闲任务的优先级最低
(StackType_t*)AppTaskCreate_Stack, // 任务堆栈
(StackType_t*)&AppTaskCreate_Handle); // 任务控制块指针
3 宏定义配置
//支持静态内存, 静态创建任务时必须为1
#define configSUPPORT_STATIC_ALLOCATION 1
4 需要自己创建空闲任务和定时器任务,同时还要自己实现两个函数
// 空闲任务任务堆栈
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; // 任务堆栈大小
}
动态任务
1 不需要自己定义任务控制块和任务堆栈,动态内存按需分配
2 创建任务方式
// 创建 APPTaskCreate任务
xReturn = xTaskCreate(
(TaskFunction_t)AppTaskCreate, // 任务函数1
(const char*)"AppTaskCreate", // 任务名称
(uint16_t) 512, // 任务堆栈大小
(void*) NULL, // 传递给任务函数的参数
(UBaseType_t) 1, // 任务优先级, 空闲任务的优先级最低
(TaskHandle_t*)&AppTaskCreate_Handle); // 任务控制块指针
3 宏定义配置(在FreeRTOSconfig.h中)
//支持动态内存申请
#define configSUPPORT_DYNAMIC_ALLOCATION 1
//支持静态内存, 静态创建任务时必须为1
#define configSUPPORT_STATIC_ALLOCATION 0
configSUPPORT_STATIC_ALLOCATION为1时编译会有报错
4 动态分配我们不需要管空闲任务和定时器任务,系统都会帮我们实现好