FreeRTOS学习之路,以STM32F103C8T6为实验MCU(序章——浅谈单片机以及FreeRTOS)

news/2024/10/30 13:34:03/

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。

注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;

视频会发布在bilibili(UID:399951374)

作者的话:

        相信大家在学习完STM32的裸机开发后,满怀信心地去写一个庞大的项目的时,写到后期总会感觉,各个模块的任务总是会相互制约和影响,存在绝对的先后顺序关系(也称为轮询方法),即使在系统中以中断优先应对突发任务(前后台模式)也不是办法,一来是中断内的程序不能太复杂,最后只标志事件然后再主函数重新运行;二来是频繁进中断也不是办法吧。

        这里举一个例子:我给单片机设置了

  • (1) 一个每三秒需要通过MQTT协议将传感器收集到的温湿度数据上传到服务器的任务
  • (2) 此为我还设置了系统需要通过光度传感器监测光强阈值控制灯的开关
  • (3) 设置OLED屏幕实时显示时钟。
  • (4) 控制LED呼吸灯,每5s执行一次翻转操作

        那我在编写程序的时候就会遇到许多问题:

  • 上述第一个和第二个任务应该写在中断还是挂起标志位再在轮询主函数中执行呢?
  • 假设在中断中,那中断的执行事件会不会太复杂
  • 假设在任务中,当任务多起来,每次单片机需要完整执行一次轮询周期太长,会不会导致数据传输的实时性得到损失甚至导致数据丢包
  • 当我们使用delay等待函数的时候是不是会导致系统“没事干”导致CPU资源白白浪费掉了

        因此我们开始学习尝试了解以操作系统去解决上述的问题。那么我们应该移植什么操作系统呢?通过了解STM32F103适配的主流系统有μC/OS-II、eCos、FreeRTOS、都江堰操作系统等操作系统。而其中FreeRTOS以开源、免费而著名,所以我们在学习单片机就自然而然地FreeRTOS作为首选了。

        好了,跟大家卖了这么久关子,也不好再吊着大家了,接下来我就是直入主题了!!!

什么是操作系统?

        这里相信很多教程都讲过了,但是这里我想和大家聊聊我的看法!

        首先我们要先知道操作系统的主体是谁,操作系统是为谁服务的?操作系统的服务受众群体从始至终都只有一个,那就是单片机。

        对于单片机是什么,我这里分享一个我个人很喜欢的理解模式,(以STM32F103为例)我们把单片机比作一个人,那他的内核就是他的小脑瓜;晶振就是他的心跳;外设就是他的五感,SRAM和FLASH就是他的记忆系统,总线协议就是他的血管,那这样是不是就可以将单片机转化成一个活生生的人了呢。

        既然都把他比作一个人了,那我们不妨把单片机的各个运行模式转化为一个人思维方式进阶。首先裸机开发模式,就是这个孩童的阶段,这个时候单片机还不懂怎么合理分配自己的时间:只知道到了早上要先刷牙,然后洗脸,最后再吃早饭,但是针对突发情况,比如今天天牙膏没了那咋办?单片机就不会处理了,就傻傻地站在洗漱池前等刷牙,等牙膏来了(轮询模式);

然后就是前后台系统模式了,等你年纪再大点,步入了幼年时期,可以听得懂父母的话,在上述处理事情的模式上,又学会了听爸爸妈妈的话,当父母喊你去做什么事情的时候,你总会乐呵呵地抛下手里的所有事情去听爸爸妈妈喊你知道你一会要去做什么(中断),然后再先把爸爸妈妈安排的工作插入上述的轮询进程任务中,到时间了再处理得当(主程序执行事件)。这样要是妈妈说她马上要出门了,喊你帮忙拿车钥匙,你还傻傻地先刷牙洗脸吃早餐再给妈妈送过去,估计妈妈得气死。

最后就到了多任务系统了,单片机度过稚嫩的幼年时期,到了青年时期有了属于自己的一套做人方式和行为准则,当然青年时期属于叛逆时期,不同单片机的发展差异就在于他解除了什么学习了什么(而这里我把这件事称为移植了什么系统),而我们就单独将学会了FreeRTOS的单片机小朋友提出来举例了,这位小朋友他就学会了:

  • 把要做的事情都分成一个个任务,然后重要的事情先做(任务调度器按任务优先级调度)。
  • 在别的任务等待的时候可以做别的事情,比如你在煲热水,等水沸腾的时候就可以做别的事情啦。(任务调度器任务切换)
  • 合理运用自己的记忆力(heap_4内存分配)
  • ......

        当然上述说到的三个阶段,都是基于单片机是人的基础实现的,赋予了他思考的能力。相信大家都知道,人类之所以区别于野兽,是在于其能思考的能力,而思考的依托就是我们发达的大脑,这是由我们的基因决定的。就像单片机为什么可以被赋予操作系统(思考能力)呢?其决定性因素就在于其的一个根本内核——ARM内核,以STM32F103C8T6为例,其内核为cortex-M3,他的这个内核就是他的遗传下来的大脑,从本质来讲是他的这个大脑支持他思考,所以操作系统的诞生不是ARM的一个发展产物,而是ARM的一个原生产物。其实在cortex-M3,M4内核中,也早就为接收操作系统预留了一系列的配置,而不同的操作系统,只是单片机在发展过程中遇到的不同的事发生的转变。

        可能有点绕,所以我就喜欢用一个很有深度的话来解析:决定一个人的由两个因素,一个是他的基因,一个是他的经历。单片机同样如此,决定其本质的是他的出厂硬件(内核和外设),而决定其思考方式的,就是他的一个操作系统了。

  • 我们无法决定我们的基因,但是其实我们的基因赋予了可以思考的能力,我们可以通过不同思考方式,在基因固定的情况下,达到更高的成就。
  • 单片机同样无法决定他的内核,外设等硬件,但是其实单片机的内核赋予了其可以移植操作系统的能力,其同样可以通过移植不同的操作系统,在硬件固定的情况下,实现更多的功能以及减少更多的功耗。

 相信聊到这里,大家大概了就了解了单片机和操作系统的关系了,操作系统就是单片机的思考和处理事情的方式,可能网上很多都有介绍Linux操作系统、FreeRTOS操作系统,但是相信大家看完这么多介绍都是似懂非懂的。在我看来,操作系统的定义应该泛定义到单片机的执行事件的一个模式,无论是裸机还是前后端,多任务都是一个完整的操作系统(这里是作者个人臆想的,要是错了欢迎指正)。

学习之路安排

        这条学习之路会以STMF103C8T6为MCU,在上面移植FreeRTOS操作系统,并且逐层解析FreeRTOS实时操作系统。最终希望都可以掌握FreeRTOS实时操作系统,并且可以以此为基础做出来很多实战项目。

寄望与自勉

很喜欢那句话,种一颗树最好的时间是10年前,其次就是今天!愿今日的你成就明日的你。就像我个人博客主页写的那句话一样:

你终将成为你想成为的人
愿你在通往成功的路上
不再孤身一人

本文为作者独立编写,本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。


http://www.ppmy.cn/news/78495.html

相关文章

kubelet源码分析 添加 /删除pod (SyncPod、SyncTerminatingPod、SyncTerminatedPod)篇

kubelet源码分析 添加 /删除pod (SyncPod、SyncTerminatingPod、SyncTerminatedPod) kubelet版本v1.27.1 前面讲过删除pod和添加pod,都是在kubelet文件的的HandlePodAdditions函数和pod_workers.go文件中主要流程。 这篇文章是当pod_workers.go流程结束后&#xf…

智慧档案馆一体化监控系统设计所需要的10条依据

1.科学性 本项目目标定位为:以科学技术为基础,依靠先进的设备和优越的设计理念、科学客观的管理,利用信息化管理及相关最新技术,将库房实际环境与存储技术、计算机技术、无线自动控制技术、通讯与信息处理技术等先进技术相结合&a…

论文阅读_语音合成_Spear-TTS

论文信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: Speak, Read and Prompt: High-Fidelity Text-to-Speech with Minimal Supervision name_ch: 说话、阅读和提示:少量监督实现高保真文本转语音 paper_addr: http://arxiv.org/abs/2302.0354…

Vue3 權限路由

最近接觸到關於role 能夠查看相關頁面的功能 最初的作法是全部的路由使用動態加載,考慮到 跟權限有關係 ,就有可能各種頁面都需要調用,因此這裡的role狀態會儲存在全局狀態管理中(pinia) 1.首先區隔出需要權限才能瀏覽…

性能优化常用的技巧,你都知道吗?

在实际工作中,提升MySQL数据库的查询性能是非常重要的。除了基本的索引和查询优化技巧外,还有一些更深层次的优化方案可以进一步优化性能。 1. 数据库表设计优化 选择字段类型: 根据数据类型和范围,选择适当的字段类型。例如&am…

SFM过程(一)

以图像为基础的三维重建过程SFM基本如下图所示&#xff1a; 以SfM-Toy-Library代码为例&#xff0c;如下&#xff1a; ErrorCode SfM::runSfM() {if (mImages.size() < 0) {cerr << "No images to work on." << endl;return ErrorCode::ERROR;}//in…

基于低代码平台的多租户解决方案

在云计算时代&#xff0c;“多租户”是一个非常重要的概念。根据百度百科中的定义&#xff0c;多租户技术是一种软件架构技术&#xff0c;简单来说是指以单一系统架构与服务提供多数客户端相同甚至可定制化的服务&#xff0c;并且仍然可以保障客户的数据在多租户环境中&#xf…

C Primer Plus第三章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.通过试验&#xff08;即编写带有此类…