Skip to content

SRAM

内存管理

软件运行的时候对于MCU内存资源的分配使用

高效快速的分配, 在适当的时候释放回收内存资源, 尽量避免内存泄漏以及内存碎片

主要就是实现malloc和free

使用标准库的时候这两个函数会占用大量的代码空间, 不适合嵌入式, 并且没有线程安全的相关机制, 运行的时候有不确定性, 还会导致内存的碎片化

分块内存管理

image-20240107201358723

image-20240107201513452

image-20240107201612660

image-20240107202156756

SRAM调试代码

  • 优点

下载的速度比较快, 频繁改动的程序可以节省很多时间

stm32的擦写次数为1万次

不改写内部FLASH的原有程序

内部FLASH被锁定的芯片可以下载到RAM上, 进行解锁

对Flash解锁

  • 使用外部SRAM

空间会增大,但是读取的速度会比内部Flash速度慢, 运行总时间增加, 并且无法从外部Flash启动, 并且复制的过程比较复杂

STM32的启动方式

首先从0地址去除栈指针的初始值, 就是栈顶指针的地址, 之后从0x00000004获取PC指针的初始值, 指向复位之后的第一条数据

这两个的值地址是可以映射的, 是通过引脚的电平进行设置的

image-20230730173646676

BOOT0是一个单独的引脚

BOOT1就是PB2

实际上就是内核在离开复位状态之后从映射的地址取得栈指针以及程序指针

系统存储器, 是一段特殊的程序, 用户不能访问, ST公司固化的代码, 在设置启动方式的时候会执行, 会检测USAT1/3, CAN2以及USB传过来的文件, 达到更新程序的目的, 在使用串口下载器的时候会使用USB进行设置引脚

内部Flash的启动过程

在连接的时候会直接把文件定位在对应的位置

使用SRAM调试

程序调试的时候是使用Debug, 复位需要重新加载Debug, 使用软件复位的话会加载flash里面的程序

  • 设置一个SRAM调试的工程
  • 修改sct文件
  • 修改下载的配置, 程序下载到SRAM
  • 修改调试器配置, 初始化SP以及PC指针

image-20230731100107919

新建一个工程

image-20230731100621342

共用文件使用单独的配置

image-20230731100822299

image-20230731105112340**

image-20230731110449806

image-20230731110626691

下载算法位置

修改中断向量表的位置

image-20230731111109013

定义这个宏

image-20230731111958471

image-20230731112149449

创建文件

image-20230731112303055

添加文件, 强制配置Debug

这个文件是MDK的芯片包里面复制来的

c
/*----------------------------------------------------------------------------
 * Name:    Dbg_RAM.ini
 * Purpose: RAM Debug Initialization File
 * Note(s):
 *----------------------------------------------------------------------------
 * This file is part of the uVision/ARM development tools.
 * This software may only be used under the terms of a valid, current,
 * end user licence from KEIL for a compatible version of KEIL software
 * development tools. Nothing else gives you the right to use this software.
 *
 * This software is supplied "AS IS" without warranties of any kind.
 *
 * Copyright (c) 2008-2011 Keil - An ARM Company. All rights reserved.
 *----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
  Setup()  configure PC & SP for RAM Debug
 *----------------------------------------------------------------------------*/
FUNC void Setup (void) {
    //强制设置指针
  SP = _RDWORD(0x20000000);          // Setup Stack Pointer
  PC = _RDWORD(0x20000004);          // Setup Program Counter
   //设置中断向量表
  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
}

FUNC void OnResetExec (void)  {      // executes upon software RESET
  Setup();                           // Setup for Running
}
// 把axf文件加载到RAM
load %L incremental

Setup();                             // Setup for Running调用上面的setup函数设置环境

//g, main	不需要再跳转到