stm32 内存管理

发布者:堕落的猫最新更新时间:2022-05-06 来源: eefocus关键字:stm32  内存管理 手机看文章 扫描二维码
随时随地手机看文章

分块式内存管理
1


分块式内存管理

1


举例


#define MEM1 0 //内部SRAM

#define MEM2 1 //外部SRAM


#define MEM1_BLOCK_SIZE     32 //内存块大小 32字节

#define MEM2_BLOCK_SIZE     32


#define MEM1_MAX_SIZE       10 * 1024 //10K

#define MEM2_MAX_SIZE       40 * 1024


#define MEM1_TABLE_SIZE     MEM1_MAX_SIZE / MEM1_BLOCK_SIZE

#define MEM2_TABLE_SIZE     MEM2_MAX_SIZE / MEM2_BLOCK_SIZE


u8 mem1_pool_base[MEM1_MAX_SIZE];

u8 mem2_pool_base[MEM2_MAX_SIZE] __attribute__((at(0x68000000)));


u8 mem1_table_base[MEM1_TABLE_SIZE];

u8 mem2_table_base[MEM2_TABLE_SIZE];


typedef struct

{

    u8 block_size;

    u16 table_size;

    u8 *mem_pool; //内存池

    u8 *mem_table; //内存管理表

}malloc_t;


malloc_t mal[2] = 

{

    {MEM1_BLOCK_SIZE, MEM1_TABLE_SIZE, mem1_pool_base, mem1_table_base},

    {MEM2_BLOCK_SIZE, MEM2_TABLE_SIZE, mem2_pool_base, mem2_table_base}

};


void *memset(void *s, u8 c, u32 n) //清0

{

    u32 i = 0;

    u8 *p = s;


    for(i = 0; i < n; i++)

    {

        *(p + i) = c;

    }


    return s;

}


void mem_init(u8 i)

{

    memset(&mal[i].mem_pool, 0, sizeof(mal[i].mem_pool));

    memset(&mal[i].mem_table, 0, sizeof(mal[i].mem_table)); 

}


u32 mem_malloc(u8 i, u32 size)

{

    u16 num = 0;

    u16 tmp = 0;

    int o = 0;

    u16 j = 0;


    num = size / mal[i].block_size; //整块数量


    if(size % mal[i].block_size > 0)

    {

        num++; 

    }


    for(o = mal[i].table_size - 1; o >= 0; o--)

    {

        if(mal[i].mem_table[o] == 0) //连续空内存块

        {

            tmp++;

        }

        else

        {

            tmp = 0;

        }


        if(tmp == num)

        {

            for(j = 0; j < num; j++)

            {

                mal[i].mem_table[o + j] = num; //标记非空块

            }


            return (o * mal[i].block_size); //返回偏移地址

        }

    }


    return 0xFF;

}


void* malloc(u8 i, u32 size)

{

    u32 offset;


    offset = mem_malloc(i, size);

    if(offset != 0xFF)

    {

        return (void*)((u32)mal[i].mem_pool + offset);

    }

    else

    {

        return NULL;

    }

}


void mem_free(u8 i, u32 offset)

{

    u16 num = 0;

    u16 o = 0;

    u16 j = 0;


    o = offset / mal[i].block_size; //首块偏移


    num = mal[i].mem_table[o];


    for(j = 0; j < num; j++)

    {

        mal[i].mem_table[o + j] = 0; //块标记清0

    }

}


void free(u8 i, void *addr)

{

    u32 offset = 0;


    offset = (u32)addr - (u32)mal[i].mem_pool;


    mem_free(i, offset);

}


u8 mem_used(u8 i) //内存块使用率

{

    u16 used = 0;

    u16 j = 0;


    for(j = 0; j < mal[i].table_size; j++)

    {

        if(mal[i].mem_table[j] != 0)

        {

            used++;

        }

    }


    return (used * 100 / mal[i].table_size);

}


关键字:stm32  内存管理 引用地址:stm32 内存管理

上一篇:stm32 SD卡
下一篇:stm32 内部flash

推荐阅读最新更新时间:2024-11-10 05:00

STM32存储器 — <1> 关于STM32的存储器
当我们在完成某一个实验,当我们正庆幸的时候,我们不由得产生一种不安的想法 我们是否已经少许明白其中的种种细节? 尤其,当我们所有的事情都依赖于编译环境或Firmware,抑或他人的程序,而自己仅仅是Copy和Modify,以致Using。当你还是一个初学者的时候,或许不会太过于关注于此,但是要想提高自己对单片机、处理器原理的理解,并且希望走得更远的时候,您就需要关注更为详细的内部知识,您需要明白编译环境、Firmware等为你的默默贡献。 1 STM32系统结构 要想深刻理解STM32的存储器,需要首先知道STM32的系统结构。 如Figure 1,是STM32系统结构框图。 根据STM32 Re
[单片机]
分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
编译环境:我用的是(Keil)MDK4.7.2 stm32库版本:我用的是3.5.0 一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。   对STM32 内部FLASH进行编程操作,需要遵循以下流程:   FLASH解锁   清除相关标志位   擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)   写入FLASH   锁定FLASH 实例: #define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小 #define WRITE_START_ADDR ((uint32_t)0x08008000)//写入的起始地址 #define W
[单片机]
分享<font color='red'>STM32</font> FLASH 擦除(以及防止误擦除程序代码)、写入
STM32启动文件分析——startup_stm32f10x_hd.s
一、启动文件的作用 (关于启动代码的作用,前面已经提到过了,这里再啰嗦一下) (1)初始化堆栈指针 SP; (2)初始化程序计数器指针 PC; (3)设置堆、栈的大小; (4)设置异常向量表的入口地址; (5)配置外部 SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM); (6)设置 C库的分支入口__main(最终用来调用 main函数); (7)在 3.5版的启动文件还调用了在 system_stm32f10x.c文件中的SystemIni()函数配置系统时钟。 二、启动文件中提到的汇编指令 指令 作用 EQU 给数字常量取一个符号名,相当于 C 语言中的
[单片机]
STM32单片机串口通信波特率计算方法
1. 什么是波特率 不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。 2. STM32波特率相关的寄存器 STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。 该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。 3. 波特率计算方法 STM32的数据手册给出了计算方法,有一个公式,如下图所示: 在这个公式上,共有三
[单片机]
<font color='red'>STM32</font>单片机串口通信波特率计算方法
stm32 IAP + APP ==>双剑合一
(扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12992773,考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP == 双剑合一”链接稍后发,希望通过IAP程序的hex 文件 和 APP的hex文件 合成一个hex 或者把合成的hex文件转成.bin 文件 减少“体力”) 一、简单框架介绍 (简单回顾上篇博文《IAP在线 升级详解》http://blog.csdn.net/yx_l128125/article/deta
[单片机]
<font color='red'>stm32</font> IAP + APP ==>双剑合一
stm32 usb 主机发送 pid in的原理和实现方法
STM32是一款常用的微控制器系列,它具有广泛的应用领域,包括工业控制、汽车电子、消费电子等。其中,STM32同时支持USB主机和设备功能,使得它在与其他USB设备的通信中具有很大的优势。在本文中,我们将深入探讨STM32 USB主机发送PID IN的原理和实现方法。 首先,让我们来了解一下USB协议中的PID(Packet Identifier)。PID是USB数据传输的核心部分,它用于标识数据包的类型。在USB主机发送数据时,PID IN表示主机请求从设备读取数据。 为了实现STM32 USB主机发送PID IN功能,我们需要首先配置STM32的USB接口,并编写相应的代码。下面是详细的步骤: 配置USB接口:使用S
[单片机]
关于stm32中R15寄存器的理解
今天上午看《stm32权威指南》中关于R15寄存器中有些内容不理解,查了查资料,原来是这样。 这里有一个别人的问题。 我把Nor Flash里的一个函数代码数据(函数首地址是:0x6400EC10)拷贝到RAM的 0x2000FC00, 然后把0x2000FC00加载给PC指针(为了让代码在RAM里运行),接着就出现了Hard Fault Exception,而用 IAR 单步执行的时候能正常运行。同时我将一个函数地址值赋给一个unsigned int 变量之后发现自动加了1。对于这些问题先看权威指南里是怎么说的吧。 一,PC指针(程序计数器R15)(权威指南) R15是程序计数器,在汇编代码中称为 PC指针
[单片机]
关于<font color='red'>stm32</font>中R15寄存器的理解
STM32之五外部中断(下)
通过对外部中断理论的些许理解,这次我们利用两个按键key1和key2来控制led1和led2的亮灭,按key1进入key1的中断,控制对应的led亮灭,按key2进入key2的中断,控制相应的led的亮灭 同样,涉及到中断,我们要建立两个文件,exti.c及exti.h,首先来看看exti.c 用到中断,自然我们要用到stm32f10x_it.c函数,将中断响应函数放在里面,打开这个文件你会发现里面只是给出了部分中断函数,找来找去也没有我们需要的中断函数体,这时需要我们自己添加函数体,看下我添加的函数体: 但是这个函数名可不是随便起的,具体每个中断函数体的函数名怎么书写,我们可以打开startup_stm32f10x_hd.
[单片机]
<font color='red'>STM32</font>之五外部中断(下)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved