【FreeRTOS学习02】源码结构/数据类型/命名规则总结
个人不是很喜欢FreeRTOS的编程风格,但是没办法,白嫖人家的东西,只能忍了,这里先简单总结一下;
相关文章
【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)
1 源码结构
下载或者克隆源码,可以看到顶层的源码结构如下图所示;
FreeRTOS
:实时系统的源文件,主要是这部分;FreeRTOS-Plus
:这里主要基于FreeRTOS的demo,比如iot-lib,tcp等等;
下面重点看一下FreeRTOS
,具体如下所示;
- ① portable:是一个文件夹,里面包括了各个平台移植所需要的文件;
- ② MenMang:内存管理的文件,基本包括
heap_1.c
,heap_2.c
,heap_3.c
,heap_4.c
,heap_5.c
,以后再深入了解;
下面是几个比较核心的文件,前面有简单提到过,简单介绍如下:
- list.c
基本的数据结构,双链表的实现,是很多函数的底层文件, 使用FreeRTOS
必须要包含的文件; - tasks.c
任务块,任务调度,创建,删除等等接口都在这个文件中,也是必须要包含的文件; - queue.c
这个文件同时提供消息队列和信号量服务,作为任务间同步基本离不开它,所以这个文件几乎也是必须包含的; - timers.c
这个文件提供软件计时器功能。如果需要实际使用软件计时器的功能,则应该将它包括到构建工程中; - event_groups.c
这个文件提供了事件组功能。如果需要事件组,则需要将它包含到工程中; - croutine.c
这个文件实现FreeRTOS
协同例程功能,协同例程用于非常小的微控制器,现在很少使用,看情况添加;
具体如下所示;
- FreeRTOSConfig.h
这个文件可以有用户创建,当然在源码的demo
路径下可以找到现成的文件,根据自己需求配置FreeRTOSConfig.h
的宏定义,从而实现对FreeRTOS
的剪裁。
2 数据类型
FreeRTOS
的数据类型基本上都定义在portmacro.h
文件中,比如在FreeRTOS\Source\portable\RVDS\ARM_CM3
下就可以找到这个文件;除此之外,FreeRTOS
中还有两个特定的数据类型;
- BaseType_t
这个类型被定义为架构中最有效的数据类型;比如32位体系结构使用32 bit
数据类型/int32_t
,16位架构使用16 bit
数据类型/int16_t
,8位架构上使用8 bit
数据类型/int8_t
。
BaseType_t 适用于数据范围比它小的类型的值,所以也适用于pdTRUE
/pdFALSE
类型的布尔值; - TickType_t
FreeRTOS
配置一个称为tick interrupt
的定时中断;两次滴答中断之间的时间称为滴答中断周期;所以tick number
是指定滴答中断周期的倍数,TickType_t
是用来保存滴答计数值和to的数据类型指定时间。
在32位机上数据类型定义如下所示,和具体的平台相关;
3 命名规则
3.1 常见命名规则
匈牙利命名法:广泛应用于Microsoft Windows这类环境中;
驼峰命名法:近年来越来越流行。
驼峰命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。
例如:
printEmployeePaychecks();
函数名中每一个逻辑断点都有一个大写字母来标记。帕斯卡(Pascal)命名法:与驼峰命名法类似。
只不过驼峰命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。因此这种命名法也有人称之为“大驼峰命名法”。
例如:
DisplayInfo();
UserName
都是采用了帕斯卡命名法。在C#中,以帕斯卡命名法和骆驼命名法居多。事实上,很多程序设计者在实际命名时会将驼峰命名法和帕斯卡结合使用,例如变量名采用驼峰命名法,而函数采用帕斯卡命名法。下划线命名法:
下划线法是随着C语言的出现流行起来的,在UNIX/LIUNX
这样的环境,以及GNU
代码中使用非常普遍。1
3.2 FreeRTOS的规则
- 变量名
前缀c
:char
;
前缀s
:int16_t
;
前缀p
:指针变量;
大写l
:int32_t
;
小写x
:表示类型为BaseType_t
:其他非标准类型(结构、任务句柄、队列句柄等等);
如果一个变量是无符号的,那么它也以“u”为前缀。如果一个变量是一个指针,它也是带前缀的,例如,类型为uint8_t的变量将前缀为
uc
- 函数名
FreeRTOS
函数名的前缀表示它们返回的类型,也包括它们在其中定义的文件;vTaskPrioritySet()
:前缀v
表示返回类型为viod
,Task
表示在tasks.c
中定义;xQueueReceive()
:前缀x
表示返回BaseType_t
类型数据,Queue
表示该函数在queue.c
中定义;pvTimerGetTimerID()
:前缀pv
表示返回void类型指针,Timer
表示该函数在timer.c.
中定义;prv
:前缀prv
表示作用范围为当前的文件;
- 宏定义
FreeRTOS
的大多数宏都是用大写字母写的,并以小写字母作为前缀来表示
定义了宏,如下所示;
前缀 | 定义的位置 |
---|---|
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 |
port (for example, portMAX_DELAY ) |
portable.h or portmacro.h |
4 总结
本文总结了FreeRTOS源码结构和数据类型,为以后移植系统和源码阅读打下一丢丢基础。
驼峰命名法-百度百科 ↩︎
【FreeRTOS学习02】源码结构/数据类型/命名规则总结的更多相关文章
- thinkphp学习笔记1—目录结构和命名规则
原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...
- nginx源码学习_源码结构
nginx的优秀除了体现在程序结构以及代码风格上,nginx的源码组织也同样简洁明了,目录结构层次结构清晰,值得我们去学习.nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我 ...
- Thrift 源码学习一——源码结构
Thrift 客户端与服务端的交互图 源码结构 传输层 TTransport: TTransport:客户端传输层抽象基础类,read.write.flush.close 等方法 TSocket 与 ...
- [译] 给PHP开发者的PHP源码-第一部分-源码结构
文章来自:http://www.hoohack.me/2016/02/04/phps-source-code-for-php-developers-ch 原文:http://blog.ircmaxel ...
- 【菜鸟学习jquery源码】数据缓存与data()
前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...
- PostgreSQL9.2.4内核源码结构介绍
PostgreSQL的源代码可以随意获得,其开源协议也允许研究者任意修改,这里介绍一下PostgreSQL的源码结构以及部分实现机制.下载PostgreSQL源代码并减压后,其一级目录结构如下图: P ...
- Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...
- DotNetty网络通信框架学习之源码分析
DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...
- Nginx源码结构及如何处理请求
一.源码结构 1:下载安装包后,解压,可以看到目录结构,其中src目录下放的是源码 2:src源码目录下,可以看到这几个目录 mail:mail目录中存放了实现Nginx服务器 ...
随机推荐
- 发现一款手绘可视化神器!Python绘图还在用Matplotlib?out了 !
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...
- 负载均衡服务之HAProxy基础入门
首先我们来了解下haproxy是干嘛的?haproxy是一个法国人名叫Willy Tarreau开发的一个开源软件:这款软件主要用于解决客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡 ...
- skynet启动流程及调用服务
3.基本原理 3.1启动流程 1.skynet-src/skynet_main.c 这个是main()函数所在,主要就是设置一下lua的环境.默认的配置.打开config配置文件,并修改默认配置. ...
- shiro:入门程序(一)
SpringMVC项目 1:pom引入相关依赖 <dependencies> <!--测试依赖--> <dependency> <groupId>jun ...
- Java中接口的概念
接口的特点: A:接口用关键字interface表示 interface 接口名 {} B:类实现接口用 implements 表示 class 类名 implements 接口名 {} C:接口不能 ...
- 机器学习5- 对数几率回归+Python实现
目录 1. 对数几率回归 1.1 求解 ω 和 b 2. 对数几率回归进行垃圾邮件分类 2.1 垃圾邮件分类 2.2 模型评估 混淆举证 精度 交叉验证精度 准确率召回率 F1 度量 ROC AUC ...
- spring boot连接linux服务器上的redis
本文章为给新手学习spring boot远程连通redis提供一个学习参考. 环境是intellij idea(window)+ redis(linux虚拟机-vmware). 首先在linux安装好 ...
- 微信小程序入门(持续更新)
微信小程序的主要文件介绍: . js:脚本文件 .json:配置文件 .wxss:样式表文件 .wxml:页面 微信小程序差不多也是和mvc模式差不多的,采用数据和页面分离的模式,在js上写的数据可以 ...
- 安卓微信浏览器中window.location.href失效的问题
最近接手一微信项目,测试功能时,发现跳转在android手机上不动了.iso系统可以正常跳转的.解决方法: window.location.href = url + '?v=' + (new Date ...
- 总结:js世界中的特殊符号
常用符号:+ ++ - -- || / /' && 等 这些基本上每天都能用到,但是 js 世界中有些特殊符号是不常用的,我也是偶然在阅读大神代码的时候发现的,一番查找之后得出了以下结 ...