微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一些常量可以存储在 .isr_table 部分吗? STM32F1微控制器

如何解决一些常量可以存储在 .isr_table 部分吗? STM32F1微控制器

背景

我有一些微控制器经验(Atmel AVR、PIC18、PIC32),但我对 STM32 还很陌生。

我需要维护/刷新其他开发人员编写的一些旧项目,由于某些原因无法解释此代码。基本上整个项目都需要从 CooCox 迁移到 STM32Cube IDE,并且需要认真重构。

除了一件事之外,我几乎了解该项目中的所有内容


问题

我发现,.isr_vector 部分中有一些常量

  • 软件版本
  • 可能是构建/发布日期 (2020-05-26)
  • 序列号(稍后在设备编程之前在 .hex 文件中覆盖)

代码和详细信息

#define VECTORS __attribute__ ((section (".isr_vector")))

#define VERSION 0x0348

// (...)

#define VERSION_L(VERSION&0xFF)
#define VERSION_H(VERSION>>8)

// (...)

const unsigned char VECTORS FREE3[]         = "-------";
const unsigned char VECTORS SERIAL_NUMBER[] = {0xcf,0x93};
const unsigned char VECTORS FREE2[]         = "-----";
const unsigned char VECTORS VERSION[]       = {VERSION_L,VERSION_H,20,5,26,0 };
const unsigned char VECTORS NAME[]          = " --------------------";
const unsigned char VECTORS FREE1[]         = "---";

我没有这个项目的原始链接文件,但我相信它是认的,由 CooCox 生成

我有一些用于生产的十六进制文件,我发现这里有 0xCF93(初始序列号):

hex file preview

我不明白为什么这个数据存储在中断向量表部分。 在没有自定义链接器脚本等的情况下,将此类内容存储在某个“已知位置”看起来非常聪明。

1.这是 STM32 编程中的正常/常见做法吗?

2.我怎样才能确定真正的向量表会被正确分配(在这些常量之前)?

“实向量表”在 startup_stm32f10x_md.c - 自动生成的 CMSIS 文件中。

解决方法

这根本不是一个好主意。

正如你所看到的,它有效。这不是一个好主意的主要原因是因为它很难维护,正如您所发现的那样。

正确的做法是将标题放在自定义命名的部分中,然后编辑链接描述文件,将其放在 .isr_vector 之后和 .text 或 .init 等之前。

我怀疑设置它的人要么不想做这项工作,要么不知道如何做,或者他们使用的 IDE 过于简单,无法允许自定义链接器脚本。

如果您想继续劫持图像标题的 .isr_vector 部分,可以通过三种方法使真实矢量保持在需要的位置:

  1. 编辑您的链接描述文件以指定来自名为 startup* 的文件中的 .isr_vector 位于来自其他文件的相同部分之前(但如果您正在编辑链接描述文件,您也可以选择您自己的部分名称)。

  2. 编辑项目设置,使启动汇编器单元在链接器命令行上出现的时间早于带有头文件的文件(GNU ld 保留输出中输入部分的顺序,其他的我不知道)

  3. 只需交叉手指,然后检查构建输出,看看它是否有效。有 50/50 的几率各部分按正确顺序排列,没有任何变化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。