【学习日记】【FreeRTOS】手动任务切换详解

前言

本文是关于 FreeRTOS 中实现两个任务轮流切换并执行的代码详解。目前不支持优先级,仅实现两个任务轮流切换。

一、任务的自传

任务从生到死的过程究竟是怎么样的呢?(其实也没死),这个问题一直困扰着我,单纯看野火的讲解有点云里雾里,所有自己捋了一遍嘿嘿:P。

下面这个图描述了任务的创建,调度器的使用以及手动切换任务的过程(这时还没用到优先级进行任务切换)。
在这里插入图片描述

二、任务切换相关函数详解

1. taskYIELD()

  • 其实是一个宏定义,代码如下:
#define taskYIELD()			portYIELD()
  • 用于在任务执行完成后手动调用进行任务切换:
/* 任务 */
void Task1_Entry( void *p_arg )
{for( ;; ){//下面是任务代码/* 任务切换,这里是手动切换 */taskYIELD();}
}

2. portYIELD()

  • 通过设置标志位触发 PendSV 中断
  • 代码如下:
#define portYIELD()																\
{																				\/* 触发PendSV,产生上下文切换 */								                \portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;								\__dsb( portSY_FULL_READ_WRITE );											\__isb( portSY_FULL_READ_WRITE );											\
}
  • 其中标志位定义如下:
#define portNVIC_PENDSVSET_BIT		( 1UL << 28UL )
  • 该标志位定义的根据是
    PM0056Programming manual
    STM32F10xxx Cortex-M3 programming manual
    在这里插入图片描述
    在这里插入图片描述

3. xPortPendSVHandler()

  • 该函数即 PendSVC Handler
  • 函数分为五个部分
    ① 上个任务运行环境的保存(将CPU寄存器的值保存到任务栈中)
    ② 调用任务指针切换函数前对寄存器的保护
    ③ 调用任务指针切换函数,使任务指针指向新的任务
    ④ 调用任务指针切换函数后对寄存器的恢复
    ⑤ 下个任务运行环境的加载(将任务栈中的值加载到CPU寄存器)
  • 函数代码如下:
__asm void xPortPendSVHandler( void )
{extern pxCurrentTCB;extern vTaskSwitchContext;PRESERVE8
//1. 上个任务运行环境的保存(将CPU寄存器的值保存到任务栈中)/* 当进入PendSVC Handler时,上一个任务运行的环境即:xPSR,PC(任务入口地址),R14,R12,R3,R2,R1,R0(任务的形参)这些CPU寄存器的值会自动保存到任务的栈中,剩下的r4~r11需要手动保存 *//* 获取任务栈指针到r0 */mrs r0, pspisbldr	r3, =pxCurrentTCB		/* 加载pxCurrentTCB的地址到r3 */ldr	r2, [r3]                /* 加载pxCurrentTCB到r2 */stmdb r0!, {r4-r11}			/* 将CPU寄存器r4~r11的值存储到r0指向的地址 */str r0, [r2]                /* 将任务栈的新的栈顶指针存储到当前任务TCB的第一个成员,即栈顶指针 */				//2. 调用任务指针切换函数前对寄存器的保护stmdb sp!, {r3, r14}        /* 将R3和R14临时压入堆栈,因为即将调用函数vTaskSwitchContext,调用函数时,返回地址自动保存到R14中,所以一旦调用发生,R14的值会被覆盖,因此需要入栈保护;R3保存的当前激活的任务TCB指针(pxCurrentTCB)地址,函数调用后会用到,因此也要入栈保护 *///3. 调用任务指针切换函数,使任务指针指向新的任务	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY    /* 进入临界段 */msr basepri, r0dsbisbbl vTaskSwitchContext       /* 调用函数vTaskSwitchContext,寻找新的任务运行,通过使变量pxCurrentTCB指向新的任务来实现任务切换 */ mov r0, #0                  /* 退出临界段 */msr basepri, r0//4. 调用任务指针切换函数后对寄存器的恢复ldmia sp!, {r3, r14}        /* 恢复r3和r14 *///5. 下个任务运行环境的加载(将任务栈中的值加载到CPU寄存器)ldr r1, [r3]ldr r0, [r1] 				/* 当前激活的任务TCB第一项保存了任务堆栈的栈顶,现在栈顶值存入R0*/ldmia r0!, {r4-r11}			/* 出栈 */msr psp, r0isbbx r14                      /* 异常发生时,R14中保存异常返回标志,包括返回后进入线程模式还是处理器模式、使用PSP堆栈指针还是MSP堆栈指针,当调用 bx r14指令后,硬件会知道要从异常返回,然后出栈,这个时候堆栈指针PSP已经指向了新任务堆栈的正确位置,当新任务的运行地址被出栈到PC寄存器后,新的任务也会被执行。*/nop
}

4. vTaskSwitchContext()

其实就是对 pxCurrentTCB 进行了手动更新,目前还很粗糙。

//任务切换函数
void vTaskSwitchContext( void )
{    /* 两个任务轮流切换 */if( pxCurrentTCB == &Task1TCB ){pxCurrentTCB = &Task2TCB;}else{pxCurrentTCB = &Task1TCB;}
}

后记

如果您觉得本文写得不错,可以点个赞激励一下作者!
如果您发现本文的问题,欢迎在评论区或者私信共同探讨!
共勉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380250.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

服务器系统2012r2升级专业版,Windows Server 2012 R2版本区别

慕工程0101907 Windows Server 2012 R2是最新的服务器版本Windows&#xff0c;于2013年10月18日发布。这是Windows 8.1的服务器版本&#xff0c;在2013年6月3日的TechEd北美公布。Windows Server 2012&#xff0c;Datacenter和Standard版功能相同&#xff0c;变化只有授权&…

win7家庭版和旗舰版区别_Win7 ultimate是什么版本?ultimate是什么意思功能区别介绍!...

Win7 ultimate是什么版本&#xff1f;ultimate是什么意思功能区别介绍&#xff01; 对于Win7系统很多朋友都会觉的是一款很好用的操作系统&#xff0c;Win7系统的版本有很多种&#xff0c;那么Win7 ultimate是什么版本&#xff1f;win7这么多版本又有什么区别呢&#xff1f; Wi…

金蝶KIS旗舰版和K3wise的区别

金蝶KIS旗舰版就是金蝶K/3rise&#xff0c;也就是以前经常说的K3成长版 金蝶ERP系统&#xff0c;为金蝶集团专为中小企业设置的个性化ERP系统&#xff0c;现主要分为两个版本&#xff1a;K/3 WISE版本&#xff0c;KIS旗舰版&#xff08;前身金蝶K3rise&#xff09;&#xff0c;…

10 ping不通widwos7 windwos_w7专业版和旗舰版的区别讲解

微软发布的windows7系统有非常多的版本&#xff0c;网友们知道w7专业版和旗舰版的区别在哪里吗?相信有非常多的网友都被w7专业版和旗舰版的区别这个问题给难倒了。不过不用担心&#xff0c;windows7之家小编已经把w7专业版和旗舰版的区别讲解给网友们准备好了。 相关文章推荐&…

win7家庭版和旗舰版区别_Windows系统的家庭版、专业版、旗舰版,都有什么区别?...

现在主流电脑系统的是Win7和Win10,但是对于这两个系统的本身,也有版本的区别,也就是我们听说的家庭版、专业版、旗舰版等。 对于Win7系统来说,它一共有6个版本,分别为:初级版、家庭普通版、家庭高级版、专业版、企业版、旗舰版,它们的功能也是越来越强大。 今天我们就来…

服务器版系统和w7区别,小编告诉大家W7精简版和旗舰版啥区别

最近有网友给windows7之家小编留言问我W7精简版和旗舰版啥区别?他现在非常纠结不知道安装哪个版本的windows7系统好。其实网友提出的W7精简版和旗舰版啥区别这个问题解决起来非常简单。下面小编告诉大家W7精简版和旗舰版啥区别吧。 一、家庭普通版 功能&#xff1a;无限应用程…

国产航顺HK32F030M: 内部参考电压

HK32F030MF4P6 用户手册 内部参考电压 adc.c #include "bsp_adc.h"/*** brief ADC GPIO 初始化* param 无* retval 无*/ static void ADCx_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 打开 ADC IO端口时钟ADC_GPIO_AHBxClock_FUN ( ADC_GPIO_C…

怎么通过苹果HEIC图片转换器将heic格式转换为其他格式?

相信苹果用户对于heic图片并不陌生&#xff0c;十三日凌晨刚刚举行了今年的苹果发布会&#xff0c;并没有提及到系统更新的话题&#xff0c;所以目前最新系统依旧是iOS11&#xff0c;前两年更新的系统对于拍照格式的变化果粉有目共睹&#xff0c;可以说这个系统利弊同在&#x…

iPhone的照片格式 HEIC

今天把手机的照片扔到电脑 结果不是jpg格式 是heic 通通打不开 后来就去下了heic-converter 挺好用的 也没有浮水印 也有一次转一个资料夹的功能 放在我的下载空间 没点数也可以私我 https://me.csdn.net/download/GTWLin

如何将苹果HEIC图片转换为普通图片

HEIC是新出的一种图像格式&#xff0c;苹果的iOS 11更新后&#xff0c;iPhone 7及其后硬件&#xff0c;在拍摄照片时默认存储为HEIC格式。与JPG相比&#xff0c;它占用的空间更小&#xff0c;画质更加无损。HEIC格式照片支持iOS11及macOS High Sierra&#xff08;10.13&#xf…

IOS11苹果Heic图片转换成JPG怎么转?

HEIC是新出的一种图像格式&#xff0c;苹果的iOS 11更新后&#xff0c;iPhone 7及其后硬件&#xff0c;在拍摄照片时默认存储为HEIC格式比jpp,png bmp格式占用空间更小&#xff0c;画质清晰&#xff0c;想要在windows电脑中查看HEIC图片&#xff0c;是炫耀先将HEIC转JPG|png|bm…

怎么打开苹果heic图片,heic是什么文件?

ISO系统在更新到IOS11版本后&#xff0c;iphone手机拍摄的文件格式为HEIC格式图片&#xff0c;上传到电脑端&#xff0c;无法打开&#xff0c;很多软件也无法打开 &#xff0c;在win7和win10系统下可以使用 heic图片转换精灵软件&#xff0c;把heic格式的图片转成jpg或者pn格式…

转换heic图片的方法—苹果HEIC图片转换器

电脑怎么打开heic文件&#xff0c;很多人都会有这样的疑问&#xff0c;需要将其格式转换一下才能在电脑上打开查看&#xff0c;那一起看一下转换heic图片的方法吧&#xff01; 1、首先在电脑上运行苹果HEIC图片转换器&#xff0c;这类的工具还是蛮多的&#xff0c;但是易操作是…

苹果手机heic格式照片怎么转成jpg

苹果自iOS11系统之后默认的是heic图片格式&#xff0c;在电脑和安卓中都无法直接查看&#xff0c;需要将其转换图片格式&#xff0c;苹果手机heic格式照片怎么转成jpg&#xff1f;下面我们一起来看看吧&#xff01; 使用工具&#xff1a; 电脑、图片 操作方法&#xff1a; 1、…

如何将苹果手机heic格式转化jpg

如何将苹果手机heic格式转化jpg&#xff1f;大家都知道现在的苹果手机拍照后的图片格式是heic格式的&#xff0c;这是一种苹果专用的图片格式&#xff0c;如果将heic格式图片放到电脑上是不能正常打开了&#xff0c;而且大部分的平台都不知道heic格式图片的使用和上传&#xff…

苹果的heic格式图片怎么转换成jpg

苹果的heic格式图片怎么转换成jpg&#xff1f;heic格式的出现是在苹果iOS的系统更新到iOS11之后&#xff0c;是苹果系统的专属照片格式&#xff0c;不能跨设备直接使用。其实不光是heic格式&#xff0c;历来苹果系统的各种格式都无法在其他设备直接使用。而我们解决这个问题的方…

iPhone 的HEIC图像如何无损转换为JPG?

自iOS 11开始&#xff0c;iPhone默认图片格式变成了heic&#xff0c;与JPEG相比&#xff0c;HEIC在画质无损的的前提下&#xff0c;体积更小。 直接在iCloud上批量下载的图片也是默认也是HEIC格式。但是&#xff0c;Windows上无法在直接查看HEIC格式图片。 专业的heic转换器&a…

【云原生】Docker 详解(三):Docker 镜像管理基础

Docker 详解&#xff08;三&#xff09;&#xff1a;Docker 镜像管理基础 1.镜像的概念 镜像可以理解为应用程序的集装箱&#xff0c;而 Docker 用来装卸集装箱。 Docker 镜像含有启动容器所需要的文件系统及其内容&#xff0c;因此&#xff0c;其用于创建并启动容器。 Dock…

深兰科技熊猫汽车牵手首恒出行,人工智能技术提升商用车运营服务

8月8日&#xff0c;深兰科技集团旗下熊猫新能源汽车(上海)有限公司(下称熊猫新能源汽车)与河南首恒出行服务有限公司(下称首恒出行)在深兰科技总部举行签约仪式&#xff0c;首恒出行将向熊猫新能源汽车年定向采购10000台商用车&#xff0c;双方将在汽车后市场领域进行技术合作。…

什么是BitTorrent协议?

BitTorrent 是一个 P2P (Peer-to-Peer) 通信协议&#xff0c;它设计用于分发数据和电子文件在互联网上。BitTorrent 是目前世界上最流行的 P2P 文件共享协议之一&#xff0c;以下是对 BitTorrent 协议的详细解释&#xff1a; 种子和对等体&#xff1a; 种子&#xff08;Torrent…