文章目录
-
-
- 一、实时操作系统
- 二、FreeRTOS
- 三、移植FreeRTOS的准备工作
-
- (一)、FreeRTOS源码文件作用介绍
-
- 1、include文件夹
-
- (1)、include/croutine.h
- (2)、include/deprecated_definitions.h
- (3)、include/event_groups.h
- (4)、include/FreeRTOS.h
- (5)、include/list.h
- (6)、include/message_buffer.h
- (7)、include/mpu_prototypes.h
- (8)、include/mpu_wrappers.h
- (9)、include/portable.h
- (10)、include/projdefs.h
- (11)、include/queue.h
- (12)、include/semphr.h
- (13)、include/stack_macros.h
- (14)、include/StackMacros.h
- (15)、include/stream_buffer.h
- (16)、include/task.h
- (17)、include/timers.h
- 2、portable文件夹
- 四、FreeRTOS的移植
- 五、补充
-
一、实时操作系统
实时操作系统(RTOS-Real Time Operating System)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。
二、FreeRTOS
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。
三、移植FreeRTOS的准备工作
首先是源码的下载,链接在此FreeRTOS源码下载,另附上官网地址。
下载后可以看到有几个文件。
其中FreeRTOS文件夹内文件包含源码和各种单片机的Demo,而FreeRTOS-Plus文件夹包含的则是FreeRTOS与FatFs、TCP和UDP等组件进行融合的程序代码。
我们暂时需要的是FreeRTOS文件夹的内容,打开它会发现文件包含以下几个文件。
Demo文件夹包含的是各种单片机与FreeRTOS融合的Demo,License文件夹则为字面意思,Source就是FreeRTOS的源码。
(一)、FreeRTOS源码文件作用介绍
1、include文件夹
(1)、include/croutine.h
该文件是croutine.c的头文件,它们共同实现FreeRTOS协同程序功能。具体可看协程的作用。
关于进程-线程-协程的关系如下。
(2)、include/deprecated_definitions.h
该头文件字面意思是弃用的定义。下面是文档里面对应的描述。
每个FreeRTOS端口都有一个唯一的portmacro.h头文件。最初,使用预处理器定义来确保预处理器为所使用的端口找到正确的portmacro.h文件。该方案不赞成设置编译器的include路径,以便找到正确的portmacro.h文件——不需要常量,并允许将portmacro.h文件放在与所使用端口相关的任何位置。下面的定义保留在代码中,仅用于向后兼容。新项目不应该使用它们。
其实就是通过define相对的单片机来声明与单片机相契合的portmacro.h头文件。事实上如前所述,直接将需要的portmacro.h放到自己的工程即可。
(3)、include/event_groups.h
该文件是event_groups.c的头文件,提供事件组功能,它允许与事件通信任务。
(4)、include/FreeRTOS.h
该头文件提供FreeRTOS的配置选项,文件内都是关于系统的宏定义(#ifdef-#define-#endif),通过与FreeRTOSConfig.h配合进行FreeRTOS的配置,通过合理配置可实现FreeRTOS的裁剪。详见FreeRTOS 之 全配置项详解、裁剪(FreeRTOSConfig.h)。
(5)、include/list.h
该文件是list.c的头文件,列表的实现主要是为了调度器(scheduler),但也可以由应用程序代码使用。list_ts只能存储指向list_item_ts的指针。每个ListItem_t包含一个数值(xItemValue)。大多数情况下,列表按递减项值顺序排序。已经创建了包含一个列表项的列表。该项的值是可以存储的最大值,因此它总是在列表的末尾,充当标记。列表成员pxHead总是指向这个标记—即使它位于列表的末尾。这是因为尾部包含一个回滚指针,指向列表的真正头部。除了它的值之外,每个列表项还包含指向列表中下一项的指针(pxNext)、指向它所在列表的指针(pxContainer)和返回包含它的对象的指针。后面的两个指针用于提高列表操作的效率。在包含列表项的对象和列表项本身之间存在有效的双向链接。
(6)、include/message_buffer.h
该头文件为消息缓冲区,它可实现直接到任务通知,它利用流缓冲区(stream_buffer)进行数据的传输。详见RTOS Message Buffers 。
(7)、include/mpu_prototypes.h
该头文件包含的是关于MPU的API函数原型声明。
当使用MPU时,标准(非MPU) API函数被映射到启动“MPU_”的等效函数,该函数的原型在这个头文件中定义。这将导致应用程序代码调用MPU_版本,该版本包装了具有特权的非mpu版本,提升然后降级代码,因此内核代码总是运行于完整的特权下。
(8)、include/mpu_wrappers.h
该头文件主要作用是将标准task .h API函数映射到相应的MPU。
(9)、include/portable.h
该头文件包含的是可移植层的API,它为每个端口定义对应的函数。
(10)、include/projdefs.h
该头文件定义了任务函数必须遵循的原型。
(11)、include/queue.h
该文件是queue.c的头文件,定义了队列的相关函数。详见队列。
在FreeRTOS实现内部,队列使用两个内存块。第一个块用于保存队列的数据结构。第二个块用于保存放置到队列中的项。如果使用xQueueCreate()创建队列,则在xQueueCreate()函数中自动动态分配这两个内存块。(详见Memory Management)。如果使用xQueueCreateStatic()创建队列,那么应用程序编写器必须提供队列将使用的内存。因此,xQueueCreateStatic()允许在不使用任何动态内存分配的情况下创建队列。
(12)、include/semphr.h
该头文件定义了关于二进制信号量/互斥量的函数原型。详见信号量。
在许多使用场景中,使用直接到任务的通知代替二进制信号量会更快、更节省内存!
(13)、include/stack_macros.h
该头文件包含了关于堆栈的宏定义。
如果正在交换的任务的堆栈当前溢出,或者看起来可能在过去溢出,则调用堆栈溢出钩子函数。将configCHECK_FOR_STACK_OVERFLOW设置为1将导致宏只检查当前堆栈状态——将当前堆栈顶部值与堆栈限制进行比较。将configCHECK_FOR_STACK_OVERFLOW设置为大于1也会导致检查最后几个堆栈字节,以确保在创建任务时设置的字节的值没有被覆盖。注意&#