[导读] 遇到些朋友感觉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. 理解Golang的Time结构
  2. 2020 java swing jtable 合并_java学生管理系统(界面版)
  3. sql语句的编程手册(2)
  4. python 字典 列表 速度_高效使用Python字典的清单
  5. MSSQL Server 导入/导出到远程服务器
  6. switch使用中遇到的问题
  7. testlink自带java api_java如何连接testlink
  8. js 对象及空对象或数组及空数组的判断与比较
  9. SpringBoot控制层页面指定返回html前端页面
  10. 【转】解决“你没有权限访问,请与网络管理员联系”
  11. 风云2号卫星云图_中国为什么要发这么多卫星?答案没有出乎意料
  12. linux usb 存储设备,找到哪个驱动器对应于Linux中的哪个USB大容量存储设备
  13. 【JS小知识】this的指向、工厂方法、构造函数及优化、prototype原型、forEach()的使用
  14. 前后端交互node服务器
  15. javascript,jQuery,vue的区别
  16. MATLAB绘图(一)
  17. 计算机结构化面试万能套话,结构化面试30句万能套话拯救你.pdf
  18. 808计算机基础考试时间,成都信息工程大学808计算机基础2020年考研大纲
  19. [译]C++中的内存同步模式(memory order)
  20. Comsol软件入门基础教学

热门文章

  1. jenkins 安装 和自动部署的 一些配置
  2. 安卓权威编程指南 挑战练习 20.9 创建多版本主题
  3. html中hr的各种样式使用
  4. Oracle修改机器名后导致监听和console无法启动解决方法参考(转的)
  5. C# 正则表达式选项总结
  6. 设计模式学习笔记--Memento 备忘录模式
  7. 未来通信设备的体系构架
  8. android 贝塞尔曲线 波浪线,Android 贝塞尔曲线实现水纹波动效果
  9. centos8离线安装Apache_疯狂Hive之Hivean安装部署与交互方式(一)
  10. Python内置函数iter()语法及应用