嵌入式linux开发 (三十一) 内存管理2.0(2) freertos内存管理

2024-05-27 16:18

本文主要是介绍嵌入式linux开发 (三十一) 内存管理2.0(2) freertos内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 本次采用的os是freertos,基于stm32f407zgt6
  • 移植过程及代码
代码分析
  • 内存分段初始化部分
startup_stm32f407xx.sReset_Handler初始化栈 	// 系统.stack段// .code 段没做动作// .bss  段没做动作从flash 上 加载data 段入sram清bss段SystemInit__libc_init_array // .heap 和 C 库main // 功能函数$ nm build/startup_stm32f407xx.o  |grep " U "U _ebss	// 在 STM32F407ZETx_FLASH.ld中	U _edata	// 在 STM32F407ZETx_FLASH.ld中	U _estack	// 在 STM32F407ZETx_FLASH.ld中	U __libc_init_array// 在 /usr/lib/gcc/arm-none-eabi/4.9.3/../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-init.o)中// /usr/lib/arm-none-eabi/lib/armv7e-m/fpu/libc_nano.aU main		// 	在 USER/main.c 中U _sbss	// 在 STM32F407ZETx_FLASH.ld中	U _sdata	// 在 STM32F407ZETx_FLASH.ld中	U _sidata	// 在 STM32F407ZETx_FLASH.ld中	U SystemInit	// 在 STM32F407ZETx_FLASH.ld中	
  • rtos 内存管理部分
mainxTaskCreate(start_task)vTaskStartSchedulerstart_tasktaskENTER_CRITICALtask1_tasktask2_tasktaskEXIT_CRITICALtask1_taskwhile(1)
task2_taskwhile(1)-------------1. 首先创建了一个任务A
2. 然后开始调度
3. A开始执行
4. A创建了两个任务B C ,并删除了任务A
5. B 开始执行
6. B结束执行,C 开始执行
7. C结束执行,B 开始执行
8. B结束执行,C 开始执行
9. ...分析到 6 应该能分析完所有系统做的内存相关的动作.这里面包括了所有状态下的调度.
3中的 A 开始执行 // A 执行,有个关键状态:调度开始
5中的 B 开始执行 // B 执行,有个关键状态:A被删除
6中的 C 开始执行 // C 执行,无关键状态
从其他角度分析os管理内存的话
1. 为 os 提供 api 和 内存空间1. os的正常运行需要内存1.1 os的 各个段 // free rtos OS是不是只有一个调度器? 属于 .code.code// 调度器 ,对于stm32 ,应该是在flash 里面.data// 具体要分析调度器的代码.ro-data.bss.stack.heap1.2 调度器1.3 消息队列// 先不关心1.4 定时器// 先不关心2. 为 user space 提供 api和内存空间1. os 需要维护应用程序的状态(TCB和STACK)2.1 为了提供应用程序需要的各个段做了什么// .code  在哪里,应该是在flash里面,但是需要每个应用程序知道,是用PC管理的// .ro-data //.code 知道 .ro-data 在哪里,应该和 内核的.data在一起// .data //.code 知道 .data 在哪里,应该和 内核的.data在一起// .bss  // 在生成二进制文件的时候.bss 是不是已经定了// 如果定了的话,那么应用程序的.bss 应该和 内核的.bss在一起// 如果不定,.code 里面有对.bss特定地址索引,os处理的时候需要怎么处理// .stack // 对于每个.code ,分配不同的栈,这个通过PC来控制// .heap // 这个可以对于每个.code ,分配不同的.heap,也可以和内核公用// 如果共用的话,就很简单, 用户的.heap 和 内核的.heap 是一个 .heap ,但是不能限制用户用多少.heap// 如果不共用的话,内核要在load应用程序的时候自动分配heap空间,并初始化 , 并提供malloc 函数,买个应用程序返回的是其特有的heap
用户使用内存的话
1. 使用 os 提供的malloc 函数 操作 os 提供给应用程序的空间.1.1 应用程序的各个段在哪里1.2 应用程序什么时候用了哪个段运行的时候.code 从 flash 加载,通过TCB中的PC控制.ro-data 直接在.code中,通过.code索引.data 在 ram ,通过 .code 索引.bss 在 ram ,通过.code 索引.stack 在 ram ,通过TCB中的SP索引.heap 在 ram ,通过malloc索引不运行的时候.code 对应的PC放在了 TCB 中,其他进程不能访问该进程TCB,也就访问不了该进程的.code.ro-data 在 .code中.data .bss 在ram中,其他进程没有 索引(索引在.code中).stack 对应的SP被放在了TCB中,其他进程不能访问该进程TCB,也就访问不了该进程的.stack.heap 在 ram 中,已经被malloc过,未被free,其他进程不能malloc到该进程的.heap------------------------------
按照stm32 freertos来说
系统的.code(调度器) .ro-data .data .bss .heap 和 应用程序的.code(功能函数) .ro-data .data .bss .heap 是在一块的
系统的.stack 和 应用程序的.stack 是分离的.且 .code .ro-data 在flash上
.data .bss .heap .stack 在内存里
另外内存里还有每个进程的TCB所以整体来说,大小的话
初始化的时候 .data .bss 是初始化好的,占用的内存可以通过map来查看
另外只要知道 .heap(可以通过配置来查看) .stack(可以通过配置来查看) TCB(可以通过配置来查看) 占用多少内存就可以了整体来说,布局的话
flash.code .ro-data // 应用程序的和系统的混在一起了
ram.data .bss .heap  TCB(应用程序) // 注意: TCB在.heap里面 // 应用程序的和系统的混在一起了.stack(内核) .stack(应用程序1) .stack(应用程序2) ...  // 应用程序的和内核的分开了// freertos 的 应用程序stack 是在 .heap中申请的 , 内核stack 是 一开始初始化的
---------------------------和裸机内存的布局有什么不同
1.大体相同(都是 .code .ro-data .data .bss .heap .stack)
2.只不过.heap被内核用了一部分(用于TCB的管理)
3.stack被分成了很多份(内核一份(内核的stack在.stack),每个应用程序一份(用户的stack在.heap))
参考资料
  • FreeRTOS RAM 使用情况及优化方法

这篇关于嵌入式linux开发 (三十一) 内存管理2.0(2) freertos内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1