前言
为了对FreeRTOS有一个深入的了解,参照野火的《FreeRTOS内核实现与应用开发实战指南》一书实现一个精简版的内核,之前用的比较多的单片机是STM32,所以和芯片内核架构相关的以cortex-M4F来实现,前期的所有验证在keil5上实现,最后才在STM32F4上进行验证。学习FreeRTOS内核并跟着教程写一遍代码,能够深入的理解RTOS的原理,同时能够学习C语言的高级编程方法和思想,对软件编程能力也有很大的帮助,也算是对C语言的一个进阶学习。先对FreeRTOS的编程风格有一定了解,并建立Keil工程,下一篇文章再真正进入FreeRTOS的实现。
一、FreeRTOS的编程风格
1.数据类型
为了适配不同的处理器,FreeRTOS对C语言中的基本数据类型进行了重定义,且不使用int型(个人猜测是在不同位宽处理器上int型所占位宽可能会不同的原因),使用short型和long型。数据类型重定义的具体实现如下(在portmacro.h头文件中):
#define portCHAR char
#define portFLOAT float
#define portDOUBLE double
#define portLONG long
#define portSHOrt short
#define portSTACK_TYPE uint32_t
#define portBASE_TYPE long
typedef portSTACK_TYPE StackType_t;
typedef long BaseType_t;
typedef unsigned long UBaseType_t;
#if(configUSE_16_BIT_TICKS == 1)
typedef uint16_t TickType_t;
#define portMAX_DELAY (TickType_t)0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY (TickType_t)0xffffffffUL
#endif
基本数据类型BaseType_t用long来实现,configUSE_16_BIT_TICKS 是在FreeRTOSConfig中的宏定义,定义是否使用16位位宽,这里默认是设置为0。
2.变量名
在FreeRTOS中,定义变量是会把变量的类型当作前缀加到变量上,这样做的好处是看到变量名就能知道该变量的类型。不同的数据类型的前缀如下:
数据类型 | 前缀 |
---|
char | c | short | s | long | l | portBASE_TYPE、数据结构、任务句柄、队列句柄等 | x | 无符号类型 | u | 指针 | p | void | v |
3.函数名
函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有函数,则会在加一个prv(private)前缀,具体举例如下:
- vTaskPrioritySet()函数的返回值是void,在Task.c中定义,功能是设置优先级。
- xQueueReceive()函数的返回值是portBASE_TYPE类型,在queue.c中定义,功能是从一个队列中接收消息(并把接收的消息从队列中删除)。
- vSemaphoreCreateBinary()函数的返回值是void类型,在semphr.h中定义,功能是创建二至信号量。
4.宏
宏均有大写字母构成,比配有小写字母的前缀,前缀用于表示该宏在哪个头文件中定义,举例如下:
前缀 | 宏定义所在的头文件 |
---|
port,如portMAX_DELAY | portable.h | task,如taskENTRY_CRITICAL() | task.h | pd,如pdTRUE | projdefs.h | config,如configUSE_PREEMPTION | FreeRTOSConfig.h | err,如errQUEUE_FULL | projdefs.h |
二、建立FreeRTOS工程
1.新建文件夹
(1)Doc:用于存放对整个工程文件的说明文件 (2)Project:存放新建的工程文件 (3)freertos:
- Demo:存放板级支持包
- License:存放FreeRTOS组件
- Source:内核源码
- include:存放头文件
- portable:
- RVDS:
- ARM_CM3:M3内核的接口文件
- ARM_CM4:M4内核的接口文件
- ARM_CM7:M7内核的接口文件
(4)User:存放用户程序代码
2.建立Keil工程
(1)由于后面使用STM32F4进行验证,在Select Device for Target处选择"ARM Cortex M4 —> ARMCM4F"。 (2)在Manage Run-Time Enviroment界面点击CMSIS,勾选CORE;点击Device,勾选Startup。
其他按照常规设置即可。
3.新建文件组
并在user中添加main.c文件,编写最基本的main.c文件,此时编译不再会报错。
4.调试设置
- 设置软件仿真:Project —> Options for Target —> Debug —> 勾选"Use Simulator"
- 修改时钟:Project —> Options for Target —> Target —> 修改时钟为25MHz(因为在sytem_ARMCM4.c中定义的时钟频率为25MHz)。
- 添加头文件路径:Project —> Options for Target —> C/C++ —> Include Paths —> 选择"include"文件夹。
至此,前期的准备工作完成,接下里就可以进入FreeRTOS的实现了。
|