EFM32jg之FreeRTOS(5)-任务调度、创建、切换

2023-05-16

@EFM32JG移植FreeRTOS

1、任务调度器

1)创建空闲任务,优先级为0,表示最低优先级,在无其他高优先级任务的情况下,执行空闲任务,若打开configUSE_IDLE_HOOK,则可以再空闲任务中增加自己想要执行的代码,定义勾子函数void vApplicationIdleHook( void )。

2)变量 xSchedulerRunning 设置为 pdTRUE,表示调度器开始运行。

3)设置 PendSV、滴答定时器 的中断优先级,为最低优先级。所以若为事件调度,需要关闭滴答定时器,在优先级最高的任务循环之前加入: SysTick->CTRL = 0,即可关闭。

4)利用SVC异常来启动第一个任务,SVC 中断服务函数应该为 SVC_Handler(),但是FreeRTOSConfig.h 中通过#define 的方式重新定义为了 xPortPendSVHandler()。

2、任务创建

1)为堆栈申请任务内存,大小为分配的值*4

2)为任务控制块申请内存

3)使用函数 prvInitialiseNewTask()初始化任务
A、若使能了互斥信号量功能,则初始化相应字段
B、初始化列表项 xStateListItem 和 xEventListItem
C、设置列表项xEventListItem的字段xItemValue,值越大,优先级就越小,在插入列表时需要排序
D、调用函数 pxPortInitialiseStack()初始化任务堆栈

4)任务创建完成以后就会被添加到就绪列表 pxReadyTasksLists[]中
A、变量 uxCurrentNumberOfTasks 为全局变量,用来统计任务数量,若为1,则表示创建第一个任务,需要初始化相应列表。
B、若新创建的任务优先级比正在运行的任务优先级高,需要修改 pxCurrentTCB 为新
建任务的任务控制块。
C、调用函数 prvAddTaskToReadyList()将任务添加到就绪列表中
D、如果该任务的任务优先级最高,而且调度器已经开始正常运行了,那么就调用函数taskYIELD_IF_USING_PREEMPTION()完成一次任务切换。

3、任务切换

1)任务切换是使用PendSV来切换任务的,它是不精确的
通过向中断控制和壮态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中断。

任务切换的场合是执行一次系统调用,或系统滴答定时器中断。

为了解决上下文切换与中断的冲突问题,防止中断被打断而造成异常,因此上下文切换放到中断中完成。

2)任务切换函数taskYIELD()

此函数使用时,会直接切换成优先级最高的任务,当任务优先级一致的时候,会切换为别的任务,但是当优先级不一致,当前任务优先级最高,而且任务还没有挂起,会导致重新运行该任务,不会切换为别的任务。
所以我是用的事件触发的任务切换使用延时函数切换,vTaskDelay(1),可将任务阻塞,并执行下个任务。在使用事件去切换任务时,当注意控制好该延时,1表示一次事件周期,需保证一次事件周期可以让任务都执行一遍,防止把低优先级任务饿死。

3)滴答定时器中断

void SysTick_Handler(void)
{
		if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
		{
				xPortSysTickHandler();
		}
		HAL_IncTick();
}

当利用事件触发任务时,使用下面的代码即可,添加到事件中,每次事件达成,即开启一次任务调度,否则可以在低功耗模式下休眠,以降低功耗。

if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
{
		xPortSysTickHandler();
}

宏configUSE_TIME_SLICING虽然在例程的FreeRTOSConfig.h 文件中未定义,但是默认为1,表示在同一优先级下可进行任务切换

函数xPortSysTickHandler()调用xTaskIncrementTick,进行时钟节拍计数,并检查是否有任务需要解除阻塞。当计数溢出时,切换延时列表,实现计数溢出切换,此方法可在其他地方借鉴使用!!!!!

解除延时阻塞,可以是任务延时,也可以是事件超时退出。直接将任务添加到就绪列表中。并判断当前任务优先级,使用优先级最高的任务。

4)延时函数(相对延时)
将任务加入延时列表,计算出唤醒时间,xTimeToWake = xConstTickCount + xTicksToWait;,xConstTickCount=xTickCount,xTickCount 是时钟节拍计数器,每次调用xTaskIncrementTick时xTickCount 都会加一。
当溢出时,会将任务放入溢出的延时列表,当计数溢出时,切换列表则可以实现翻转计数。
将任务阻塞后,开始进行任务切换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EFM32jg之FreeRTOS(5)-任务调度、创建、切换 的相关文章

  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • STM32CubeMX+FreeRTOS学习笔记(一)

    嵌入式实时操作系统FreeRTOS 基本概述 在嵌入式领域当中 实时操作系统的应用越来越广泛了 目前嵌入式操作系统种类很多 例如 Clinux C OS II C OS III FreeRTOS RT Thread等等 这篇文章所记录的就是
  • FreeRTOS-内核控制函数

    FreeRTOS 内核控制函数 FreeRTOS中有一些内核函数 一般来说这些内核函数在应用层不会使用 但是内核控制函数是理解FreeRTOS中断的基础 接下来我们逐一分析这些内核函数 taskYIELD 该函数的作用是进行任务切换 这是一
  • java定时任务实现的几种方式

    摘要 在开发测试工具的应用后台 经常听到同事说要做个定时任务把做日志处理 或者数据清理 包括做些复杂的业务计算逻辑 在选择定时任务的时候 怎么能够快速实现 并且选择一种更适合自己的方式呢 我这里把定时任务的实现收集整理了一些方法 希望可以帮
  • C语言实现多级反馈队列调度算法

    include
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • OSAL

    OSAL为 Operating System Abstraction Layer 即操作系统抽象层 支持多任务运行 它并不是一个传统意义上的操作系统 但是实现了部分类似操作系统的功能 OSAL概念是由TI公司在ZIGBEE协议栈引入 他的意
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在

随机推荐