FreeRTOS 教程指南 学习笔记 第一章 简介

本章包含的内容有:

  1. 帮助用户使用FreeRTOS文件和目录,提供FreeRTOS目录结构的顶级视图。
  2. 描述任何特定的FreeRTOS项目实际上需要哪些文件。
  3. 介绍了演示应用程序。
  4. 提供有关如何创建新项目的信息。

一、了解FreeRTOS

FreeRTOS可以使用大约20种不同的编译器来构建,并且可以在30多种不同的处理器架构上运行。每个受支持的编译器和处理器的组合都被认为是一个单独的FreeRTOS分支。FreeRTOS可以被认为是一个能为裸代码程序提供多任务功能的库文件。

二、了解FreeRTOS版本

FreeRTOSConfig.h头文件是FreeRTOS的主要配置文件,由于FreeRTOSConfig.h包含特定于应用程序的定义,因此它应该位于正在构建的应用程序的一部分的目录中,而不是位于包含FreeRTOS源代码的目录中。
FreeRTOS的目录结构
FreeRTOS
│ │
│ ├─Source 系统内核源文件
│ │
│ └─Demo 各分支的实例代码

FreeRTOS-Plus

├─Source 第三方库的源文件,如TCP/IP,JASON等

└─Demo 实例代码
FreeRTOS内核总,最核心的两个文件是task.c和list.c文件,只有这两个文件是必须的。他们被放在FreeRTOS/Source文件夹下,在相同文件夹下还有:


└─Source

├─tasks.c FreeRTOS source file - always required
├─list.c FreeRTOS source file - always required
├─queue.c 使系统支持队列和信号量 - nearly always required
├─timers.c 使系统支持软计时器 - optional
├─event_groups.c 使系统支持事件组等 - optional
└─croutine.c 使系统支持协程 - optional
对于分支的支持:如果您在使用编译器“编译器”的具有架构“架构”的处理器上运行FreeRTOS,那么除了核心的FreeRTOS源文件外,您还必须构建位于FreeRTOS/Source/portable/[compiler]/[architecture]目录中的文件

正如将在第2章,堆内存管理中描述的,FreeRTOS还将堆内存分配视为可移植层的一部分。使用早于V9.0.0的FreeRTOS版本的项目必须包含一个堆内存管理器。在FreeRTOS V9.0.0中,只有当configSUPPORT_DYNAMIC_ALLOCATION在FreeRTOSConfig.h中设置为1,或者当configSUPPORT_DYNAMIC_ALLOCATION未定义时,才需要堆内存管理器。FreeRTOS提供了5个堆分配方案示例。这五种方案分别命名为heap_1到heap_5,并分别由源文件heap_1.c到heap_5.c实现。堆分配方案包含在FreeRTOS/Source/portable/MemMang目录中。如果您已将FreeRTOS配置为使用动态内存分配,那么就必须在项目编译中包含这五个源文件中的一个,除非您的应用程序提供了一个替代实现。

FreeRTOS要求在编译器的包含路径中包含三个目录。他们是:

  1. FreeRTOS内核头文件的路径,它始终是FreeRTOS/Source/include/。
  2. 特定于正在使用的FreeRTOS分支的源文件的路径。这是FreeRTOS/Source/portable/[compiler]/[architecture]。
  3. 指向FreeRTOSConfig.h头文件的路径。
  4. 如果代码文件中使用了FreeRTOS API,则必须包含FreeRTOS.h文件,后面紧跟着task.h,timer.h等。例如:
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "timer.h"
#include "event_groups.h"

三、示例程序

int main( void )
{/* Perform any hardware setup necessary. */prvSetupHardware();/* --- APPLICATION TASKS CAN BE CREATED HERE --- */vUserTask1();vUserTask2(); vUserTask3();/* Start the created tasks running. */vTaskStartScheduler();/* Execution will only reach here if there was insufficient heap to start the scheduler. */for( ;; );return 0;
}

四、从头开始创建项目

建议从现有的演示项目中创建新的项目。如果不需要这样做,则可以使用以下过程创建一个新项目:

  1. 使用您所选择的工具链,创建一个尚未包含任何FreeRTOS源文件的新项目。
  2. 确保可以编译新项目,下载到目标硬件并执行。
  3. 只有当您确定已经有了一个可以正常在目标硬件工作的项目时,才能将FreeRTOS源文件添加到该项目中。
  4. 将为正在使用的分支提供的演示项目所使用的FreeRTOSConfig.h头文件复制到项目目录中。
  5. 将以下目录添加到项目将搜索的路径中,以查找头文件:
    FreeRTOS/Source/include
    FreeRTOS/Source/portable/[compiler]/[architecture]
    包含FreeRTOSConfig.h文件的目录
  6. 从相关的演示项目中复制编译器设置。
  7. 安装可能是必要的任何FreeRTOS中断处理程序。使用相关资源提供的示例
File Location
tasks.c FreeRTOS/Source
queue.c FreeRTOS/Source
list.c FreeRTOS/Source
timers.c FreeRTOS/Source
event_groups.c FreeRTOS/Source
event_groups.c FreeRTOS/Source
All C and assembler files FreeRTOS/Source/portable/[compiler]/[architecture]
heap_n.c(n是1~5) FreeRTOS/Source/portable/MemMang

五、数据类型和代码规范

数据类型:

FreeRTOS的每个分支都有一个唯一的portmacro.h头文件,该文件包含两种端口特定数据类型的定义:TickType_t和BaseType_t。
TickType_t :FreeRTOS配置了一个被称为tick interrupt的周期性中断。自FreeRTOS应用程序启动以来发生的tick interrupt总数数称为tick count。两次tick interrupt之间的时间称为tick period。TickType_t 用于保存周期性中断的tick count,并确定时间的数据类型。
TickType_t可以是unsigned 16-bit ,也可以是unsigned 32-bit ,这取决于在FreeRTOSConfig.h中对configUSE_16_BIT_TICKS的设置。如果configUSE_16_BIT_TICKS被设置为1,则TickType_t被定义为uint16_t。如果configUSE_16_BIT_TICKS被设置为0,则TickType_t被定义为uint32_t。
使用uint16_t类型可以极大地提高8位和16位处理器的效率,但严重限制了可以指定的最大块周期。没有理由在32位处理器上使用uint16_t。
BaseType_t :总是被定义为处理器中最有效的数据类型。通常,这是在32位处理器上的32位类型,在16位体系结构上的16位类型,以及在8位体系结构上的8位类型。BaseType_t通常用于只能取非常有限的值范围的返回类型,以及pdTRUE/pdFALSE类型的布尔类值。
一些编译器把所有所有不合格的字符变量列为无符号,而另一些则使它们列为有符号。出于这个原因,FreeRTOS源代码显式地限定了“有符号”或“无符号”的字符使用,除非字符用于保存ASCII字符,或者指向char的指针用于指向字符串。

变量命名规范:

所有变量命名都有前缀如:
‘c’ for char, ‘s’ for int16_t (short), ‘l’ int32_t (long), and ‘x’ for BaseType_t和其他非标准类型 (structures, task handles, queue handles, etc.)
如果一个变量为无符号,则它也以“u”作为前缀。如果变量是指针,它也以“p”作为前缀。例如,类型为uint8_t的变量将以“uc”为前缀,类型为字符指针的变量将以“pc”为前缀。
函数命名规范:
函数命名的前缀包含了返回类型和它定义在哪里,如:
vTaskPrioritySet() 返回void定义在task.c中。
xQueueReceive() 返回BaseType_t定义在queue.c中。
pvTimerGetTimerID() 返回一个pointer to void定义在timers.c中。
文件范围(private)函数以“prv”为前缀。

宏命名:

大多数宏都是用大写写的,并用小写字母作为前缀,表示宏的位置。表3提供了一个前缀的列表。

Prefix Location of macro definition
port (for example, portMAX_DELAY) Location of macro definition
task (for example, taskENTER_CRITICAL()) task.h
pd (for example, pdTRUE) projdefs.h
config (for example, configUSE_PREEMPTION) FreeRTOSConfig.h
err (for example, errQUEUE_FULL) projdefs.h

请注意,信号量API几乎完全是作为一组宏编写的,但它遵循函数命名约定,而不是宏命名约定。
表4中定义的宏在整个FreeRTOS源代码中都在使用

Macro Value
pdTRUE 1
pdFALSE 0
pdPASS 1
pdFAIL 0

FreeRTOS 教程指南 学习笔记 第一章 简介相关推荐

  1. 《Go语言圣经》学习笔记 第一章 Go语言入门

    Go语言圣经学习笔记 第一章 Go语言入门 目录 Hello, World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL Web服务 本章要点 注:学习<Go语言圣经&g ...

  2. 编译原理(龙书)学习笔记 第一章

    编译原理(龙书)学习笔记 第一章 1.1语言处理器 解释器(interpreter) : 编译器(compiler): 一个语言处理系统 练习 1.1.1:编译器和解释器之间的区别 1.1.2:相对优 ...

  3. 小吴的《机器学习 周志华》学习笔记 第一章 绪论

    小吴的<机器学习 周志华>学习笔记 第一章 绪论 近一年时间接触到不少机器学习的知识,虽然断断续续学了一些,总感觉还没有入门(只学会了疯狂调包).因此,最近开始系统学习Machine Le ...

  4. 计算机网络学习笔记---第一章

    计算机网络学习笔记 第一章 文章目录 计算机网络学习笔记 第一章 前言 一.计算机网络的概念 (一)计算机网络的功能 1.数据通信(连通性) 2.资源共享(硬件 软件 数据) 3.分布式处理 (Had ...

  5. 机器人导论(第四版)学习笔记——第一章

    机器人学导论(第四版)学习笔记--第一章 1. 概述 1.1 背景 1.2 操作臂力学和控制 1.3 符号 1. 概述 1.1 背景 工业自动化的发展带来了工业机器人的高速发展.本书聚焦机械臂的力学和 ...

  6. PhalAPI学习笔记 ——— 第一章自定义HelloWorld接口

    PhalAPI学习笔记 --- 第一章自定义HelloWorld接口 前言 自定义接口 项目实例 结果 分布解析 结束语 前言 公司业务需要转学PHP,而PHP中一个功能强大且生态链完整的PHP接口框 ...

  7. [go学习笔记.第一章] go可以做什么

    go可以做什么,go有以下三大学习方向: Golang的应用领域 1.区块链应用 区块链技术,简称BT(Blockchain technology),也被称之为分布式账本技术,是一种互联网数据库技术, ...

  8. css层叠样式表基础学习笔记--第一章 css简介及引入

    第一章 css简介及引入 1-01 css简介 1-02 css优缺点 1-03 css书写格式 1-04 css引入格式 行内样式 内部样式 外部样式 导入样式 1-05 css注释 1-01 cs ...

  9. 《MongoDB权威指南》读书笔记 第一章 简介

    第一章 1.面向文档的数据库,不是关系形数据库 2.面向文档的数据模型可使数据在多台服务器之间分割,平衡集群的数据和负载 3.具有的功能:索引.聚合.固定集合.文件存储 4.卓越的性能,把逻辑尽量交给 ...

  10. 《你就是孩子最好的玩具》学习笔记 - 第一章

    最近重启了带娃模式,为了更好地发挥自己的作用,还得不断学习.实践,理论指导实践,实践验证理论. 读书是其中一种增长经验的方式,<你就是孩子最好的玩具>这本书是很多人推荐的.他的作者是金伯莉 ...

最新文章

  1. 叮咚!你有一份来自明源云的圣诞邀约
  2. 「前端」History API与浏览器历史堆栈管理
  3. 和公婆住在一起是什么体验?
  4. HDU 1087 [Super Jumping! Jumping! Jumping!]动态规划
  5. 如果外卖APP想窃听我,有几个骚操作?
  6. 工业级大数据接入MQ消息发送异常性及最终一致性解决方案-DW商业环境实战
  7. UBUNTU设置环境变量MALLOC_CHECK_=1检查内存
  8. 基于u-boot源码的简单shell软件实现
  9. Arm 中国原 CEO 被“罢免”,新指定“官方”:已获员工大力支持
  10. 重启tomcat服务器步骤
  11. Windows系统下查询本机IP地址和MAC地址
  12. Excel-事件(Workbook、Worksheet、Range、OnKey/OnTime)
  13. 使用chrome-har导出浏览器HAR数据
  14. hive会产生大量的tmp文件
  15. 01: 网络参考模型 、 数据封装与传输 、 数制与数制转换 、 IP地址与子网掩码
  16. C# 源码 ,使用<switch语句>实现学生成绩评测.
  17. 怎么上永久免费的GPU与TPU服务器colab
  18. macOS-允许打开任何来源的程序
  19. 温度自动控制系统_反应釜温度控制智能化温控设备的趋势
  20. 为有机会进大厂,程序员必须掌握的核心算法有哪些?

热门文章

  1. 高德公交路径等时线分析
  2. 唐宇迪学习笔记2:Python数据分析处理库——pandas
  3. Web前端笔记和简历模板
  4. 如何写python程序
  5. 【codemirror】Json编辑器使用总结
  6. modelsim使用第三方编辑器VS code
  7. 智能网关服务器,边缘计算网关和智能网关区别?
  8. 读 Joseph J. Rotman 之《抽象代数基础教程》
  9. 【企业架构】什么是第一?架构还是流程?
  10. C# 根据模板 导出 Excel 图表 (NPOI组件)