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决定。

 

posted on 2022-05-16 22:32  者旨於陽  阅读(106)  评论(0编辑  收藏  举报

导航