FreeRTOS 入门知识

1. 裸机与 RTOS 介绍

像 STM32 的一些基础例程,跑马灯、蜂鸣器、LCD 等,这些都是运行的裸机,那就是不带任何操作系统的。

还有就是我们的 RTOS,那 RTOS 它究竟是什么?它其实就是一个 Real-time OS,也就是实时操作系统。

那这两个之间有什么区别呢?我们这里给大家举一个比较形象的一个例子,来让大家来感知一下,裸机供的 RTOS 究竟是有哪一些区别。我们假设呢,有一个人叫小明,他比较喜欢打游戏,那么就一直在打游戏;那么打游戏的过程中,突然他女朋友给他发了一条信息,那此时呢他怎样,他在打游戏啊,他不能及时回复信息;那他女朋友肯定就生气了,说你不及时回复我信息,那小明就遭殃了。

那这部分的一个代码在我们的一个程序中,我们是如何实现呢,在裸机上的话,如何实现?我们是不是就是在一个 main 函数里面,有一个 while 循环,在 while 循环这里面啊,我们首先先编写一个打游戏这么一个程序,接着再编写一个回复信息的这么一个程序。

while (1) {
	打游戏();
	回复信息();
}

那大家发现没有。在这里的话,我是如何执行的呀,我首先得打完游戏,我才能执行到这个回复信息。那这里假设如果打完游戏需要花半个钟头,那此时呢你得执行完半个钟之后,我才能得到回复信息,是不是让你女朋友都等着着急了对吧,那她一急她就要找你茬,一找你茬那你就遭殃了。所以说呢这是裸机的一个处理方式,他呢必须要打完游戏之后才能回复信息,回复完信息之后才能打游戏,就这么以此类推。

那如果是 RTOS 它是怎么处理的,那我们来看一下 RTOS 它的一个处理方式。他呢首先会创建两个任务,一个是打游戏任务,一个是回复信息任务。

void main(void) {
	/* 创建打游戏任务 */
	xTaskCreate(打游戏);
	/* 创建回复信息任务 */
	xTaskCreate(回复信息);
}

那这里啊,他专门一个游戏任务,在游戏任务里面就专门打游戏;在这个回复信息里面呢就专门回复信息。

void 游戏(void) {
	while(1) {
		打游戏();
	}
}
void 信息(void) {
	while(1) {
		回复信息();
	}
}

就这么两个任务,那他是如何运行的呢?他呢就不像我们这个裸机了,裸机他呢一定要等到他打完游戏才能回复信息,或者说回复完信息才能打游戏;他就不是了,他呢会执行什么?打游戏,一个时间片啊,那一个时间片的大小呢是可以我们设置的,也就是滴答定时器的一个时钟节拍,那在我们代码上的话,我们设置 1ms 中断一次,就是说一个时间片,就是 1ms。那这里啊大家发现我们这里是这样执行的:打游戏呢我打 1ms,然后呢马上切换到回复信息,回复信息,也执行 1ms;然后接着呢又切换回到游戏 1ms,接着又切换到回复信息 1ms;就这样来换切换切换切换,但是呢这个切换的速度非常快对吧,我执行 1ms 的打游戏,那就执行 1ms 的回复信息,那执行完之后又执行 1ms 打游戏,就这样。这样从宏观上来看,我们人类啊是发现不出它有个切换的一个效果;我们只发现出,它类似于在同时进行一样,那这个呢其实就是 RTOS 它的一个作用了,大家这里应该能比较直观的感受到他们的一个区别。

然后呢我们这里还有一个前提,就是游戏跟信息呢,他两的一个任务优先级呢它是相同的,那这个比较重要,是相同的。所以呢他才能打一会游戏,然后回复一下信息,回复一下信息然后打一会儿游戏,就这样来回切换。

所以呢我们接着再来看一下裸机以及 RTOS 呢,他这样的一个运行方式,会给我们带来怎么的一个感受。

那首先呢我们先来介绍一下裸机,裸机呢我们都知道他是打完游戏之后,那么才会回复信息;然后呢你回复完信息之后,你才能继续打游戏,就这么一个过程。那对于打游戏以及他女朋友来说,那他们是如何的一个感受啊,来看一下,首先呢在你打游戏的时候,那他女朋友肯定觉得你是不理我的,你打游戏打了半个钟,那你就不理我不理了半个钟;然后呢,打完之后,那此时游戏就挂机状态了,那接着呢就要回复我信息了对吧,那他女朋友呢就知道,你在回我消息;那回完之后,他又继续消失了半个钟去打游戏了,又不给我半个钟;然后呢打完游戏又挂机,又来回我。那这样对他女朋友来说怎样的感受,你又理我,一会又隔那么久又不理我,所以他女朋友就得找他茬。

那如果是 RTOS 呢?又怎么的,他插了一个时间轴,时间轴里每个单元格就是一个时间片,那我们说了,在我们代码上呢一个芯片的大小就是 1ms,所以呢在这里他是 1ms 打游戏 1ms 回复信息 1ms 打游戏 1ms 回复信息;虽然呢他也是同一个时刻,我只能做一件事,但是他因为间隔的一个时间太短了,那从人的宏观意义上来看的话,我们是看不出他有敷衍我,或者说啊有没回我信息啊,这样的一个效果的;从计算机的意义上来说,他是感知到了,你呢同一个时刻你只做了一件事,但对他女朋友来说就不是了,你呢一直回我信息,你没有敷衍我,那我就不会生气了,我也不会找你茬了。

所以呢,我们可以从这里就看出了 RTOS 和 裸机,它之间的一个区别了。从实时性来看,RTOS 是更高一筹。

那么接着呢再假设这么一个场景。同样的小明呢还是在打游戏,然后呢还是在回复信息,但是呢此时小明的肚子疼了,那这个就优先级比较高了,那此时呢他就得去医院。那裸机和 RTOS 它是怎么处理的。

那大家想象一下,在裸机上的话,他怎样的?你呢又打游戏又回复信息,现在呢突然肚子疼了,那肚子疼得优先级肯定要高一点,那么在逻辑上可以定义一个中断,你肚子疼我就触发中断,但是大家要注意了,中断呢是一瞬间的事情,也就是说你在中断服务函数里面,你不能做太多的事,你如果你比如说我在中断服务函数里面,搞一个 Delay 个 1s,那可以想象,那这程序肯定是会出一些毛病的,肯定是会出问题的,就是啊,所以说呢中断服务函数它是一瞬间的事情,他呢不能在里面处理太多的事情对吧,把我去医院这个过程啊,我又要坐车,我又要挂号,我又要看病,这里面操作非常非常多,那怎么办,那裸机上怎么实现啊?也很简单,就在中断服务函数里面呢,我们定义一个标志位,只要你一肚子疼,就触发这个标志位;然后呢我们把事件处理放在 main 函数里的 while 循环里面。

while(1) {
	打游戏();
	回复信息();
	if (FLAG == 1) {
		去医院();
		FLAG = 0;
	}
}

同样的这里是打游戏,这里是回复信息,那这时候呢他会判断 FLAG 是不是等于 1。那我们中断,比如说你一肚子疼,马上触发中断,在中断服务函数里面呢,马上把 FLAG 置 1,那这时候呢我们在 while 循环里面,判断 FLAG 是 1 了,马上就去医院。但大家发现没有,如果我此时还在打游戏,那我打半个钟,我现在才打了,比如我打了十分钟,我还有 20 分钟呢,那我下面是不是得不到执行啊,而且这样我得等你打完游戏,执行完回复信息,我才来判断这个 FLAG。那我高优先级的这个肚子疼反而得不到执行,得等你前面执行完了,我才能执行去医院,那这个时候咱们裸机的弊端就很明显了,是不是实时性就比较差了。

那 RTOS 它又是如何处理的,它呢就会创建 3 个任务。那有两个就是跟我们前面一样的,打游戏回复信息,然后呢另外创建一个去医院的一个任务,那这个任务呢他的任务优先级会更高,比上两个高。

void main(void) {
	/* 创建打游戏任务 */
	xTaskCreate(打游戏);
	/* 创建回复信息任务 */
	xTaskCreate(回复信息);
	/* 创建去医院任务 */
	xTaskCreate(去医院);
}
void 游戏(void) {
	while(1) {
		打游戏();
	}
}
void 信息(void) {
	while(1) {
		回复信息();
	}
}

然后呢我们这两个就是一摸一样的。然后呢还有一个更高优先级的任务,就是去医院了。

void 去医院(void) {
	while(1) {
		去医院();
	}
}

那此时呢只要你一肚子疼,我立马就去医院,我打游戏和回复信息呢就不执行,我只去医院。那这时候呢我们来想象一下,此时呢我去了医院,所以呢我得到了解决了,但是呢我们去医院的途中,我们是坐车的,那坐车这个过程呢,我们是什么事都没有了,所以呢我们去医院的过程中,我们有一个延时,就等你把车开到医院之后,我们再继续挂号,看病,所以此时呢在 RTOS 当中它有一个系统延时,那在高优先级这个任务呢它在延时的过程中呢,我们的低优先级它是可以执行的,就是说它不是死等,它就是说我只要不死我就不休,此时呢高优先级任务在延时,那么此时呢就把 CPU 的使用权给让出来,给低优先级的去执行,那此时呢我又能打游戏了,我又能回复信息了。那这个呢就是我们的 RTOS,他呢是充分利用 CPU 的一个资源的。

那如果你是裸机就不是了,而裸机的话,你去医院,你在坐车的过程中,你没事干,我加一个 Delay,那等着 Delay 完,然后呢你继续去挂号,然后去看病。裸机的 Delay 过程呢完全是死等的,就是这样一个区别了。

2. 裸机和 RTOS 特点

那我们接着呢就来看一下裸机以及 RTOS,它们各自有哪些特点呢?

那么首先来看一下裸机。

2.1 裸机

裸机又称为前后台系统,前台系统指的是中断服务函数,后端系统指的大循环,也就是我们 main 里面的 while(1),即应用程序。
在这里插入图片描述
那用图来表示就是这样,左边就是我们的大循环,那么称为后台系统。然后呢中断就是我们的前台了,中断和中断之间呢用嵌套;我们主循环被中断打断,然后呢有更高优先级的中断来打断中断,这种我们叫中断嵌套,那这些都属于我们的前台。

然后呢,我们从刚刚前面的那个介绍呢,我们应该就能多多少少知道裸机的一些特点:

  1. 实时性差。(应用程序)轮流执行

去医院的例子就比较明显了,很直观了。它的程序呢因为是轮流执行的,当我直接在打游戏的时候,那我必须等你执行完之后,我才能执行到下面的去医院。

  1. Delay。空等待,CPU 不执行其他代码

我们刚才也介绍到了。你搭车去医院的过程中,你是什么事都没事干了,这里呢裸机的话就空等待了,啥都不干,就等,CPU 不执行其他代码。

  1. 结构臃肿。实现功能都放在无限循环

为什么这么说,大家看一下这个大循环,就是我们的外循环,我们是把所有的一些应用程序的功能呢,都给丢到这个无限循环里面,是不是有什么去医院、什么打游戏、什么回复信息,我都往里面塞,我根本就不进行分类,我更高优先级的东西我全部往里面塞了,这时候呢你一些小型的项目啊,可能还没那么臃肿,比如一些大型的项目呢,你还这样塞得话,那整个看着就很混乱了,就很不适合在一些大型项目上使用一些裸机这些东西了,对吧。

那如果是 RTOS 呢。

2.2 RTOS

那 RTOS 呢它的一个特点:RTOS 全称为:Real Time OS,就是实时操作系统,强调的是:实时性(比较好)。

在这里插入图片描述
然后呢这是它的框图了。我们来看一下,首先呢它有三个任务,低优先级,还有高优先级以及更高优先级的任务了。低优先级任务在运行的过程中,它可以被高优先级的任务打断,那高优先级的任务在运行过程中,它可以被更高优先级的任务打断,那更高优先级任务呢,它可以被中断给打断。然后呢我们还发现,每一个任务呢它各自都是一个无限循环,他就不像我们的一个裸机了,它是在一个外循环里面把东西给塞进去,这个不是啊,这每个任务呢它都是单独的、独立的、互不影响的,每个任务都有自己的一个无限循环。

好,那我们来总结一下他有哪些特点:

  1. 分而治之。实现功能划分为多个任务

每一个功能他都单独划分,就不像我们的一个裸机了,我全部往里面塞,搞得很臃肿,就逻辑性很不好,那这个的话就不会了。每一个功能实现不一样的,我划分一个任务,那这个功能实现不一样,我划分另外一个任务,打游戏就打游戏,回复信息就回复信息,去医院那就去医院了。

  1. 延时函数。任务调度

它的一个延时呢,它不是空等代码,它是让出当前这个任务的一个 CPU 使用权,然后给比低他优先级的那些任务去执行,比如说我这里更高优先级任务是是去医院,此时呢我遇到了一个延时函数,那此时呢我就让出 CPU 的使用权了给高优先级任务,然后这个高优先级任务,如果你就绪的话,你就去执行高优先级任务,然后呢,等这个延时时间到了之后呢,我更高优先级这个任务啊,它这个延时时间到了,他立马就会回到更高优先级任务去执行。所以呢我们是充分地利用了 CPU 的一个资源了,反正你就要不停工作就对了,我不让你 CPU 休息。
像我们的 FreeRTOS 的话,它是会创建一个空闲任务的,空闲任务是干嘛的,就你 CPU 没事干的时候,你来做这件事情,这叫空闲任务。你就是任何时候你都不能真正的闲下来,你真的闲下来的时候,你就去做我这个空闲任务去执行它。所以呢在 RTOS 中 CPU 它是没得休息的。

  1. 抢占式。高优先级任务抢占低优先级任务

那这个呢我们前面说了低优先级任务呢,它可以被高优先级的抢占,高优先级任务呢,它可以被更高优先级的任务给抢占执行,也就是我们这里说的高优先级任务,它可以抢占低优先级任务的一个执行。

  1. 任务堆栈。每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息,用于恢复以及保存现场的

那么每一个任务呢我们都是有单独的栈空间的,那这个栈空间有什么用啊?大家想象一下,比如说我上面这个低优先级任务,我这里运行的 a = a + b 啊,然后下面这个低优先级任务这里 a = a + c,这里的 a 是局部变量,a、b、c 都是,然后呢我被高优先级的任务给打断了,那我高优先级的任务执行完之后,我又得回来这里低优先级,那此时呢我是从头开始运行,还是从被打断的点开始运行呢。那想象一下,打断之后,我是从你这个打断点开始运行下去,还是从头开始运行,很明显嘛,如果你是从头开始运行的话,那你这个 OS 就没有任何意义了,你每一次被打断了,你又得从头开始,那你下面就不用执行了,这样的 os 是没意义的;他肯定呢是从你打断的这个点继续执行下去的,所以呢这时候你就需要任务堆栈来保存你被打断这个点的它的一个寄存器,它的一个值以及一些局部变量这些,我得把你这些值给保存下来,那这个保存下来的一个地址呢,就是它的一个任务堆栈,我们分配给他的一个任务堆栈了,然后呢我们就执行高优先级任务了,执行完之后,我们就把刚刚任务堆栈那些值又给恢复到它的寄存器里面,这时候他才能从这个断点这个位置继续执行下去,那这个呢就是任务堆栈的一个作用了啊,也是非常重要的一个点。

然后呢,我们这里有个问题:如果高优先级的任务一直在运行,会怎么样?
就比如说我这图中的三个任务,黄色是最高优先级的,那我这个最高优先级的任务我一直在运行中,那你这其他两个任务怎么办。那怎么办,大家想一下,我们说过,RTOS 它实质呢也是同一时刻只执行一件事,如果我高优先级的任务一直在运行的话,那我两个低优先级的任务是不可能去抢占高优先级的,所以呢此时高优先级会一直运行,使得低优先级的他们无法执行。除非我高优先级的任务进入了阻塞态,就是说我给高优先级的任务一个延时,你只要延时时候,此时你才能运行这些低优先级的;或者说高优先级的任务在等待一个信号量或等待一个互斥量,高优先级的任务这时候也会进入一个阻塞态,这时候他才会让出 CPU 的使用权,这时候你下面一个低优先级的一个任务,只要就绪了,你马上就可以去执行,那这个呢就是这个问题的一个解答。

然后呢,我们这里要注意一下,就是说:中断是可以打断任意任务的。大家注意了啊,中断的优先级跟任务的优先级不是一个概念,任务的优先级呢其实纯软件的,是我们自己实现的,从软件意义上去实现了;而这个中断优先级呢是内核的,就跟我们这个没关系的,中断优先级呢它是可以打断我们的任意任务的。这里要注意,你越高优先级了,我一样可以被打断,你低优先级了,我同样的也可以被中断打断,这是要注意的一个点。

还有一个点,就是:任务可以同等优先级。像我们的打游戏,还有回复信息,那么这两个它怎样,它就是同等优先级的,那这个呢是需要注意的两个点了。它们之间切换呢就是时间片轮转,执行一个时间片,我就切换到另外一个任务,然后这个任务执行一个时间片又切换到另外一个任务,那这个是 FreeRTOS 里面的一个操作。

那这样的话,我们就把裸机以及 RTOS 都做了一个简单的介绍了。

3. FreeRTOS 简介

我们把 FreeRTOS 分成两部分,这样一看是比较清晰的。Free 直译过来就是自由的免费的,RTOS 我们前面有介绍到就是实时操作系统,所以两个连一起就是一个免费的嵌入式实时操作系统了。它的特点就是免费的。

那我相信大家呢,不管你是做什么产品,你第一个考虑的是什么,其实就是成本,这个 FreeRTOS 它是一个免费的,所以在成本上为 0,非常好这点。但是市面上免费的 os 很多啊,那我为什么要用你啊,要学你啊。因为你不单单只考虑成本,你要考虑什么?考虑它的稳定性,还要考虑它的安全性,以及是不是市场主流啊,这些呢都是你要考虑的点,你做产品必须要考虑的,FreeRTOS 他都包含。为什么这么说啊,我们来看一下这么一个图。
在这里插入图片描述
那大家可以看到这里是 2019 年的一个 RTOS 使用排名了,那这个呢是在国外的一个网站让大家通过投票得出来的这么一个数据了,那我们看到 FreeRTOS 呢,它在第三名的位置,而且呢它占有率有 18%,我们看到这个市场占有率是非常高的对吧,所以说足以证明 RTOS 它是目前的一个主流 RTOS,并且呢它的安全性以及稳定性是得到了很多人的一个认可的,所以说呢我们有必要来学习一下 FreeRTOS 并且相信大家如果有面试过应该都知道很多公司的一个要求呢,他都会写上一项,就是说你要么学会 UCOS 或者学会 FREERTOS,就是你要熟练掌握某一款 os。所以说呢,学习 RTOS 它是一个工作上必不可少的一个技能啊,非常重要。

所以说我们有必要好好的来学习我们的 FreeRTOS。那么说了这么多,我们来看一下 FreeRTOS 它拥有哪些特点。

  1. 免费开源。商业产品中使用,无潜在商业风险,无需担心

那这个就是从成本的意义上来讲。像 19 年之前,我们的 ucos 它还是要收费的,在商用上,所以大家看到它的排名这么后,只占了 4%;但是呢在 2020 年之后,ucos 呢也开始免费了,商用免费也直接内卷起来了。

  1. 可裁剪。FreeRTOS 的核心代码 9000+ 行,包含在 3 个 .c 文件中

就从资源上来讲啊。因为呢你比如说我一个系统 os,我要一个非常好的、run 非常大的一个芯片我才能使用的话,那这个要求就硬件要求是比较高的,对我们成本来说也是比较大的,所以说 FreeRTOS 呢它是一个轻量级的,它是可裁剪的。那这三个 .c 文件呢在我们后面移植 FreeRTOS 的时候才会来介绍,现在只要了解一下就行了。
也就是说它所占的内存是比较小的,如果大家有一些资源比较紧凑的一些 mcu 呢,也是可以移植 FreeRTOS 的。

  1. 简单。简单易用,可移植性非常好

就是你要使用一个东西,你必须要简单一点,我才会很多人去使用;如果你很复杂,谁会去用啊,对不对。因为呢它主要的一个编写都是由 C 语言来进行编写的,所以呢它移植性非常好。

  1. 优先级不限。任务优先级分配没有限制,多任务可同一优先级

那这个是什么意思啊,就比如说你创建了很多个任务,那这些任务呢我们要分配一个任务优先级给他,FreeRTOS 它的任务优先级的分配呢是没有任何限制,多大都可以,但是呢这里有个前提啊,就是说你所使用的执行最高任务的那个优先级算法,如果使用的是软件呢,软件的方法,也就是我们常说的通用方法,此时呢它的优先级呢没有任何限制,你要设置多大都可以。但是如果你使用的是硬件的方法,那这个呢它就受限于你 mcu 的一个架构了,就比如说我们的 stm32,它是 32 位的,所以呢你的优先级啊它就限制在 32,也就是 0~31 这么一个范围,也就是你的优先级最大只能设置到 31,这里呢是数字越大,任务优先级就越高,那跟中断的一个优先级就反过来,像中断的话是你的数值越小,优先级越高,那这个大家要注意。
然后呢,它还有一个特点,就是多任务可同在一个优先级。就比如我们前面所介绍的打游戏和回复信息,我们可以很多个任务呢都在一个优先级内。

  1. 任务不限。可创建的实时任务数量没有软件限制

因为我们可以一个优先级里面挂很多个任务。所以说呢虽然比如说我们用硬件的方法是 32 的优先级限制,但是呢它一个优先级下面可以挂很多任务,其实它就是没有任何的数量限制。但是呢我们要注意啊,我们的每一个任务呢都需要分配任务堆栈给它的,那你任务堆栈是需要你的 mcu 提供内存给它的,那我每建一个任务,我就得给他提供一个任务堆栈,大家想象一下,如果任务一多,我的 mcu 它也承受不了。所以呢在软件上没有限制,但是你说在硬件上有没有限制,实际是有的,取决于你的任务堆栈大小和硬件上的内存。

  1. 抢占/协程/时间片。支持抢占式、协程式以及时间片流转任务调度

这是三大任务调度,都是支持的。那这个呢我们后面在介绍 FreeRTOS 的一个基础知识的时候,会来详细介绍一下这个任务调度的作用,那这里呢大家只要了解一下就可以了。

好,那我们这里啊已经介绍了很多了。

那我们现在要学习 FreeRTOS,最主要的是什么,我们学习一个东西肯定最主要的是它的学习资料。

我们来看一下关于 FreeRTOS 的一个资料呢,这里也做了一个整理。

  1. FreeRTOS 官网:https://www.freertos.org/

那不管大家学什么,你第一个查找的资料,一定是去官网查找的,因为官网它是最权威的,我们一会儿呢也会给大家做一个简单的演示。

  1. 学习资料。分为三大部分:视频资料,教程文档,例程源码。

那么现在呢就来看一下 FreeRTOS 官网的资料有哪一些特点:

  1. 英文。

它的官方网站那些资料都是全英文的。对一些英语不好的读者是不友好的,阅读起来是非常难受的。

  1. 文档较少。

相较于 ucos 来说,ucos 的话,它的中文资料,中文手册非常非常的齐全;而我们的 FreeRTOS 这一块还是比较少的。所以说呢大家要学习 FreeRTOS,一定要结合上面官网和学习资料两部分,这样的话才能更快更好地去掌握 FreeRTOS。

那么说了这么多,我们先来看一下 FreeRTOS 的一个官网资料。那大家可以看到页面几乎全英文,所以说阅读这个没有一点英语基础,其实说实话还是比较困难的。那页面这里简单介绍下,FreeRTOS 它是什么,然后下面为什么要使用 FreeRTOS,这些他都做了一个简单的一个说明,那这里呢就是下载 FreeRTOS 的一个源码,另一边呢就开始来了解 FreeRTOS,我们来看一下,我们点击这个了解更多,那左边就是它的一个导航了,我们看到有 FreeRTOS 它的一个书本,也就是文档,然后呢它的一个核心,然后呢它的一个开发文档、次要文档、还支持什么设备、以及它的 API,一些 API 的一个介绍,然后呢就是它的一个许可。我们来看一下它的一个书籍吧,我们看到它这里确实相较于 ucos 来说少得可怜,那这里它就是一个开发手册、一个参考手册、一个源码,相较于 ucos 来说这点资料确实是有点少。然后呢它还有一些 API 的一个介绍,我们可以点开看一下,那这里呢就是对一些 API 函数的一个介绍了。我们来看一下这个创建任务啊,这里就对一些创建任务的函数、入口参数、任务的作用做了一个详细的一个说明啊,比较建议大家去看这个,英语不好的同学呢,大家也可以去翻译一下,也可以去看一个中文版的 FreeRTOS 开发指南,那这个就是简单的一个介绍。

那么学习 os 之前呢,建议大家一定要去了解一下芯片的一个架构。像 STM32 的话,那大家一定要提前去了解一下 ARM-Cortex-M 这么一个架构了。因为这个跟我们后面要介绍的那个任务切换是密切相关的,所以呢这部分内容大家一定要提前去了解一下,那主要是参考这两个手册:《Cortex M3 权威指南(中文)》《Cortex M3 与 M4 权威指南》,那大家肯定会问:怎么只有 M3,M4,没有 M7啊。其实 Cortex M 呢它这个内核呢基本是差不多的,只不过 M3 和 M4 之间呢有一点区别,什么区别啊?就是支不支持 FPU(浮点单元),像 M3 的话它是不支持的,而 M4 的话它是支持的,所以说它们两个之间的寄存器就是有区别的,所以呢我们这里才列出了两个权威指南。

接下来就来介绍一下学习资料有哪些:

  1. 教程文档。共 430+ 页的详细教程文档,从基础移植,API 函数介绍,到任务创建、队列、信息量……各种功能,几乎都给大家详细的编写它的一个教程。
  2. 程序源码。共 25 个例程源码,将 FreeRTOS 主要功能逐一验证。跟随着我们的文档来的
  3. 视频资料。同样的也是会跟着整个过程给大家录制下去。

总结:

  1. FreeRTOS 基础知识。了解任务调度器,以及 RTOS 的特性,打好基础
  2. FreeRTOS 内核。任务启动流程,中断管理、任务切换……

任务切换要跟芯片的一个架构非常密切相关的,所以呢大家一定要先去读一下《Cortex M3 权威指南(中文)》以及《Cortex M3 与 M4 权威指南》,那这部分一定要先去了解。

  1. FreeRTOS 各功能。列表、队列、信号量、互斥量、内存管理……

总体来说我们整个过程呢就是:循序渐进、由浅入深的学习。

4. 总结

在这里插入图片描述

那这些就是我们的 FreeRTOS 入门的一个总结了。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一款开源、实时操作系统,可以用于嵌入式系统的开发。它被广泛应用于各种嵌入式系统中,如工业控制、汽车电子、医疗设备、家电、安防等领域。FreeRTOS提供了多任务管理、任务调度、内存管理、定时器、队列、信号量等常用的操作系统功能,可以方便地进行多任务开发。 以下是FreeRTOS入门的几个步骤: 1. 下载FreeRTOS源码 访问FreeRTOS官网(https://www.freertos.org/),下载适合自己平台的FreeRTOS源码。 2. 配置FreeRTOS 根据需要,对FreeRTOS进行配置。可以通过修改FreeRTOSConfig.h文件中的配置选项来实现。比如,可以设置任务栈大小、空闲任务的优先级、使用的内存管理器等。 3. 创建任务 在main函数中创建一个或多个任务。任务的创建可以通过xTaskCreate函数来实现。需要指定任务的函数、名称、堆栈大小、优先级等参数。 4. 启动FreeRTOS调度器 调用vTaskStartScheduler函数启动FreeRTOS调度器,开始多任务调度。此时,FreeRTOS会根据任务的优先级和调度算法,按照一定的规则进行任务调度。 5. 编写任务函数 编写任务函数,实现任务的具体功能。任务函数需要满足一定的条件,如不可阻塞、不可返回等。 6. 使用FreeRTOS提供的API实现任务间通信 FreeRTOS提供了多种任务间通信的方式,如队列、信号量、消息等。可以使用这些API来实现任务间的数据交换和同步。 以上是FreeRTOS入门的基本步骤,需要注意的是,FreeRTOS的使用需要一定的C语言和嵌入式系统开发的基础知识。在使用FreeRTOS时,需要仔细阅读官方文档,同时结合实际应用场景进行开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值