[导读] 遇到些朋友感觉FreeRTOS内核代码看起来很不习惯,不习惯其编码风格,本文就来梳理一下其代码规范,便于提高阅读其代码的效率。代码基于FreeRTOS V10.4.3。

FreeRTOS代码结构

其内核代码文件就这几个,非常简洁:

  • croutine.c/croutine.h: 协程,在8位/16位平台下效率比较高,在32位平台建议使用任务task
  • event_groups.c / event_groups.h:顾名思义,这个是事件组的实现
  • heap_x.c:内核堆实现,FreeRTOS提供了heap_1.c ~ heap_5.c 5种堆管理器,各有优缺点,需要根据应用进行选择。
  • list.c/list.h:链表实现,主要为调度器提供数据结构算法支持服务。比如任务链表。
  • port.c/portmacro.h:硬件相关层级可移植抽象,主要包括SysTick中断,上下文切换,中断管理,具体实现很大程度上取决于平台(单片机体系硬件内核和编译器工具集)。通常以汇编语言实现。
  • queue.c/queue.h/semphr.h:信号量、互斥体实现
  • tasks.c/task.h:任务管理器实现
  • timers.c/timers.h:软件定时器实现
  • FreeRTOS.h:选编译配置文件,用于汇总所有源文件的编译选择控制
  • FreeRTOSConfig.h:FreeRTOS内核配置,Tick时钟和irq中断配置

接下来整理一下,相关的代码规范,具体就体现在上述文件的编码中。

变量

变量有严格的前缀标识变量类型属性:

  • c – char 字符型变量
  • s – short 短型变量
  • l – long  长整型变量
  • x – portBASE_TYPE 在 portmacro.h 中定义,便于移植的数据类型转定义
  • u – unsigned 无符号整型
  • p - pointer 指针

举例:

//x表示portBASE_TYPE, u 表示无符号型PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY;

//比如在list.h 中struct xLIST_ITEM{    configLIST_VOLATILE TickType_t xItemValue;    //指针以p打头    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;     void * pvOwner;     struct xLIST * configLIST_VOLATILE pxContainer; };

对于C语言的基本数据类型,做了可移植转定义:

#define portCHAR          char#define portFLOAT         float#define portDOUBLE        double#define portLONG          long#define portSHORT         short#define portSTACK_TYPE    uint32_t#define portBASE_TYPE     long

函数


前缀:

  • v :void 无返回类型
  • x :返回portBASE_TYPE
  • prv :私有函数,模块内使用
//ux 表示无符号portBASE_TYPE 返回值//List表示该函数所属文件//Remove函数名UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION;

//又比如prv 表示模块内函数static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION;

定义宏所属文件,也即在哪个文件内定义的:

  • port:比如portable.h中portMAX_DELAY
  • task:比如task.h中task_ENTER_CRITICAL
  • pd :例如projdefs.h中定义的pdTRUE
  • config:例如 FreeRTOSConfig.h中定义的configUSE_PREEMPTION
  • err:例如 projdefs.h中定义的errQUEUE_FULL

至于这么严格的代码规范是否值得推崇,这个见仁见智,个人比较喜欢Linux代码风格,对于过于复杂的代码规范,在实际开发中个人觉得有时候会让人不爽。

1.GD32 Arm MCU物联网开发者线上课程来啦,快入群等开课!

2.专家观点:2021年嵌入式与物联网产业趋势

3.为什么大家看好RISC-V?

4.嵌入式开发中要用的三种程序架构~

5.阿里达摩院2021十大科技趋势~

6.FPGA难懂?其实与GPU类比一下就明白了

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

代码的c++实现_一文带你快速理解FreeRTOS代码规范~相关推荐

  1. 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...

    今天带大家快速理解盒子模型,直接上代码: css盒子 我的css盒子测试模型 上面代码没有任何难度,只是写了一个div标签,大家已经知道,div标签是块级元素,所以会占满一行: 但是我们也注意到了图片 ...

  2. @valid 校验_一文带你快速入手 Spring Boot 参数校验

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 作者:狂乱的贵公子 来源: ...

  3. 画出该lti系统的幅频特性响应曲线_一文带你通俗理解幅频响应和相频响应

    ​引言 好多人学习数字信号处理学了很久都没有明白这两个概念的真实含义,或者说很多人在设计滤波器的时候,根本就没有考虑什么是幅频响应和相频响应.只是一昧地把滤波器设计出来然后把不要的频率滤除掉,这样是要 ...

  4. linux telnet成功显示什么_一文带你彻底理解 Linux 的各种终端类型及概念

    (给Linux爱好者加星标,提升Linux技能) 转自:dog250 https://blog.csdn.net/dog250/article/details/78766716 每天使用Linux每天 ...

  5. 带通 带阻滤波器 幅频响应_一文带你通俗理解幅频响应和相频响应

    引言 好多人学习数字信号处理学了很久都没有明白这两个概念的真实含义,或者说很多人在设计滤波器的时候,根本就没有考虑什么是幅频响应和相频响应.只是一昧地把滤波器设计出来然后把不要的频率滤除掉,这样是要吃 ...

  6. 一文带你深入理解【Java基础】· 面向对象编程(下)②代码块、final和abstract

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  7. 一文带你深入理解JVM内存模型

    一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...

  8. 一文带你深入理解【Java基础】· 枚举类

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  9. 一文带你深入理解【Java基础】· Java基本语法:程序流程控制

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

最新文章

  1. ecshop商品详情相册顺序调整
  2. wasm逆向——(极客大挑战2021wasm
  3. nyoj-491--幸运三角形--简单深搜枚举(TLE)
  4. 7.2-5 usermod
  5. Electron开发入门
  6. mysql逻辑备份之mysqldump
  7. 不忘本~explicit和implicit修饰符
  8. python安装多久_python安装与使用
  9. 查看linux端口对应的进程id
  10. oracle 截取小数点_oracle函数(关于处理小数点位数和时间) | 学步园
  11. 基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群
  12. reduce 阶段遍历对象添加到ArrayList中的问题
  13. vn.py开源量化交易程序开发框架
  14. Git以及GithubDesktop配置ssh访问/下载/上传 详细步骤
  15. UNI-APP获取手机MAC地址
  16. 苹果客服说的「重置SMC、NVRAM、PRAM」都是干嘛的?
  17. 电脑录屏软件哪个好用,分享4款电脑录制视频清晰软件
  18. 浅析经典JVM垃圾收集器-Serial/ParNew/Parallel Scavenge/Serial Old/Parallel Old/CMS/G1
  19. 拓嘉启远:怎样做拼多多推广见效是比较快的
  20. 根据显卡型号查看相应的驱动

热门文章

  1. oracle:10g下载地址(转载)
  2. 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III
  3. jQuery事件绑定函数:on()与bind()的差别
  4. python第十八天
  5. 继续推荐几款VisualStudio的插件
  6. Part1: Specification of Required Functions
  7. 程序.NET Framework版本升级,重签名,重链接,批量签名工具
  8. cookie可存的最大限制_一文梳理Web存储,从cookie,WebStorage到IndexedDB
  9. Python使用ZeroMQ/inproc模式实现多线程服务端
  10. Python连接两个字符串并去除首尾重复子串