IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FREERTOS任务的理解(一) -> 正文阅读

[嵌入式]FREERTOS任务的理解(一)

FREERTOS任务的理解(一)

以我自己个人的经历来说,我也是从单片机过来的(也非科班出身),一开始接触这个freertos感觉特别抽象,很难理解,所以我希望写一篇文章来解释清楚,同时也做个记录。在正式的代码分析之前,先写一些帮助理解的东西。

我们知道任务是一个无限循环的函数。我们先思考如何从一个函数切换到另一个函数。

如何切换呢?

我相信大家肯定在编写c语言时都用过函数调用,这个非常简单对吧。比如

int  main()
{
    func();
    return 0;
}

这样就从一个主函数跳到另一个函数,但是这背后做了哪些事情呢?

实现上述步骤,最关键的部分是什么呢?我们知道函数在编译后,函数实际上是一段连续的空间,来存放指令,函数名呢就是这段空间的起始地址。两个函数实现跳转,最核心的就是使PC指针指向新的函数名

我不知道上述大家能理解多少,需要有点微机原理的一些知识。好我们说完最核心的东西了,但是仅仅只有完成PC指针的转换,行不行呢?答案肯定是不行的。

我们正常的函数调用还会传递参数对不对?

int  main()
{
    func(1,2);
    return 0;
}

函数是如何传递参数的呢,是通过来实现参数的传递。

这里我先调用一张我写过文章的图片,让大家知道,这里就不解释了。

image-20211130142549864

通过上面知道,原来是一种叫栈的东西来帮助我们实现函数的调用,对吧。接下来重点来了,大佬前辈们设计任务的(或者叫线程)初衷我觉得是将一个程序分成若干个互不干扰的模块,然后让这些互不干扰的模块能按照某种机制运行起来。

那么在A任务中,有自己的调用,在B任务中也有自己的调用。那么为了实现他们自己的调用,就需要有一个自己的栈,那么任务切换时就需要切换栈。假设是位于同一个栈呢,那就跟普通的函数调用一样了,就不是那种互相隔离的感觉了。我不知道这么写能不能传达我想表达的意思。

所以说每个任务都有自己的栈,在任务切换时,不仅要切换PC指针,还要切换栈。

好,到这里我们知道任务切换需要切换指针,需要切换栈。具体如何切换呢?到具体代码时会讲解。

再以单片机的角度讲一个知识点。我们考虑一个中断的过程。一个中断我们需要配置寄存器,配置完了之后,我们在中断服务函数中写代码,然后中断触发时,就会中断当前的程序,去跑去执行中断服务函数。

这个过程大家都很熟悉。我相信很多学过微机原理的朋友知道,进入中断后不是有保护现场(PUSH)与恢复现场(POP)吗,但是以stm32为例,在中断服务函数中是没有这个过程的。

现场保护不严谨的说,就说保存内部的寄存器的状态。恢复就是,恢复寄存器的状态

但是实际上是有这个过程的,只不过这个过程是由硬件来帮助你实现的,比如在中断发生时,硬件会帮你保护现场,保存放回地址之类的,然后结束时,恢复现场,弹出返回地址到PC中,

说了这么多,想说明什么呢?

就是说从当前服务程序(一个过程),跳到中断(另一个过程),需要现场保护之类的。那为什么普通的C函数调用不需要保护现场呢,只需要保存返回地址,因为普通的函数调用它与被调用函数属于同一个过程,他们就不需要保护现场与恢复现场

而我们的目的是什么?是实现两个互相隔离任务的切换。所以说我们在任务切换的时候,需要进行现场保护。当然也需要恢复了。

总结

到这里我们知道了,我们要实现一个任务的切换,就需要切换PC指针,还要切换栈,在切换栈的同时需要进行现场保护与恢复之类的。

如果说能理解我所写的这些内容,我相信会进一步的理解源代码。

后续会解析源代码,当然我也是参考了大佬门的东西,然后用自己语言与理解来描述。奥利给!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:52:21  更:2021-12-01 17:53:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:33:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码