学习FreeRTOS之路(一):RTOS基础介绍,与FreeRTOS的变量类型、命名规范

前言:

依照惯例,还是自我发挥几句,ESP32的学习大致告一段落,正如我的博客更新状态,目前正在ESP32项目实践。在裸机系统里,所有的操作都是在一个无限的大循环中实现的。编写代码的过程中,确实觉得功能和功能之间的架构,关系,时序等,单纯的用裸机系统来运行太过麻烦,代码、算法等也很臃肿繁琐。
在esp32技术交流群的大触的建议下,我开始接触RTOS(Real Time Operating System 实时操作系统)。
顺便开一个新专栏,记录点笔记。
以上…

基础介绍

为什么要学习RTOS?
在裸机系统中,所有的程序基本都是自己写的,所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型的电子产品用的都是裸机系统,而且也能够满足需求。
那为什么还要学习 RTOS 编程,塞个操作系统进来?一是项目需要,随着产品要实现的功能越来越多(我的需求),单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂。
如果想降低编程的难度,我们可以考虑引入 RTOS 实现多任务管理,这是使用RTOS 的最大优势。二是学习的需要,必须学习更高级的东西,实现更好的职业规划,当程序员而不是码农。

RTOS有哪些?
常用的 RTOS 有国外的 FreeRTOS、μC/OS、RTX 和国内的FreeRTOS、Huawei LiteOS 和 AliOS-Things 等,其中国外开源
且免费的 FreeRTOS的市场占有率最高。
我选则参考学习的也是FreeRTOS。

FreeRTOS的“开源免费”
FreeRTOS 是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议。这里说到的开源,指的是你可以免费得获取到 FreeRTOS 的源代码,且当你的产品使用了 FreeRTOS且没有修改 FreeRTOS 内核源码的时候,你的产品的全部代码都可以闭源,不用开源,
但是当你修改了 FreeRTOS 内核源码的时候,就必须将修改的这部分开源,反馈给社区,其它应用部分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要掏一分钱。

FreeRTOS资料获取:
FreeRTOS 的源码和相应的官方书籍均可从官网 www.freertos.org 获得。

正文:

数据类型:
在 FreeRTOS 中,使用的数据类型虽然都是标准 C 里面的数据类型,但是针对不同的处理器,对标准 C 的数据类型又进行了重定义

在这里插入图片描述
在这里插入图片描述

1 #define portCHAR char
2 #define portFLOAT float
3 #define portDOUBLE double
4 #define portLONG long
5 #define portSHORT short
6 #define portSTACK_TYPE uint32_t
7 #define portBASE_TYPE long
8 
9  typedef portSTACK_TYPE StackType_t;
10 typedef long BaseType_t;
11 typedef unsigned long UBaseType_t;
12 
13 #if( configUSE_16_BIT_TICKS == 1 )
14 typedef uint16_t TickType_t;
15 #define portMAX_DELAY ( TickType_t ) 0xffff
16 #else
17 typedef uint32_t TickType_t;
18 #define portMAX_DELAY ( TickType_t ) 0xffffffffUL

在 FreeRTOS 中,int 型从不使用,只使用 short 和 long 型。

在编程的时候,如果用户没有明确指定 char 的符号类型,那么编译器会默认的指定char 型的变量为无符号或者有符号。正是因为这个原因,在 FreeR
TOS 中,我们都需要明确的指定变量 char 是有符号的还是无符号的。

命名规则:
在 FreeRTOS 中,定义变量的时候往往会把变量的类型当作前缀加在变量上,这样的好处是让用户一看到这个变量就知道该变量的类型。

比如 char 型变量的前缀是 c,short 型变量的前缀是 s,long型变量的前缀是 l, portBASE_TYPE类型变量的前缀是 x。还有其他
的数据类型,比如数据结构,任务句柄,队列句柄等定义的变量名的前缀也是 x。

函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函数则会加一个 prv(private)的前缀。特别的,在函数名中加入了函数所在的文件名,这大大的帮助了用户提高寻找函数定义的效率和了解函数作用的目的,具体的举例如下:

  1. vTaskPrioritySet()函数的返回值为 void 型,在 task.c这个文件中定义。
  2. xQueueReceive()函数的返回值为 portBASE_TYPE 型,在 queue.c 这个文件中定义。
  3. vSemaphoreCreateBinary()函数的返回值为 void 型,在 semphr.h 这个文件中定义。

均是由大写字母表示,并配有小写字母的前缀,前缀用于表示该宏在哪个头文件定义
在这里插入图片描述
在这里插入图片描述

以上内容,参考、感谢:

虽然是基于STM32,但并不影响学习了解FreeRTOS

《[野火®]《FreeRTOS 内核实现与应用开发实战—基于STM32》》

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FreeRTOS是一个非常受欢迎的实时操作系统(RTOS),用于嵌入式系统的开发。SPI(Serial Peripheral Interface)是一种常见的串行通信接口,用于在微控制器和外部设备之间传输数据。FreeRTOS与SPI通信可以通过以下步骤进行。 首先,需要初始化SPI外设。这可以通过配置相关的寄存器和引脚来完成。具体的初始化过程取决于所使用的硬件平台和芯片。 一旦SPI外设初始化完成,就可以创建一个FreeRTOS任务。在该任务中,可以使用FreeRTOS提供的API来实现SPI通信。 要在FreeRTOS任务中使用SPI,可以使用类似于如下的代码段: ```c #include "FreeRTOS.h" #include "task.h" #include "spi.h" void spi_task(void *pvParameters) { // 定义SPI通信的变量和缓冲区 // ... while(1) { // 从外部设备读取数据 // ... // 向外部设备写入数据 // ... // 延时等待 // ... } } void main(void) { // 初始化SPI外设 // ... // 创建FreeRTOS任务 xTaskCreate(spi_task, "SPI Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL); // 启动FreeRTOS调度器 vTaskStartScheduler(); while(1) { // 无限循环 } } ``` 在这个示例中,spi_task函数是一个FreeRTOS任务,用于执行SPI通信。在这个任务中,可以使用SPI外设的相关API来实现通信。此外,还可以使用FreeRTOS提供的延时函数来控制任务之间的时间间隔。 需要注意的是,以上代码只是一个简单的示例,并且具体的实现取决于所使用的硬件平台和芯片。在实际应用中,可能还需要考虑到诸如互斥信号量(Mutex Semaphore)来保护SPI资源的访问等更复杂的情况。 总结起来,FreeRTOS与SPI通信的步骤包括初始化SPI外设和创建FreeRTOS任务,在任务中使用SPI的相关API进行通信。以上是一个简单的示例,具体的实现可能因硬件平台和芯片而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值