我们从一开始接触Arduino编程就知道,Arduino程序结构由setup()和loop()两部分组成,我们需要反复执行的代码要放在loop()中,并且这些代码一般都是顺序执行的。

随着我们需要实现的功能越来越复杂,这种顺序执行的方式很难达到实时性,这个时候就需要使用操作系统了,就类似于我们的PC机,可以同时运行多个软件,你可以一边聊QQ一边看电影,或者你用手机一边听歌一边看这篇文章。当然PC机和手机的处理器要强大的太多太多了,而我们的Arduino UNO开发板上使用的是一颗8位的AVR单片机。

接触过嵌入式的朋友都知道,我们会在ARM处理器上使用Linux系统,而在STM32这种较ARM低端而又比单片机强大的MCU上一般会使用更轻量级的实时操作系统,类似的如UCOS、FreeRTOS、RTThread等。习惯了STM32上运行FreeRTOS,真的没有想过在Arduino上来运行,最近发现了被移植到Arduino上运行的FreeRTOS实时操作系统,赶紧来尝试下。

1. 安装Arduino FreeRTOS库

在Arduino IDE中,点击「项目」—「加载库」—「管理库」,在搜索栏输入"FreeRTOS",查找并安装库。

2. Arduino FreeRTOS的使用

Arduino FreeRTOS库可运行于Arduino AVR设备,如Uno、Leonardo、Mega等。本篇使用Uno开发板。

首先要包含Arduino FreeRTOS库的头文件。

#include <Arduino_FreeRTOS.h>

我们使用xTaskCreate()函数来创建任务,函数原型为:

xTaskCreate(TaskFunction_t pvTaskCode,const char * const pcName,uint16_t usStackDepth,void * pvParameters,UBaseType_t uxPriority,TaskHandle_t * pxCreatedTask)

创建任务时需要传入6个参数:

  • pvTaskCode:任务函数。
  • pcName:任务名称,一般用于调试和追踪。
  • usStackDepth:任务堆栈,内核在创建任务时将其分配给任务。该值指定堆栈可以容纳的字数,而不是字节数。例如,如果堆栈为32位宽,并且usStackDepth作为100传入,那么将在RAM中分配400字节的堆栈空间(100 * 4字节)。合理使用此项,因为Arduino Uno只有2KB的RAM。
  • pvParameters:任务输入参数(可以为NULL)。
  • uxPriority:任务优先级(0是最低优先级)。
  • pxCreatedTask:可用于向正在创建的任务传递句柄。然后,可以使用此句柄在API调用中引用任务,例如,更改任务优先级或删除任务(可以为NULL)。

本次实验创建两个串口打印任务:

xTaskCreate(TaskPrint1, "Print1", 128, NULL, 1, NULL);
xTaskCreate(TaskPrint2, "Print2", 128, NULL, 2, NULL);

其中任务2有更高的优先级,会首先执行。

创建任务后,使用**vTaskStartScheduler()**函数启动任务调度。

创建任务实现函数。一般结构如下:

void task(void *param)
{while(1){....//需要执行的代码}
}

大多数代码都需要延迟函数来停止正在运行的任务,但是在RTOS中,不建议使用**Delay()**函数,因为它会停止CPU,因此RTOS也将停止工作。因此,FreeRTOS具有内核API,可以在特定时间内阻止任务:

vTaskDelay(const TickType_t xTicksToDelay)

例如延时1秒:

vTaskDelay(1000 / portTICK_PERIOD_MS)

其中portTICK_PERIOD_MS与实际MCU的时钟频率相关。

3. 本实验代码如下,拷贝编译下载。

#include <Arduino_FreeRTOS.h>void TaskPrint1(void *param); //声明打印任务1
void TaskPrint2(void *param); //声明打印任务2void setup() {Serial.begin(9600);while (!Serial);//等待串口连接后执行xTaskCreate(TaskPrint1, "Print1", 128, NULL, 1, NULL); //创建任务1xTaskCreate(TaskPrint2, "Print2", 128, NULL, 2, NULL); //创建任务2vTaskStartScheduler(); //启动任务调度
}void TaskPrint1(void *param)
{while (1){Serial.println("TaskPrint1...");vTaskDelay(1000 / portTICK_PERIOD_MS ); // 等待1秒}
}void TaskPrint2(void *param)
{while (1){Serial.println("TaskPrint2...");vTaskDelay(2000 / portTICK_PERIOD_MS ); // 等待2秒}
}void loop() {}

4. 实验现象

打开串口监视器,波特兰设置与程序中一致的9600,会看到任务2先运行打印,由于任务1等待1秒,任务2等待2秒,所以每次打印任务1两次,打印任务2一次。


关注公众号「TonyCode」,回复「1024」获取1000G学习资料。
个人博客

Arduino运行FreeRTOS操作系统相关推荐

  1. 【arduino】在Arduino上运行FreeRTOS操作系统,freeRTOS入门教程helloword

    关注.星标公众号,不错过精彩内容 编辑:Tony 来源:公众号TonyCode 我们从一开始接触Arduino编程就知道,Arduino程序结构由setup()和loop()两部分组成,我们需要反复执 ...

  2. Arduino UNO跑FreeRTOS操作系统

    实验室翻到一个小开发板--Arduino UNO,学了两天,有点意思哈!比stm32简洁,直接.使用前没那么多配置,也是跑c/c++的,这么简单,以后用到再玩玩吧 参考资料: Arduino运行Fre ...

  3. 从零入门 FreeRTOS 操作系统之任务调度器

    从零入门 FreeRTOS 操作系统之任务调度器 1 任务调度器的概念 FreeRTOS 中提供的任务调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是 ...

  4. 从零入门 FreeRTOS 操作系统之任务的概念

    从零入门 FreeRTOS 操作系统之任务的概念 从系统的角度看,任务是竞争系统资源的最小运行单元.FreeRTOS 是一个支持多任务的操作系统.在 FreeRTOS 中,任务可以使用或等待 CPU. ...

  5. 从零入门 FreeRTOS 操作系统之创建任务流程

    从零入门 FreeRTOS 操作系统之创建任务 1 启动方式 在 main() 函数中将硬件和 RTOS 系统先初始化好,在主函数内部创建一个启动任务后就启动调度器,然后在启动任务里面创建各种应用任务 ...

  6. STC8H运行smallRTOS51操作系统(1)

    最近做一个小项目,功能稍显复杂,由于以前做STM32的项目用了freeRTOS比较多,体验到了用操作系统的便捷性.因此用STC8H单片机时,不太愿意跑裸机了,于是乎就考虑在51单片机上运行一个小型操作 ...

  7. 【如何将Arduino与机器人操作系统(ROS)一起使用】

    [如何将Arduino与机器人操作系统(ROS)一起使用] 1. 简介 2. 什么是 ROS? 3. ROS和Arduino之间的通信 4. 设置基础结构 4.1 软件设置 4.1 硬件设置 4.3 ...

  8. 华为智慧屏 鸿蒙如何,华为智慧屏V55i配置怎么样 参数介绍运行鸿蒙操作系统

    4月8日,华为举行了春季新品发布会,除了发布华为p40系列手机之外,还发布了华为智慧屏,关于华为智慧屏V55i的配置参数一起来了解一下吧. 顾名思义,V55i设计为55英寸,4K分辨率,覆盖90% D ...

  9. 从零入门 FreeRTOS操作系统之信号量

    从零入门 FreeRTOS操作系统之信号量 1 信号量的基本概念 信号量 (Semaphore) 是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访 ...

最新文章

  1. HTTP 各版本特点与区别
  2. EasyUI中分页的简单使用
  3. 两个年月日怎么相减_会议记录应该怎么记?看这里
  4. git 改了一段代码不想要了_初识Git
  5. 各类环境渗透测试简述
  6. Master PDF editor在ubuntu下面的配置
  7. ABAP--关于ABAP流程处理的一些命令的说明(stop,exit,return,check,reject)
  8. 禁用当前的账户win7_系统小技巧:服务客人 开启Windows 10来宾账户
  9. 动态数组的各种操作 0104 c#
  10. MySql 实现Row_Number(Partition by)分组函数效果
  11. Day 1: Introduction to Deep Learning
  12. 文件转换base64流
  13. 豆瓣9.6分,Scala编程圣经第5版隆重来袭
  14. db2 sqlcode常见及不常见
  15. 圣思园java笔记_最详细JAVA高并发多线程VIP课程--圣思园--笔记
  16. Hugging Face:成为机器学习界的“GitHub”
  17. pwnable.kr 第一题fd
  18. VMware下的Ubuntu安装jink进行调试
  19. 汉洛塔问题(c解决)
  20. 五 . css系列之文本段落属性及应用

热门文章

  1. 社交舞 - 简介,释名,风格,舞步 - 金山词霸汉语 - HAPPY Life
  2. GeoLite2/GeoIP2---简单的ip地址定位
  3. 微信6.5.10版 android,安卓版微信6.5.10版发布:这些新功能你都知道么?
  4. 【rustdesk】windows安装vcpkg及配置, rustdesk 客户端依赖库安装
  5. 网吧用的语音呼叫软件
  6. PAT乙级2021秋季复盘
  7. 使用GoogleChrome+JS代码批量删除QQ空间说说
  8. 实验四 MIPS寄存器文件设计 Logisim
  9. Xshell远程登录本地虚拟机(保姆级教学)
  10. SEO新人如何做网站诊断和策划