FreeRTOS学习-前言与FreeRTOS发行版

2023-05-16

1. 前言

因为工作的需要,学习FreeRTOS已经有一段时间了。接下来一段时间会定期更新本人学习FreeRTOS的系列笔记。系列笔记主要参考了官方的说明手册和FreeRTOS的源代码。其主要思想是先了解FreeRTOS的对外接口,即理清其对外可见的功能,以此作为切入点,逐步深入其内涵(即内部实现)。这是一种由外而内的学习方法,其好处很明显:

  • 由浅入深,逐渐深入;
  • 满足不同需求层析的人的需求:对于只需要了解如何使用FreeRTOS的童鞋,只需要学习外延部分即可;对于有更加深入要求的童鞋,也可以从中求得解答。

另外,实现部分主要基于FreeRTOS v9.0.0中ARMv7(确切而言是ARMCA9)Port版本

FreeRTOS的特性:

  • 高度可裁剪性(通过编译宏实现)
  • Pre-emptive或Co-operative操作
  • 非常灵活的任务优先级
  • 灵活、快速和轻量级的任务通知机制
  • 队列
  • 二值信号量(Binary semaphores)
  • 计数信号量(Counting semaphores)
  • 互斥
  • 循环互斥(Recursive Mutexes)
  • 软件定时器
  • 事件组(Event groups)
  • Tick hook functions
  • Idle hook functions
  • 栈溢出检测
  • Trace recording
  • Task run-time statistics gathering
  • 可选的商业Licensing和支持
  • Full interrupt nesting model(对于某些体系结构可用)
  • 提供了实现睡眠功能的框架,适用于某些具有极低功耗需求的应用
  • 支持软件管理的中断栈(可帮助节省RAM)

2. FreeRTOS发行版(The FreeRTOS Distribution)

2.1. 理解FreeRTOS发行版

FreeRTOS port:每个所支持的编译器和处理器的组合,称为一个独立的FreeRTOS port。

2.1.1. 构建FreeRTOS

在项目中,可以将FreeRTOS视为一个提供多任务能力的函数库;

FreeRTOS用C语言实现;

源代码将作为项目的一部分存在。

2.1.2. 配置FreeRTOS

方法:修改FreeRTOSConfig.h,该头文件位于实际应用工程所在的目录。

2.1.3. 官方发行版

主要组成:一个zip文件,其中包含了所有FreeRTOS port的源码与demo应用的项目文件,以及可选的FreeRTOS+ 生态系统组件和相应的demo工程。

顶层目录结构:
顶层目录结构

所有Ports共享的源文件:

所有Ports共享的源文件

与Port相关的源文件:

与Port相关的源文件

2.1.4. 包含路径(Include Paths)

为了FreeRTOS能正常使用,需要添加到编译器的头文件路径的路径:

  • FreeRTOS的核心头文件:/FreeRTOS/Source/include
  • 实际使用的FreeRTOS port的源文件路径:FreeRTOS/Source/portable/[compiler]/[architecture]
  • FreeRTOSConfig.h所在的路径

2.1.5. 关键的头文件

所有使用了FreeRTOS API的源文件都需要包含:

  • FreeRTOS.h
  • 实际使用的API的原型定义头文件:例如"task.h"、"queue.h"等。

2.2. Demo应用

Demo应用的主要目的:

  • 提供一个可用的例子工程,包含正确的文件,和正确的编译器配置集
  • 提供“开箱即用(Out of the Box)”的使用场景,减少配置和前置知识
  • 作为如何使用FreeRTOS的说明
  • 实际项目的起始点

所有Demo的描述可以在FreeRTOS.org查询。

FreeRTOS/Demo的目录结构如下:

Demo的目录结构

2.3. 创建FreeRTOS Project

2.3.1. 移植一个已经提供的Demo Project

官方建议的方式

步骤如下:

  1. 打开已有的demo project,确保它能够正常的编译和执行
  2. 删除定义demo tasks的源文件:在Demo/Common目录下的文件都可以被删除
  3. 除了prvSetupHardware()vTaskStartScheduler(),删除所有main()内其他的函数调用
  4. 确保工程仍然可以正常编译。

2.3.2. 从头创建一个新的工程

不建议

2.4. 数据类型和编码风格

2.4.1. 数据类型(Data Types)

平台相关的数据类型定义:portmacro.h

  • TickType_t

    tick interrupt:freertos中的周期性中断。

    tick count:从freertos应用开始后,tick interrupt发生的次数。用于度量时间。

    tick period:两个tick interrupt之间的时间。时间用tick periods来定义。

    TickType_t类型的变量用于存储tick count值。

    根据configUSE_16_BIT_TICKS来确定TickType_t被定义为unsigned 16-bit类型(1)或是unsigned 32-bit类型(0)

  • BaseType_t

    被定义为当前体系结构的最大的有效数据类型(长度为机器字长),例如32位体系结构则为32-bit类型。

    该类型使用场景有限。

  • StackType_t

    BaseType_t类似。它表示栈的槽的大小。

其他类型:

  • char需要显式定义为signedunsigned
  • 不使用无修饰的int

2.4.2. 变量命名

变量名中带有表明其类型的前缀:

  • c - char
  • s - int16_t(short)
  • l - int32_t(long)
  • x - BaseType_t和其他非标准的类型(structures, task handler, queue handle等)

变量的符号前缀:

  • u - unsigned:例如uc表示uint8_t

变量的指针前缀:

  • p - pointer:例如pc表示指向char的指针

2.4.3. 函数命名

函数以其返回类型和其被定义的文件名为前缀:

  • vTaskPrioritySet()返回void,定义在task.c
  • pvTimerGetTimerID()返回指向void类型的指针,定义在timers.c

仅文件内可见的函数以prv(private)作为前缀。

2.4.4. 宏命名

以小写字母作为前缀,表明其所定义的文件,大写字母为宏定义的名字:

  • port: portMAX_DELAY定义在portable.hportmacro.h
  • task: taskENTER_CRITICAL()定义在task.h
  • pd: pdTRUE定义在projdefs.h
  • config: configUSE_PREEMPTION定义在FreeRTOSConfig.h
  • err: errQUEUE_FULL定义在projdefs.h

semaphore API用宏定义实现,但遵循函数的命名方式。

FreeRTOS全局使用的宏定义:

  • pdTRUE: 1
  • pdFALSE: 0
  • pdPASS: 1
  • pdFAIL: 0

2.4.5. 文本格式化

1 tab = 4 spaces

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习-前言与FreeRTOS发行版 的相关文章

  • ‘com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor‘ 已经过时了导致出现返回total总为0的问题

    在配置类中去掉原有的依赖 他已经过时了 去掉之后 添加这个功能更多更新的Bean对象 64 Configuration span class token keyword public span span class token keywor
  • UnsatisfiedDependencyException: Error creating bean with name ‘subjectServiceImpl‘: Unsatisfied depe

    背景 看xml所在的路径不舒服 任性改资源路径 以为idea会帮我更新引用就以身试险了哈哈哈 报错信息是bean出现了创建错误 查了网上大部分的博客 一一排除后还是报错 网上大部分建议总结如下 1 先去排查service实现层有没有添加注解
  • Web server failed to start. Port 9020 was already in use./window环境

    Web server failed to start Port 9020 was already in use Web服务器无法启动 端口9020已在使用中 解决思路 xff1a 端口被占用了 xff0c 需要我们去杀死相应的进程 xff0
  • 怎么删除存在表关联的原有数据库表空间?

    怎么删除原有数据库表空间 xff1f 1 xff1a 查询所有的表空间 select tablespace name from sys dba tablespaces 2 xff1a 删除 普通删除 DROP TABLESPACE MESA
  • oracle数据库还原/finalshell/删除表空间/用户名冲突

    数据库10 0 1 131还原 1 首先进行数据库finalshell的配置 账号 xff1a mesadmin 密码 xff1a 2 加载oracle配置文件 sudo su su oracle source etc profile 3
  • C++中的数据类型及其所占字节

    1 整型 包括 xff1a short xff08 短整型 xff09 xff0c 占2个字节 xff1b int xff08 整型 xff09 xff0c 占4个字节 xff1b long xff08 长整型 xff09 xff0c 占4
  • C语言中的关键字

    C语言共有32个关键字 关键字不能作为常量名 变量名或其他标识符名称 根据关键字的作用 xff0c 可将关键字分为 xff1a 数据类型关键字 控制语句关键字 存储类型关键字和其它关键字这四类 数据类型关键字 xff08 12个 xff09
  • C语言字符串和字符串结束标志

    1 在C语言中 xff0c 是将字符串作为字符数组来处理的 2 C语言规定了一个 字符串结束标志 xff0c 以字符 0 作为结束标志 如果字符数组中存有若干字符 xff0c 前面九个字符都不是空字符 xff08 0 xff09 xff0c
  • C语言字符数组的输入和输出

    字符数组的输入输出有两种方法 xff1a xff08 1 xff09 逐个字符输入输出 用格式符 c 输入或输出一个字符 例如 span class token keyword int span span class token funct
  • android手机开启IPv6(电信)

    安卓手机开启IPv6 xff08 电信 xff09 系统设置找到移动网络 接入点 接入点选择CTNET 接入设置点进去可以找到APN协议 xff0c 选择IPv4 IPv6即可 实测手机这样设置后开热点笔记本 xff0c 能稳定获得ipv6
  • C语言 怎样定义函数

    1 定义函数 C语言要求 xff0c 在程序中用到的所有函数必须要 先定义 xff0c 后使用 定义函数应包括以下几个内容 xff1a xff08 1 xff09 指定函数的名字 xff0c 以便以后按名调用 xff08 2 xff09 指
  • C语言 函数的返回值

    通过函数调用使主调函数能得到一个确定的值 xff0c 这就是函数值 xff08 函数的返回值 xff09 1 函数的返回值是通过函数中的return语句获得的 return语句将被调用函数中的一个确定值带回到主调函数中去 如果需要从被调函数
  • C语言 函数的嵌套调用

    C语言的函数定义是互相平行 独立的 xff0c 也就是说 xff0c 在定义函数时 xff0c 一个函数内不能再定义另一个函数 xff0c 即不能嵌套定义 xff0c 但可以嵌套调用函数 xff0c 即 xff0c 在调用一个函数的过程中
  • C语言 Hanoi(汉诺)塔问题,用递归解决

    问题 古代有一个梵塔 xff0c 塔内有3个座A xff0c B xff0c C 开始时A座上有64个盘子 xff0c 盘子大小不等 xff0c 大的在下 xff0c 小的在上 有一个老和尚想把64个盘子从A作移到C座 xff0c 但规定每
  • C语言 数组元素的指针

    1 一个变量有地址 xff0c 一个数组包含若干个元素 xff0c 每个数组元素都在内存中占用存储单元 xff0c 它们都有相应的地址 2 指针变量既然可以指向变量 xff0c 当然也可以指向数组元素 xff08 把某一元素的地址放入一个指
  • Python 实验三 控制语句

    1 从键盘接收整数的一百分制成绩 xff08 0到100 xff0c 要求输出其对应的成绩等级A E 其中 xff0c 90分 xff08 包含 xff09 以上为A xff0c 80 89 xff08 均包含 xff09 分为B xff0
  • Python 实验四 常用数据结构(1)

    1 从键盘输入一个正整数列表 xff0c 以一1结束 xff0c 分别计算列表中奇数和偶数的和 n span class token operator 61 span span class token builtin int span sp
  • Python 实验四 常用数据结构(2)

    6 某企业为职工发放奖金 xff1a 如果入职超过5年 xff0c 且销售业绩超过15000元的员工 xff0c 奖金比例为0 2 xff1b 销售业绩超过10000元的员工 xff0c 奖金比例为0 15 xff1b 销售业绩超过5000
  • JavaScript之入门4篇(DOM节点操作)

    学习记录 xff1a 学习视频链接https www bilibili com video BV1Sy4y1C7ha p 61 194 amp spm id from 61 pageDriver 1 节点操作 xff1a 1 利用DOM提供
  • Please wait while Jenkins is getting ready to work (jenkins)

    如果界面提示Jenkins正在启动 请稍后 或者提示 Please wait while Jenkins is getting ready to work 解决方法 1 需要你进入jenkins的工作目录 xff0c 打开 hudson m

随机推荐

  • 异常点检测的应用场景与检测方法(含代码实操案例)

    异常点检测概述 这里常说的异常点 xff0c 目前并没有具体的严格定义 xff0c 大多数来讲 xff0c 检测异常点都是按照数据分布与业务逻辑结合进行主观判断是否属于异常点 关注金科应用研院 xff0c 回复 CSDN xff0c 领取风
  • ApacheDS搭建

    前提 安装jdk sudo apt get install openjdk 8 jdk 安装 先安装apacheds2 配置客户端远程登录 xff0c 这里使用Apache Directory Studio xff0c 配置界面如下 xff
  • Windows 10 内置linux执行带GUI的应用程序

    1 安装MobaXterm xff0c 并运行 2 打开内置的Linux xff0c 命令执行带GUI的运行程序即可
  • Repo介绍

    目录 1 概要2 工作原理 2 1 项目清单库 repo manifests 2 2 repo脚本库 repo repo 2 3 仓库目录和工作目录 3 使用介绍 3 1 init3 2 sync3 3 upload3 4 download
  • Android 8.0.0-r4源码目录结构详解

    android的移植按如下流程 1 android linux 内核的普通驱动移植 让内核可以在目标平台上运行起来 2 正确挂载文件系统 确保内核启动参数和 android 源代码 system core rootdir 目录下的 init
  • Android8.0.0-r4的编译系统

    一 概述 1 1 编译系统变化 从Android 7 0开始 xff0c android的编译系统发生了变化 xff0c 之前依赖Makefile组织编译系统 xff0c 从7 0开始逐步引入了kati soong optional未正式使
  • [Android Studio]Android Studio 三种添加插件的方式

    何给Android Studio添加插件 添加插件的路径有三种 xff0c 我把他们分类如下 xff1a 点击设置小按钮 点击 xff3b Plugins xff3d 这里展示的是你已经安装的插件 xff0c 我们可以点击插件名称 xff0
  • Gerrit 服务器插件安装-示例插件delete project

    gerrit2 X 中没法直接删除一个项目 xff0c 之前需要手工删除 xff0c 后来社区提供了一个插件delete project来搞定这个事 xff0c 安装方法如下 xff1a 到 gerritforge xff0c 找到对应的
  • Windows平台下载Android源码(整理)

    Google官方下载源码使用的系统Ubuntu系统 xff0c 不过现在我们需要在Windows系统中下载Android源码文件 网站的地址是 xff1a https android googlesource com 里面包括Android
  • Ubuntu 16.04 文件服务器--samba的安装和配置

    Samba是在Linux系统上实现的SMB xff08 Server Messages Block xff0c 信息服务块 xff09 协议的一款免费软件 它实现在局域网内共享文件和打印机 xff0c 是一个客户机 服务器型协议 客户机通过
  • 深入剖析Android音频之AudioTrack

    播放声音能够用MediaPlayer和AudioTrack xff0c 两者都提供了java API供应用开发人员使用 尽管都能够播放声音 但两者还是有非常大的差别的 当中最大的差别是MediaPlayer能够播放多种格式的声音文件 比如M
  • 树莓派4 运行 Tensorflow Lite

    树莓派4 运行 Tensorflow Lite 1 更新树莓派 span class token function sudo span apt update 2 下载安装脚本 span class token function git sp
  • 操作系统进程进行系统调用详细过程

    翻阅很多资料 xff0c 综合了各处所述进程在进行系统调用之后的状态会如何的解答 xff0c 以下是我个人理解 xff0c 欢迎各位读者纠错 PS 特别感谢以下这个帖子 xff0c 看完他们的讨论我才茅塞顿开 xff0c 非常感谢 xff0
  • 解决Ubuntu 找不到ARM64 的源的问题(转)

    Ubuntu 安装了NVIDIA的驱动还有DriveWokrs之后 xff0c 好像把系统添加了arm64的架构 xff0c 因此 xff0c 在源更新的时候 xff0c 也会更新arm64相关的源 xff0c 但是问题在于 xff0c 用
  • asp.net 实现打开文件所在的文件夹, 本地可以打开,发布后点击按钮没有反应的解决办法

    此类情况大概是安全范畴的问题 确定上传文件夹的共享 xff0c iis 以及电脑帐户 xff0c 以及aspnet 等是否有对应的相关权限 1 确认ASPNET 账户属于管理员级别 2 在 服务 里面找到 IIS Admin xff0c 双
  • numpy 和 tensor 的区别

    关系 xff1a 两者共享内存 xff0c 转换方便 xff0c 没有额外的开销 区别 xff1a 1 数据类型上面的区别 xff1a numpy 默认类型是 float64 int32 tensor 默认类型是float32 int64
  • 关于docker无法apt-get update的问题

    在看这篇文章https www jianshu com p 21d66ca6115e 有一个部分是 但是发现自己的 Node 没有ping命令 想着去apt get update 但是出现如下错误 只要在命令签名加上 sudo 就行
  • ubuntu下安装zip unzip

    安装命令 apt get install zip unzip 执行命令常见错误 xff1a 1 unable to locate package 解决办法 xff1a 执行sudo apt get update命令后再执行安装命令就可以了
  • 平衡小车卡尔曼滤波算法

    最近研究STM32的自平衡小车 xff0c 发现有两座必过的大山 xff0c 一为卡尔曼滤波 xff0c 二为PID算法 网上看了很多关于卡尔曼滤波的代码 xff0c 感觉写得真不咋地 一怒之下 xff0c 自己重写 xff0c 不废话 x
  • FreeRTOS学习-前言与FreeRTOS发行版

    1 前言 因为工作的需要 xff0c 学习FreeRTOS已经有一段时间了 接下来一段时间会定期更新本人学习FreeRTOS的系列笔记 系列笔记主要参考了官方的说明手册和FreeRTOS的源代码 其主要思想是先了解FreeRTOS的对外接口