如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片

这篇具有很好参考价值的文章主要介绍了如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何剪裁操作系统源码

本文面向的需求场景是,为缺乏标准库实现的处理器IP移植内存管理模块,即为裸片部署C标准库中的 malloc()free() 函数。

具体做法是——从操作系统的内存管理组件中剪裁出必要的源码,适配到目标处理器的开发环境(SDK/IDE/CMAKE工程子目录)中。

1 定需求——理解内存管理/堆管理

1.1 C标准库中的内存管理方案

C标准库提供了一组内存管理函数,用于在C程序中进行动态内存分配和释放操作。这些函数主要包括malloc、calloc、realloc和free。

malloc函数: malloc函数用于分配指定大小的内存块,并返回指向该内存块的指针。其函数原型为:

void* malloc(size_t size);

它接受一个参数size,表示需要分配的内存空间的大小(以字节为单位)。malloc函数在堆内存中分配了一块连续的内存,并返回指向该内存块起始地址的指针。

calloc函数: calloc函数也用于分配指定数量和大小的内存块,并返回指向该内存块的指针。与malloc不同的是,calloc会将分配的内存块中的每个字节都初始化为0。其函数原型为:

void* calloc(size_t num, size_t size);

num参数表示需要分配的元素个数,而size参数表示每个元素的大小(以字节为单位)。calloc函数在堆内存中分配了大小为num * size的内存块,并返回指向该内存块起始地址的指针。

realloc函数: realloc函数用于调整先前分配的内存块的大小。其函数原型为:

void* realloc(void* ptr, size_t size);

ptr参数是指向先前通过malloc或calloc分配的内存块的指针,而size参数表示需要调整的大小(以字节为单位)。realloc函数根据新的大小重新分配内存块,并返回指向重新分配后内存块起始地址的指针。如果内存块不能被重新分配,realloc函数可能会创建新的内存块,并将原内存块的数据复制到新内存块中。

free函数: free函数用于释放先前通过malloc、calloc或realloc函数分配的内存块。其函数原型为:

void free(void* ptr);

ptr参数是指向先前分配的内存块的指针。通过调用free函数,该内存块将被标记为空闲,并可以被再次分配给其他内存需求。

1.2 需求剪裁

裸片程序受限于内存资源,一般是使用静态分配方法设计得到的,只在移植某些外设的驱动时需要提供基本的动态内存管理方法,很少有新增预分配的动态内存的需求。所以 realloccalloc 函数可以略去,这样咱的任务量就减少了一半啦。

2 找轮子——向操作系统学习

操作系统是对硬件的抽象,裸片上的绝大部分需求都可以在操作系统的源码中找到较为通用的实现,那么何必再造轮子呢,直接逮着操作系统的薅羊毛吧。

2.1 FreeRTOS中的内存管理方案

FreeRTOS 提供了几种堆管理方案,这些方案的复杂性和功能各不相同,分别适用于不同的需求场景,具体见下图。
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式
总结性地说,FreeRTOS在源码目录 Source/Portable/MemMang 中为咱们提供了 5 种可选的内存管理模块的实现:

  • heap_1:极简版,不支持内存释放(没有 free 函数)
  • heap_2:支持释放,但不合并释放的内存块
  • heap_3:支持线程安全的 malloc 和 free 函数
  • heap_4:合并释放的内存块,避免内存碎片
  • heap_5:在 4 的基础上支持跨多个内存块进行分配

这儿咱们根据自己的需求选,本文选择 heap_2 移植,因为基本功能全面,且足够简单。

2.2 拉取源码

在源码树中找到 Source/Portable/MemMang/heap2.c,如下图。
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式
打开就看到分配和释放函数触手可及,分别命名为 pvPortMallocvPortFree, 添加到咱的工程里,然后细看这个源文件的依赖,把依赖项从源码树里抠出来,舍弃不需要的文件,也就把内存管理模块从操作系统中剥离出来了。

2.3 剥离依赖项

heap_2.c包含了两个FreeRTOS相关的头文件—— FreeRTOS.h 和 task.h,后者是任务调度器相关的声明,咱们显然不需要,直接剔除。FreeRTOS是一些配置项的宏定义,咱们把与内存管理相关的剪切过来,不需要保留FreeRTOS.h整个文件。

如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式

然后是一个用于让管理的内存空间大小符合内存对齐需求的宏定义:

/* A few bytes might be lost to byte aligning the heap start address. */
#define configADJUSTED_HEAP_SIZE    ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )

configTOTAL_HEAP_SIZE 和 portBYTE_ALIGNMENT 都需要我们手动 #define
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式
heap_2.c 还用到一个宏定义 portBYTE_ALIGNMENT_MASK
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式
原先在FreeRTOS.h里,我们加到portmacro.h里:
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式
剩下的就是一些基本的类型替换了,我们统一放到 portmacro.h 文件中:
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式
projdefs.h 也是需要的,里面有 truefalse 的宏:
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式

2.4 可用源码

Github仓库:memManPort

3 测试

可以用下面这个demo来测试移植结果的可用性,只要pb和pc值结果一致,那就基本正确了。
如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片,从物理定律到编程语言,arm,内存管理,操作系统,嵌入式文章来源地址https://www.toymoban.com/news/detail-638065.html

到了这里,关于如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LWIP——无操作系统移植

    目录 移植说明 LwIP前期准备  以太网DMA描述符 LwIP移植流程 添加网卡驱动程序 添加LwIP源文件  移植头文件 网卡驱动编写 移植总结  LwIP的移植可以分为两大类:第一类是只移植内核核心,此时用户应用程序编写只能基于RaW/CallBack API进行;第二类是移植内核核心和上层API函数

    2024年02月12日
    浏览(45)
  • FreeRTOS实时操作系统(六)列表与列表项

    FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) FreeRTOS实时操作系统(三)任务挂起与恢复 FreeRTOS实时操作系统(四)中断任务管理 FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复 FreeRTOS实时操作系统(六)列

    2024年02月10日
    浏览(57)
  • LwIP带操作系统的移植

    目录 LwIP移植前期准备 LwIP移植流程 修改lwipopts.h 修改lwip_comm.c文件 修改ethernetif.c/h文件 修改ethernetif_input函数 修改ethernet.c文件 添加应用程序 LwIP是支持操作系统的,在操作系统的支持下我们可以使用LwIP提供的另外两种API编程接口编程。没有操作系统的时候,我们只能使用R

    2024年02月07日
    浏览(41)
  • 简单介绍STM32上的FreeRTOS实时操作系统

    FreeRTOS是一款广泛使用的开源实时操作系统(RTOS),它为嵌入式系统提供了可靠的任务调度和并发管理。在嵌入式领域中,STM32微控制器广受欢迎,并且与FreeRTOS的结合使用可以提供强大的功能和灵活性。在本篇博客中,我们将深入探究STM32上的FreeRTOS,并了解其核心概念、任

    2024年02月16日
    浏览(61)
  • FreeRTOS实时操作系统(十五)Tickless低功耗模式

    FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) FreeRTOS实时操作系统(三)任务挂起与恢复 FreeRTOS实时操作系统(四)中断任务管理 FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复 FreeRTOS实时操作系统(六)列

    2024年02月16日
    浏览(38)
  • STM32初学者入门FreeRTOS操作系统,多任务实时系统

            FreeRTOS(Free Real-Time Operating System)是一个开源的嵌入式实时操作系统,它专门设计用于在资源有限的嵌入式系统中运行。FreeRTOS提供了一些用于任务管理、调度、同步和通信的功能,使开发者能够轻松地创建可靠的嵌入式系统。 以下是FreeRTOS的一些特点和功能: 轻量

    2024年02月11日
    浏览(47)
  • STM32操作系统FreeRTOS学习——基于hal库

    目录 一、基础概念 1、FreeRTOS 2、单片机编程的系统概念 a、裸机系统,包括轮询系统(不包括中断)和前后台系统(中断为前台,轮询为后台) b、多任务系统 3、FreeRTOS编程风格 a、数据类型 b、变量名的定义 c、函数名 d、宏定义 二、Cubemx创建工程 1、创建任务 2、创建队列

    2024年02月10日
    浏览(43)
  • 【STM32】STM32 移植鸿蒙操作系统

    随着 OpenHarmony3.1 的正式发布,其功能也在不断完善。OpenHarmony LiteOS-M 内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无

    2024年02月09日
    浏览(54)
  • ARM-M架构移植UCOS操作系统

            最近准备面试,把本科到现在的一些比赛相关的东西整理一下。那些年在飞思卡尔在K60单片机上的UCOSII移植(哎,心酸...)         一、首先看下UCOSII的文件结构: 一些核心的文件解释:         【1、头文件】:          includes.h :每个.c文件需要包含的头

    2024年02月11日
    浏览(37)
  • STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

    1、FreeRTOS RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统 FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多

    2024年02月21日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包