0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FreeRTOS的STM32F103系统—内存管理及任务调度

冬至子 来源:月月望归鸟 作者:K.Fire 2023-11-13 11:08 次阅读

虽然现在的单片机系统,CPU的资源并不是那么紧缺了,也有丰富的内存空间,但是我们还是要积极地实现内存管理,这可以帮我们减少内存资源的占用,优化程序,提高效率。

而任务调度算法,则是帮助我们合理安排实时系统中各个任务的逻辑顺序,保证各个任务按照某种规则协调有效地进行。

1

内存管理

  • 堆(heap):就是一块空闲的内存,需要提供管理函数
  • 栈(stack):函数调用时局部变量保存在栈中,当前程序的环境也是保存在栈中

FreeRTOS 中内存管理的接口函数为:pvPortMalloc 、 vPortFree ,对应于 C 库的 malloc 、 free。

源码中提供了5种内存管理的方法。

1.heap_1

它只实现了pvPortMalloc,没有实现vPortFree。

它的实现过程就是,先定义一个大数组(堆)-A,当用户创建任务时B图中的蓝色区域被占用,创建更多任务时,如图所示。

图片

2.heap_2

Heap_2 使用 最佳匹配算法 (best fifit) 来分配内存,它支持vPortFree释放内存

Heap_2 不会合并相邻的空闲内存,所以 Heap_2 会导致严重的 " 碎片化 " 问题。

但是,如果申请、分配内存时大小总是相同的,这类场景下 Heap_2 没有碎片化的问题。所以它适用于:频繁地创建、删除任务,但是任务的栈大小都是相同的( 创建任务时,需要分配 TCB 和栈, TCB 总是一样的) 。

图片

3.heap_3

Heap_3 使用标准 C 库里的 malloc 、 free 函数,所以堆大小由链接器的配置决定,配置项confifigTOTAL_HEAP_SIZE 不再起作用。

4.heap_4

Heap_4 使用首次适应算法 (fifirst fifit) 来分配内存。它还会把相邻的空闲内存合并为一个更大的空闲内存, 这有助于较少内存的碎片问题。

Heap_4 会把相邻空闲内存合并为一个大的空闲内存,可以较少内存的碎片化问题。适用于这种场景:频繁地分配、释放不同大小的内存。

图片

5.heap_5

Heap_5 分配内存、释放内存的算法跟 Heap_4 是一样的。相比于 Heap_4 , Heap_5 并不局限于管理一个大数组:它可以管理多块、分隔开的内存。

嵌入式系统中,内存的地址可能并不连续,这种场景下可以使用 Heap_5 ,但需要进行初始化:确定这些内存块在哪、多大。

内存分配失败时的钩子函数:

在 FreeRTOSConfifig.h 中,把宏 confifigUSE_MALLOC_FAILED_HOOK 定义为1,可以开启使用一个钩子函数vApplicationMallocFailedHook,当pvPortMalloc失败后,可以在这个钩子函数中做一些事情。

void * pvPortMalloc( size_t xWantedSize )vPortDefineHeapRegions 
{ 
...... 
#if ( configUSE_MALLOC_FAILED_HOOK == 1 ) 
{ 
    if( pvReturn == NULL ) 
    { 
        extern void vApplicationMallocFailedHook( void ); 
        vApplicationMallocFailedHook(); 
    } 
}
#endif 
return pvReturn; 
}

2

任务调度

所谓调度算法就是怎么确定哪个就绪态的任务可以切换为运行状态。

通过配置文件 FreeRTOSConfifig.h 的两个配置宏来配置调度算法:confifigUSE_PREEMPTION、confifigUSE_TIME_SLICING 。

  • confifigUSE_PREEMPTION:为1时,采用可抢占调度,高优先级的任务抢先执行;为0时,当一个任务正在执行时,就算一个更高优先级的任务处于Ready状态了也不能打断该任务的执行,除非这个任务自己停止。
  • confifigUSE_TIME_SLICING:为1时,开启时间片调度,同优先级的任务轮流执行;为0时,
    当前任务会一直执行,直到主动放弃、或者被高优先级任务抢占。

3

总结

关于内存管理及任务调度写这些,后面会进行常用的任务--通讯方式堆栈、队列等的介绍。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61347
  • 状态机
    +关注

    关注

    2

    文章

    486

    浏览量

    27165
  • STM32F103
    +关注

    关注

    33

    文章

    474

    浏览量

    62573
  • 内存管理
    +关注

    关注

    0

    文章

    162

    浏览量

    14056
收藏 人收藏

    评论

    相关推荐

    基于STM32F103系统FreeRTOS程序移植

    在程序中,移植了正点原子的基于STM32FreeRTOS程序,编写了自己的内存管理程序malloc.c,程序主要结构如下
    的头像 发表于 11-10 11:03 743次阅读
    基于<b class='flag-5'>STM32F103</b><b class='flag-5'>系统</b>的<b class='flag-5'>FreeRTOS</b>程序移植

    STM32F103 FreeRTOS任务调度异常的原因?

    系统设置2个任务系统运行时出现一些异常现象,请问有没有遇到过?是什么原因引起的? 方式1:系统运行正常 void Task1_Task(void * pvParameters) {
    发表于 04-16 06:24

    转:第10章 FreeRTOS任务管理

    编程上来。搞清楚了这一点,那么FreeRTOS学习就算入门了。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。
    发表于 08-23 09:54

    转:第14章 任务调度—抢占式,时间片和合作式

    FreeRTOS版本中不会将合作式调度删除掉,但也不会再进行升级了。 使用STM32F103F407和F429的资源足够多,所以此次教程
    发表于 08-30 09:55

    转第16章 FreeRTOS调度锁,任务锁和中断锁

    第16章 FreeRTOS调度锁,任务锁和中断锁本章教程为大家讲解调度锁,任务锁和中断锁的概念,以及Fr
    发表于 09-01 07:45

    第28章 FreeRTOS动态内存管理

    教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。28.1 动态内存管理
    发表于 09-11 07:15

    移植FreeRTOS(版本9.0.0)到新天STM32开发板(MCU型号:STM32F103VET6)中,并实现3个任务调度

    说明: 移植FreeRTOS(版本9.0.0)到新天STM32开发板(MCU型号:STM32F103VET6)中,并实现3个任务调度。结果:
    发表于 11-15 23:03

    FreeRTOS如何使用delay作为系统延时、任务调度

    请教一个问题,最近在学习使用FreeRTOS,想像原子一样在delay.c里添加RTOS的系统支持,即使用tick时钟作延时。现在有几个问题:1、在启动任务调度器前,如果调用了dela
    发表于 06-10 04:37

    FreeRtos STM32F103移植教程

    收集了一下关于FreeRtos的资料,通过教程自己在战舰上写了点例程STM32F103 FreeRtos 2015-01-26 16:45.zip (4.41 MB )
    发表于 07-25 08:00

    如何在STM32F103开发板上移植UCOSIII操作系统

    在2009年Micrium公司推出了UCOSIII,相对于UCOSII性能有了进一步的提升,支持时间片轮转调度,极短的关中断事件等。本章讲解如何在STM32F103开发板上移植UCOSIII操作系统
    发表于 08-05 07:26

    STM32下完成FreeRTOS的多任务程序开发

    ---------FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间
    发表于 08-09 07:27

    FreeRTOS移植到STM32F103中的步骤

    目录一、FreeRTOS的介绍二、将FreeRTOS移植到STM32F103中的步骤1.前期准备2.在MDK下移植FreeRTOS三、创建一个基于F
    发表于 08-24 07:26

    如何去完成STM32F103FreeRTOS操作系统的移植呢

    如何去完成STM32F103FreeRTOS操作系统的移植呢?有哪些操作步骤?
    发表于 11-26 06:40

    基于STM32F103FreeRTOS移植其代码该如何去实现呢

    怎样去移植基于STM32F103FreeRTOS系统呢?基于STM32F103FreeRTOS移植其代码该如何去实现呢?
    发表于 12-14 06:58

    如何去实现一种基于STM32freeRTOS智能门锁设计

    蓝牙开锁,键盘密码,刷卡无线射频识别开锁。正文蓝牙,射频,键盘分别使用3个任务函数进行数据处理,使用STM32F103 demo,将freeRTOS驱动文件导入。定义好任务属性,句柄以
    发表于 02-18 06:47