如何在 Cortex-M3 (STM32) 上从 RAM 执行函数?

2023-11-23

我正在尝试从 Cortex-M3 处理器 (STM32) 上的 RAM 执行函数。该函数会擦除并重写内部闪存,所以我肯定需要在 RAM 中,但我该怎么做呢?

我尝试过的是:使用 memcpy 将函数复制到 RAM 中的字节数组(检查它是否正确对齐),设置函数指针指向字节数组,然后调用函数(指针)。

这对于大约 10 条指令来说效果很好(我可以使用调试器跟踪执行情况),但随后我收到总线错误并且处理器重置。总线错误发生在第二次通过循环时,因此代码应该没问题(因为它在第一次通过时有效)。我认为更快的 RAM 访问会以某种方式扰乱总线时序......

无论如何,有正确的方法可以做到这一点吗?自动将函数放入 RAM 的分散文件会是什么样子(我正在使用 Keil uVision for Cortex-M3)?

编辑:更多信息: 工具链:RealView MDK-ARM V 4.10 编译器:Armcc v4.0.0.728 汇编器:Armasm v4.0.0.728 链接器:ArmLink v4.0.0.728 处理器:STM32F103ZE

当复位发生时,总线故障寄存器中的 IMPRECISERR 位被置位。


循环迭代时崩溃可能是因为该函数分支到绝对地址,并且与 RAM 中的新函数位置无关。由于闪存擦除操作,此时访问原始代码位置是否会导致总线错误?

我相信您可以通过附加以下内容来使用 CARM 正确标记要编译并复制到 RAM 的函数__ram指向函数定义的指令。有关如何使用 RealView 编译器执行相同操作的说明,请参阅执行 RAM 中的函数技术支持文章:

µVision 允许您定位模块 到特定的内存区域 在对话框中输入项目 - 选项 - 目标。这样做就对了 单击源文件(或文件组) 并打开对话框选项 - 特性。然后选择内存 下的地区内存分配.

文件夹中有一个例子ARM 示例RAM_Function.

这应该生成启动代码来负责将函数复制到 RAM 并将调用正确链接到该位置。否则,如果您需要动态地将任意函数复制到 RAM,那么请考虑编译位置无关代码 (PIC)与 RealView。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Cortex-M3 (STM32) 上从 RAM 执行函数? 的相关文章

  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • C++ 返回值、引用、const 引用

    你能向我解释一下返回值 值引用和值常量引用之间的区别吗 Value Vector2D operator const Vector2D vector this gt x vector x this gt y vector y return t
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 按值返回的函数的返回语句中的初始化

    我的问题源于深入研究std move in return语句 例如以下示例 struct A A std cout lt lt Constructed lt lt this lt lt std endl A A noexcept std c
  • 从 exit() 和 fork() 返回的结果奇怪地发生了位移

    我有一个 C 代码 有时会自行分叉 每个分叉都会执行一些操作 然后返回一个错误代码 目前 每个子进程返回其 ID 0 n void other int numero exit numero int main for int i 0 i lt
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include

随机推荐

  • 无边框窗口无法正确最大化

    好吧 我已经在谷歌上搜索了几个小时了 似乎找不到我遇到的问题的直接答案 我有一个自定义窗口WindowStyle None and AllowsTransparency True 当我点击最大化按钮时 private void Maximi
  • 检测phonegap应用程序中的卸载事件

    当用户安装我的应用程序时 我注册他的注册 ID android 或设备令牌 iOS 并发送工作正常的推送通知 但现在我想在卸载应用程序时从服务器中删除用户 如何在 Phonegap 中完成此操作 获取一个事件 之后我可以取消注册用户注册 I
  • 在 Django 模型中存储列表最有效的方法是什么?

    目前我的代码中有很多类似于以下内容的 python 对象 class MyClass def init self name friends self myName name self myFriends str x for x in fri
  • 计算 BST 中左节点的数量

    给定 BST 我需要找到树的左节点数 示例 3 5 2 1 4 6 7 答案应该是 4 因为 5 1 4 7 都是树的左节点 我想做的是 public int countL
  • R 中的 par(mfrow) 用于 ggplot [重复]

    这个问题在这里已经有答案了 我有这个代码 plotfn function u flt filter d utensil u ggplot flt aes x p geom histogram binwidth 0 5 position po
  • MySQL - 强制不使用缓存来测试查询速度

    我正在测试 MySQL 中某些查询的速度 数据库正在缓存这些查询 这使得我在测试这些查询的速度时很难获得可靠的结果 有没有办法禁用查询缓存 系统 Linux 虚拟主机上的 MySQL 4 我可以访问 PHPMyAdmin Thanks 尝试
  • Ruby gem mysql2 安装失败[重复]

    这个问题在这里已经有答案了 当我尝试安装 mysql2 gem 时 它失败了 没有明显的错误 有谁知道如何解决这个问题以便安装mysql2 sudo gem install mysql2 Building native extensions
  • “multipart/form-data”POST 请求实际上应该包含带有上传图像数据的字符串吗?

    我正在为一个 Web 应用程序创建一些性能测试 该应用程序发送的请求类型与浏览器发送到我们的服务器的类型相同 其中一个请求是上传图像的 POST 我在看这个问题看起来图像文件的实际内容应该位于请求正文内 然而 当我在 Chrome 中使用
  • 如何检查设备是否为 iPad 或 iPhone 无法正常工作

    我目前正在更新一个应用程序 我需要知道该应用程序是否正在 iPad 上使用 我上网查了一下 发现了下面的代码 我在 Xcode 中使用了 iPad 模拟器并运行了两个 if 语句 但是每当我运行代码时 什么也没有发生 打印消息不打印 此代码
  • 密封一个类

    过去我并没有太在意封闭班级 但我发现自己想知道最好的做法是什么 如果您知道一个类不会或不应该从中派生 您是否会将其密封 作为预防措施 只是将密封关键字保留在外 因为知道有人尝试从中派生的机会很小 我想我要问的是 您是否应该密封所有不打算用于
  • 如何将 EC2 实例分配给子网内的固定 IP 地址?

    我正在使用 CloudFormation 定义子网和 EC2 实例 我想为 EC2 实例分配特定的私有 IP 地址 并尝试使用如下资源定义来实现此目的 当我尝试部署模板时 NetworkInterface 资源的创建失败并显示以下消息 地址
  • Django Rest Framework - 如何在序列化器中嵌套多个字段?

    我有几个带有多个控制字段的基本模型 其中位置字段由纬度 经度 精度 提供商和客户时间组合而成 我的大多数可写模型 以及资源 都是从这个基本模型继承的 我试图让 DRF 序列化嵌套 位置 字段中的位置相关字段 例如 id 1 name Som
  • MYSQL 禁用自动修剪

    如果我输入两个只有空格的字符串 我会收到此错误消息 错误 1062 键 PRIMARY 的条目 重复 如何关闭 自动修剪 我正在用这个Charset uft8 uft8 bin和这个数据类型 Varchar 根据SQL 92根据文档 当比较
  • 如何使用 RxJs 推迟任何 AJAX 调用请求,直到前一个请求解决

    我有一个可观察的对象 它表示由某些外部组件触发的操作 为了这个问题的目的 我们将其称为createBananaAction 我有一个bananaService用一种方法create执行 AJAX 请求并返回创建的香蕉作为Promise 因此
  • 对包含引号的字符串使用替换运算符 powershell

    我正在寻找运行命令 foreach object replace 然而 我尝试使用的字符串可以描述如下 this string has quotes 整条线是 foreach object replace this string has q
  • Beautiful Soup 根据部分属性值查找标签

    我试图根据部分属性值来识别 html 文档中的标签 例如 如果我有一个 Beautifulsoup 对象 import bs4 as BeautifulSoup r requests get http My Page soup Beauti
  • 如何找到两个地址之间的距离? (Java服务器端)

    我正在开发一个 社交 地理感知应用程序 价值数百万美元的问题是如何列出 我的位置 X 英里内 的一组项目 因为有数百万个应用程序可以做到这一点 我惊讶地发现只有 Google Maps API 具有免费的网络服务 更糟糕的是 只有在 Goo
  • CSS 固定容器内的 div

    如何将固定 div 包含在 div container 中 其中固定 div 仅固定在 div container 中 而不是页面的其余部分 这意味着如果我向下滚动页面 在容器 div 之外 固定 div 不会滚动 很难解释 看这个例子 h
  • 由于函数排序导致 JSLint“超出范围”错误?

    JSLint 似乎对函数排序很挑剔 这很好 function a use strict return 1 function b use strict a 虽然这给出了 a is out of scope错误信息 function b use
  • 如何在 Cortex-M3 (STM32) 上从 RAM 执行函数?

    我正在尝试从 Cortex M3 处理器 STM32 上的 RAM 执行函数 该函数会擦除并重写内部闪存 所以我肯定需要在 RAM 中 但我该怎么做呢 我尝试过的是 使用 memcpy 将函数复制到 RAM 中的字节数组 检查它是否正确对齐