STM32 上的位置无关代码 - 指针

2024-03-08

我已成功在 STM32 上构建并运行位置无关的代码。向量表和 GOT 已修补。一切正常,但我对这样的代码有问题。

double myAdd(double x) {
   return x + 0.1;
}

double (*ptrmyAdd)(double) = &myAdd;

char* myString = "foo bar";

int main() {
   ...
   printf("%s %2.2f\n", myString, ptrmyAdd(0.1));
   ...
}

我仅在应用程序没有偏移量(相对于闪存基地址)时工作。原因显而易见,myString and ptrmyAdd指向 .rodata 和 .text 没有正确的偏移量。

我能做些什么?我可以在运行时重新初始化指针。

int main() {
   ...
   myString = "foo bar";
   ptrmyAdd = &myAdd;
   printf("%s %2.2f\n", myString, ptrmyAdd(0.1));
   ...
}

它适用于任何偏移量。

为了修复指向 .rodata 的指针,我可以腾出一些 RAM 并将 .rodata 移动到 RAM,但我无法将 .text 移动到 RAM。

我还可以在启动时运行 .data 部分并更新所有看起来像闪存地址的值,但这很危险。

有没有办法在 main() 之前修复这些指针?

为什么我需要位置无关的代码。系统看起来像这样...

*--------*
|        |
|        |
|  APP2  | Application bank 2
|        |
|        |
*--------* 0x08084000
|        |
|        |
|  APP1  | Application bank 1
|        |
|        |
*--------* 0x08008000
|        |
|  INFO  | Application info area
|        |
*--------* 0x08007800
|        |
|  LDR   | Bootloader area
|        |
*--------* 0x08000000

引导加载程序通过 y-modem 协议将应用程序映像下载到标记为“未激活”的第一个可用库。引导加载程序将新的存储体设置为“活动”和“有效”,并将先前的“活动”存储体设置为“不活动”。重置引导加载程序后,从“活动”库启动应用程序。在应用程序启动之前,引导加载程序会激活 IWDG。

如果重置来自 IWDG,则引导加载程序会检查“非活动”存储区是否有有效应用程序。如果它包含“有效”应用程序,引导加载程序会将活动组标记为“无效”并交换活动组。

执行更新的用户不知道哪个银行是免费的。引导加载程序决定使用哪个银行。


None

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

STM32 上的位置无关代码 - 指针 的相关文章

  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 如何处理程序版本更新时数据结构的变化?

    我做嵌入式软件 但我想这并不是一个真正的嵌入式问题 我不 由于技术原因不能 使用像 MySQL 这样的数据库 只使用 C 或 C 结构 是否存在关于如何处理这些结构在程序版本之间的布局变化的通用原理 让我们拿一本地址簿 从程序版本 x 到
  • 在哪里可以找到有关嵌入式 C++ 的信息?

    我想查找有关 嵌入式平台中的 C 编程 的信息 我用谷歌搜索 但无法找到有关该主题的足够信息 我到底想找到的是 C 在嵌入式环境中到底如何有用 并带有详细的描述和示例 如果可用 如果我能得到 任何人都可以建议任何链接或任何免费电子书下载吗
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 全局变量在函数调用之间是否刷新?

    我正在编写嵌入式固件 发现有时很难决定何时需要易失性 当我有一个等待中断更改某个布尔标志的函数时 很明显该标志需要是易失性的 因为否则该函数将永远等待 因为编译器没有意识到该值可以通过打断 但是 当我有一个只检查第一行中的标志的短函数时 我
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 可以工作吗?

    我试图了解将在 x86 Windows 10 上运行的 C MFC 应用程序移植到具有 Qualcomm Snapdragon 处理器的 ARM Windows 10 设备的障碍 32位应用程序具有以下特点 MFC 与 C 用于用户界面 C
  • 为什么我会收到此 Android Studio 错误:“使用 -fPIC 重新编译”?

    我正在使用 NDK 18 并使用 x86 64 NDK 独立工具链单独编译静态库 我可以成功链接它 但是当我尝试以一种不平凡的方式访问该库时 我在构建时遇到了许多错误 例如 requires dynamic R X86 64 PC32 re
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb
  • 在 Intel 机器 (Mac) 上构建 ARM 架构的 Docker 镜像

    我希望能够从我的 Mac 构建 ARM 的 Docker 映像 我知道我可以使用 QEMU 在 Mac 上运行 ARM 容器 但我不知道如何为 ARM 构建 现在这有点复杂 我相信在不久的将来 docker 会让这一切变得更容易 基本上 您
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w

随机推荐

  • ListView 滚动 - 一项一项

    我有一个必须一次显示 4 个项目的 ListView 我必须一项一项地滚动 用户滚动 ListView 后 我必须重新调整滚动以适合 4 个项目 我的意思是 我无法将某个项目显示一半 还有一个问题 有没有办法获取当前ListView的scr
  • 如何为 Azure 表存储 REST 请求生成 SharedKeyLite

    我尝试使用 Postman 调用 Azure 表存储 但不断收到 服务器无法验证请求 确保值 授权标头格式正确 包括签名 我在 Postman 中用于预调用脚本的代码如下 var storageAccount mystorageaccoun
  • Python selenium:显式等待加载两个元素之一

    有没有一种方法可以让我等待两个元素之一加载到硒中 我正在使用显式等待 到目前为止 还无法找到解决方案 简单地做 WebDriverWait driver 5 until lambda driver driver find element B
  • jQuery Mobile 背景图像未显示在全屏 iPad Web 应用程序上

    我已经在 data role page 元素上设置了背景 如下所示 div style background transparent url img background jpg no repeat 它在桌面浏览器和 iPad safari
  • 有没有类似Codecademy for Java的东西[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有谁知道像这样的网站代码学院 http www codecademy com专注于 Java 编程教学 Codeacademy com 使用 Java
  • 在没有验证的情况下模仿验证行为

    我们的应用程序中有几个数据对象最终绑定到网格 我们让它们实现 IDataErrorInfo 接口 以便通过向属性添加错误消息 我们可以看到行标题更改样式并且 DataGridCell 获得红色边框 一切都很好 我们现在有一个额外的要求 即我
  • PostgreSQL INSERT FROM SELECT 带有附加列

    我有桌子T1在数据库中DB1和桌子T2在数据库中DB2 这些表具有几乎相同的列集 除了列C additional in T1 它不存在于T2 我需要传输所有行T2 to T1 设置某个值C additional对于我插入的每一行 例如 T1
  • 如何使用 Ionic 3 将 Node JS 升级到 v14.x?

    根据我在这个 TS Node 项目中遇到的错误 对于简单的 TypeScript 仅 REST API 建议的修复 此处提到 https github com heineiuo rippledb issues 148 https githu
  • 在 Cakephp 中插入数据时出现问题

    在执行 add 方法后的数据库中 我仅检索外键 tarid id 其他字段为空这是我的粘附模型代码 感谢您的回答
  • 对字符串中的复杂分隔符序列使用随机 Unicode 是否安全?

    问题 从程序稳定性和确保系统实际运行来看 使用像这样的字符有多安全 or 对于字符串中的复杂分隔符序列 我可以可靠地相信我不会在错误读取这些内容的程序中遇到任何问题吗 我正在使用 C 代码的系统中工作 在该系统中我必须在单个字符串中存储一组
  • 如何通过 async/await 找到哪个方法“挂起”?

    在 旧 时代 跟踪哪个方法挂起非常容易 只需转到调试器 点击 暂停 按钮并查看堆栈跟踪即可 然而 现在 如果问题出在异步方法中 则这种方法不起作用 因为要执行的下一段代码被埋在延续任务中的某个地方 从技术上讲 它甚至不会挂起 有没有办法这样
  • 如何在 C# 中调用批处理文件(.bat)?

    如何在 C 中调用批处理文件 bat See 从 C 执行命令 http www codeguru com csharp csharp cs misc dllsandexecutables article php c14441 public
  • Python 正则表达式识别字符串中的城市名称

    使用 Python 3 4 中的正则表达式 如何从下面的文本中提取城市名称 replacement windows in seattle wa basement remodeling houston texas siding contrac
  • 这个视图没有约束,它只有设计时位置,所以它会跳转到(0,0),除非你添加约束

    该视图不受约束 它只有设计时位置 因此除非添加约束 否则它将跳转到 0 0 布局编辑器允许您将小部件放置在画布上的任何位置 并使用设计时属性 例如layout editor absoluteX 记录当前位置 这些属性不会在运行时应用 因此如
  • 使用 enquo 通过 ddplyr 创建函数时出错

    在此输入图像描述 https i stack imgur com Z48fD png 我有上面的数据 我想根据 SalesInThousand 变量的平均值聚合一些变量 我正在创建一个函数并在循环中运行它 这样我就不会重复 这就是我正在做的
  • 从 BufferedImage 获取像素数据

    我需要从 BufferedImage 获取像素数据 以便可以从数据重新创建图像 我调查了Raster 但这似乎不包含我需要的信息 我怎样才能从a获取数据BufferedImage这样我就可以重新创建图像而不需要原始文件 你应该看看这个问题的
  • React-Native 从 URL 获取 JSON

    我希望我能为这个问题找到一些帮助 我正在使用 React Native 并尝试从名为 Feiertage API 的 API 获取一些数据 https feiertage api de https feiertage api de 基本上返
  • 模板类型定义的新“using”语法解决了什么问题?

    在 C 11 中 您可以通过执行类似的操作来创建 类型别名 template
  • NSDate() 或 Date() 显示错误的时间

    当我尝试记录当前日期时 print NSDate or print Date 在 Swift 3 中 或者任何日期对象 它显示错误的时间 比如现在大约是16点12分 但是上面显示的是 2016 10 08 20 11 40 0000 我的约
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd