使用Keil将STM32部分程序放在RAM中运行

  1. 手动分配RAM区域,新建.sct文件,定义RAM_CODE区域,并指定其正确的起始地址和大小。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00010000  {    ; load region size_regionER_IROM1 0x08000000 0x00010000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x4000  {  ; RW data in RAM .ANY (+RW +ZI)}ER_RAM_CODE 0x20004000 0x1000 {  ; Execution region in RAM for specific functions*.o (.RAM_CODE)}
}

在keil中,打开“Options for Target”,选择“Linker”选项卡,手动选择新生成的.sct文件在这里插入图片描述
2. 手动标记函数:
在函数定义中使用 attribute((section(“.RAM_CODE”))) 明确标记需要放置在RAM中的函数。

__attribute__((section(".RAM_CODE")))
void SPI1_Nss_High(void)
{HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);
}__attribute__((section(".RAM_CODE")))
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET){GPIOx->BSRR = GPIO_Pin;}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;}
}

3.修改启动文件,将指定代码从Flash搬运到RAM:

//修改前.s启动代码
; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0LDR     R0, =__mainBX      R0ENDP
修改后启动代码
RAM_CODE_START    EQU 0x20004000  ; RAM????????
RAM_CODE_SIZE     EQU 0x1000      ; RAM??????
FLASH_CODE_START  EQU 0x08000000
; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0; Copy RAM code section from Flash to RAMLDR     R1, =FLASH_CODE_STARTLDR     R2, =RAM_CODE_STARTLDR     R3, =RAM_CODE_SIZE
Copy_RAM_CodeLDRB    R0, [R1], #1STRB    R0, [R2], #1SUBS    R3, R3, #1BNE     Copy_RAM_Code; Enter the C runtime environmentLDR     R0, =__mainBX      R0ENDP
  1. 重新编译项目
    在Keil中选择“Rebuild All”来重新编译项目。
  2. 查看生成的.map文件,确保目标函数被正确放置在RAM中。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 -- 函数

C语言 -- 函数 1. 函数的概念2. 库函数2.1 标准库和头文件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做…

第二十九章 面向对象(Python)

文章目录 一、面向过程二、面向对象1、对象2、类3、类与对象的关系 一、面向过程 面向过程编程&#xff08;POP&#xff09;&#xff1a;按照业务逻辑从上到下设计程序的方式。 特点&#xff1a; 用一长段代码来实现指定功能&#xff0c;一步接一步&#xff0c;环环相扣。 缺点…

Element中的消息提示组件Message和弹框组件MessageBox

简述&#xff1a;在 Element UI 中&#xff0c;Message和MessageBox都是比较常用的组件&#xff0c;Message用来提示消息&#xff0c;而MessageBox是一个用于创建模态对话框的组件。它可以用于在页面上快速展示信息、警告或错误提示&#xff0c;而不会阻止用户的其他操作。简单…

速盾:cdn跟bgp

CDN&#xff08;内容分发网络&#xff09;和BGP&#xff08;边界网关协议&#xff09;是互联网领域中两个重要的技术&#xff0c;它们在不同的层面上提供了网络性能和可用性的优化。本文将重点介绍CDN和BGP的概念、工作原理以及它们在互联网中的应用。 首先&#xff0c;我们来…

116-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

一、板卡概述 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡。由一片Xilinx公司的XC5VLX110T-1FF1136 / XC5VSX95T-1FF1136 / XC5VFX70T-1FF1136芯片组成。FPGA接1片DDR2内存条 2GB&#xff0c;32MB Nor flash存储器&#xff0c;用于存储程序。外扩 SATA、PCI、PCI expres…

【期末复习】数据库系统概论(附带考点汇总)

第1章.绪论 目录 第1章.绪论1.1. 数据库系统概述1.1.1.基本概念1.1.2.产生和发展 1.2.概念模型1.2.1.三种模型1.2.2.概念模型1.2.3.关系模型 1.3.数据库系统结构1.3.1三级模式结构1.3.2.两级映像与数据独立性 第2章.关系型数据库2.1.关系2.2.关系操作2.2.1.基本关系操作2.2.2.关…

SALOME源码分析:View Model

作为一款开源的CAx(CAD/CAE/CAM)软件集成平台&#xff0c;为了实现各个Module支持不同的数据显示与交互方案&#xff0c;出于扩展性的考虑&#xff0c;SALOME引入了View Model&#xff0c;用以支持OpenGL、OCC、VTK、ParaView、Qwt等数据显示与交互实现。 本文将以OCCViewer、…

K8S 加入节点 网络插件flannel问题修复cni plugin not initialized

问题现场 查看kubelet日志 journalctl -xefu kubelet #异常&#xff0c;error: cni plugin not initialized Nov 07 16:12:56 VM-0-5-centos kubelet[2278204]: E1107 16:12:56.747955 2278204 kubelet.go:2855] "Container runtime network not ready" networkRead…

Oracle HTTP Server(OHS)与Oracle数据库的紧密绑定

Oracle HTTP Server&#xff08;OHS&#xff09;与Oracle数据库的紧密绑定通常是通过一系列的配置和集成步骤来实现的。以下是这些步骤的详细归纳&#xff0c;包括必要的分点表示和参考信息&#xff1a; 一、安装和配置Oracle HTTP Server 安装OHS&#xff1a; 在安装Oracle…

昇思25天学习打卡营第16天|Diffusion扩散模型

导入必要的库函数 import math from functools import partial %matplotlib inline import matplotlib.pyplot as plt from tqdm.auto import tqdm import numpy as np from multiprocessing import cpu_count from download import downloadimport mindspore as ms import mi…

Python基于卷积神经网络分类模型(CNN分类算法)实现时装类别识别项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在深度学习领域&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks, CNNs&#xff0…

React vs Vue:谁是构建现代Web应用的王者?

在前端开发领域&#xff0c;React 和 Vue 是两大备受推崇的框架&#xff08;React实为库&#xff09;&#xff0c;各自拥有庞大的社区和丰富的生态系统。本文旨在深入探讨这两者之间的区别&#xff0c;通过代码示例来分析它们各自的优势和适用场景&#xff0c;从而帮助开发者做…

【架构-20】死锁

什么是死锁&#xff1f; 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: &#xff08;1&#xff09;互斥条件(Mutual Exclusion)&#xff1a;至少有一个资源是非共享…

Elasticsearch:结合稀疏、密集和地理字段

作者&#xff1a;来自 Elastic Madhusudhan Konda 如何以自定义方式组合多个稀疏、密集和地理字段 Elasticsearch 是一款强大的工具&#xff0c;可用于近乎实时地搜索和分析数据。作为开发人员&#xff0c;我们经常会遇到包含各种不同字段的数据集。有些字段是必填字段&#x…

力扣2615.等值距离和

力扣2615.等值距离和 分组求距离和 class Solution {public:vector<long long> distance(vector<int>& nums) {int n nums.size();unordered_map<int, vector<int>> groups;for (int i 0; i < n; i)groups[nums[i]].emplace_back(i);vecto…

python开发基础——day10 复习2

一、复习 流程控制语句 三大执行方式&#xff1a; 1.顺序执行&#xff1a;程序从上往下依次执行 2.选择执行&#xff1a;根据条件满足与否&#xff0c;循环执行对应的代码 以上提到的条件满足&#xff0c;都是基于bool来判断 if 选择执行/分…

relation-graph——数据组装+鼠标移入后的详情(自定义插槽的用法)——js技能提升

最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff0c;就是给我一些节点&#xff0c;让我渲染到页面上&#xff0c;效果图如下&#xff1a; 之前写过一篇文章关于relation-graph关系图组件http://t.csdnimg.cn/7BGYm的用法 还有一篇关于relation-graph——实现右击…

回溯算法-以单位人事管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法&#xff0c;它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤&#xff1a; 1、 针对所给问题&#xff0c;定义问题的解空间&#xff0c;它至少包含问题的一个&#xff08;最优&#xff09;解。 2 、确定易于搜…

Mac挂载NTFS移动硬盘进行读写操作

在Mac上&#xff0c;默认情况对NTFS磁盘的挂载方式是只读(read-only)的&#xff0c;其实Mac原生是支持NTFS的&#xff0c;但是后来由于微软的限制&#xff0c;苹果把这个功能给屏蔽了&#xff0c;但是我们可以通过命令行方式打开这个选项。 接入移动硬盘后&#xff0c;我们首先…

rk3568 OpenHarmony 串口uart与电脑通讯开发案例

一、需求描述&#xff1a; rk3568开发板运行OpenHarmony4.0&#xff0c;通过开发板上的uart串口与电脑进行通讯&#xff0c;相互收发字符串。 二、案例展示 1、开发环境&#xff1a; &#xff08;1&#xff09;rk3568开发板 &#xff08;2&#xff09;系统&#xff1a;OpenHar…