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 上的位置无关代码 - 指针 的相关文章

  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • WinForms 中如何处理不可见控件的绘制?

    我正在尝试覆盖OnPaintwindows窗体中的事件 NET 紧凑框架 到目前为止 我已经能够使用渐变 圆角矩形等来绘制控件 而这通常是常规控件无法实现的 但是 当我想让控件不可见时 我遇到了问题 现在 我所做的就是重新绘制除那些不可见控
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 下载控制板软件模拟器

    我有兴趣学习如何用 c 进行嵌入式系统编程 但是 我需要一些硬件 我想知道有什么软件可以模拟控制板的功能吗 控制板在下面的教程中列出 http www learn c com hardware htm http www learn c co
  • 浮点线性插值

    在两个变量之间进行线性插值a and b给定一个分数f 我目前正在使用这段代码 float lerp float a float b float f return a 1 0 f b f 我认为可能有一种更有效的方法 我使用的是没有 FPU
  • 头文件中的内存分配

    我工作的公司有针对嵌入式目标的 C 开发的开发规则 一是 建议不要在头文件中分配任何存储空间 我不确定这意味着什么 写它的人不在身边 其他开发人员也不在乎 所以我在这里问 我的理解是 我不应该在头文件中声明变量 因此在 h 中不鼓励类似的操
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • 如何查找 C++ 中的内存泄漏

    在嵌入式环境中检测 C 内存泄漏的好方法是什么 我尝试重载 new 运算符来记录每个数据分配 但我一定做错了什么 这种方法不起作用 还有其他人遇到过类似的情况吗 这是 new 和 delete 运算符重载的代码 EDIT 完全披露 我正在寻
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • C 相同结构不同尺寸

    我的问题与此相关 c 在struct中定义不同大小的数组 https stackoverflow com questions 17956697 c define arrays in struct with different sizes 但
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • Qt 的 sysroot 和前缀选项的实际示例是什么

    我正在查看可以运行的所有选项configureQt 提供的脚本 特别是 qt everywhere opensource src 5 2 0 经过大量搜索后 我确定这些东西充其量记录很少 所以我希望我能得到一些帮助 当我查看描述时prefi
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板

随机推荐

  • 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