FreeRTOS手札
概念
名词 | 解释 |
FreeRTOS Port | 每一种编译器+处理器的组合称为一个FreeRTOS port |
目录结构
目录/文件 | 公共/私有 | 必要性 | 描述 |
FreeRTOSConfig.h | 私有 | 必须 | 单板配置文件文件 |
Source/include | 公共 | 必须 | 一个源文件要使用FreeRTOS的API接口,必须包含FreeRTOS.h头文件,其次包含其他函数声明头文件,如task.h、queue.h、semphr.h、timers.h、event_groups.h等 |
Source/tasks.c | 内核 | 必须 | 任务相关 |
Source/list.c | 必须 | 链表相关 | |
Source/queue.c | 需要 | 队列queue和信号量semaphore相关 | |
Source/timers.c | 可选 | 提供软件定时器功能 | |
Source/event_groups.c | 可选 | 提供event group功能 | |
Source/croutine.c | 可选 | 协程(co-routine)相关,很少被使用,通常是在很小的微控制器上 | |
Source/stream_buffer.c | |||
Source/portable/<compiler>/<architecture> | 私有 | 必须 | 每种FreeRTOS port一个目录 |
Source/portable/MemMang | 公共 |
Heap Memory Mgmt configSUPPORT_DYNAMIC_ALLOCATION选项开启时启用F |
|
Demo | 示例程序,main()中一定要包含prvSetupHardware()和vTaskStartScheduler() |
创建FreeRTOS工程
修改demo工程
1、打开选中的Demo工程,测试是否编译无误;
2、删除demo tasks相关代码,Demo/Common目录下的任何文件均可删除;
3、删除main()函数调用的所有函数,除了prvSetupHardware()和vTaskStartScheduler();
4、检查工程是否依然编译无误;
新建工程
1、使用自定义的工具链创建一个工程,不包含任何FreeRTOS文件,确保可以编译通过;
2、添加下表中的FreeRTOS文件到工程:
文件 | 目录 |
task.c | FreeRTOS/Source |
queue.c | |
list.c | |
timers.c | |
event_groups.c | |
所有C和汇编文件 | FreeRTOS/Source/portable/<compiler>/<architecture> |
head_n.c |
FreeRTOS/Source/portable/MemMang n可以为1/2/3/4/5之一。 |
3、拷贝FreeRTOS port的demo工程的FreeRTOSConfig.h头文件到当前工程;
4、将以下路径添加到工程的头文件搜索路径:
FreeRTOS/Source/include FreeRTOS/Source/portable/<compiler>/<architecture> FreeRTOSConfig.h头文件所在目录
5、参考demo工程的编译配置;
6、参考demo工程安装需要的FreeRTOS interrupt handlers。
任务调度
FreeRTOS任务函数原型:
void ATaskFunction( void *pvParameters );
任务函数中不应该返回,如果需要结束任务,需要显式地删除任务。
void ATaskFunction( void *pvParameters ) { int32_t lVariableExample = 0; /* A task will normally be implemented as an infinite loop. */ for( ;; ) { /* The code to implement the task functionality will go here. */ } vTaskDelete( NULL ); }
FreeRTOSConfig.h定义了最大任务优先级,优先级范围0 ~ configMAX_PRIORITIES - 1,0为最低优先级。vTaskPrioritySet()配置任务优先级。
FreeRTOS任务创建函数原型为:
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask );
FreeRTOS scheduler负责任务调度,每个任务在分配的时间片内执行,在每个时间片结束之后,有一个时间周期是任务调度器执行,称为“tick interrupt”。这个时间长度由configTICK_RATE_HZ决定。