.isr_table 部分可以存储一些常量吗? STM32F1微控制器
Can some constants be stored in .isr_table section? STM32F1 microcontroller
背景
我有一些微控制器经验(Atmel AVR、PIC18、PIC32),但我是 STM32 的新手。
我需要 maintain/refresh 另一个开发人员编写的旧项目,由于某些原因无法解释这段代码。基本上整个项目需要从 CooCox 转移到 STM32Cube IDE 并且需要认真重构。
除了一件事,我几乎了解该项目中的所有内容。
问题
我发现,.isr_vector
部分中有一些常量。
- 软件版本
- 可能 build/release 日期 (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, 0, 0, 20, 0, 5, 0, 26, 0 };
const unsigned char VECTORS NAME[] = " --------------------";
const unsigned char VECTORS FREE1[] = "---";
我没有这个项目的原始链接器文件,但我相信它是由 CooCox 默认生成的。
我有一些在生产中使用的 hex 文件,我发现 0xCF93(初始序列号)在这里:
我不明白为什么这个数据存储在中断向量 table 部分。
在没有自定义链接器脚本等的情况下将这样的东西存储在某个“已知位置”看起来非常聪明
1.这是STM32编程中的正常/常见做法吗?
2。我如何确定实向量 table 将被正确分配(在这些常量之前)?
“实向量 table”在 startup_stm32f10x_md.c
- 自动生成的 CMSIS 文件中。
这根本不正常,也不是个好主意。
如您所见,它确实有效。这不是一个好主意的主要原因是因为它难以维护,正如您所发现的。
正确的做法是将您的 header 放在自定义命名部分中,然后编辑链接描述文件以将其放在 .isr_vector 之后和 .text 或 .init 等之前
我怀疑设置这个的人要么不想做这项工作,要么不知道怎么做,或者他们使用的 IDE 可能过于简单,不允许自定义链接描述文件。
如果您想继续 hi-jacking 图像的 .isr_vector 部分 header,您可以通过三种方式让真实矢量保持在需要的位置是:
编辑您的链接描述文件以指定 .isr_vector 来自名为 startup* 的文件位于其他文件的同一部分之前(但是如果您正在编辑链接描述文件,您可能会好选择你自己的部分名称)。
编辑项目设置,使启动汇编器单元在链接器命令行中出现的时间早于带有 header 的文件(GNU ld 保留输出中输入部分的顺序,其他人我不知道)
只需祈祷一下,然后检查构建输出以查看它是否有效。这些部分有 50/50 的机会按正确的顺序排列,没有任何变化。
背景
我有一些微控制器经验(Atmel AVR、PIC18、PIC32),但我是 STM32 的新手。
我需要 maintain/refresh 另一个开发人员编写的旧项目,由于某些原因无法解释这段代码。基本上整个项目需要从 CooCox 转移到 STM32Cube IDE 并且需要认真重构。
除了一件事,我几乎了解该项目中的所有内容。
问题
我发现,.isr_vector
部分中有一些常量。
- 软件版本
- 可能 build/release 日期 (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, 0, 0, 20, 0, 5, 0, 26, 0 };
const unsigned char VECTORS NAME[] = " --------------------";
const unsigned char VECTORS FREE1[] = "---";
我没有这个项目的原始链接器文件,但我相信它是由 CooCox 默认生成的。
我有一些在生产中使用的 hex 文件,我发现 0xCF93(初始序列号)在这里:
我不明白为什么这个数据存储在中断向量 table 部分。 在没有自定义链接器脚本等的情况下将这样的东西存储在某个“已知位置”看起来非常聪明
1.这是STM32编程中的正常/常见做法吗?
2。我如何确定实向量 table 将被正确分配(在这些常量之前)?
“实向量 table”在 startup_stm32f10x_md.c
- 自动生成的 CMSIS 文件中。
这根本不正常,也不是个好主意。
如您所见,它确实有效。这不是一个好主意的主要原因是因为它难以维护,正如您所发现的。
正确的做法是将您的 header 放在自定义命名部分中,然后编辑链接描述文件以将其放在 .isr_vector 之后和 .text 或 .init 等之前
我怀疑设置这个的人要么不想做这项工作,要么不知道怎么做,或者他们使用的 IDE 可能过于简单,不允许自定义链接描述文件。
如果您想继续 hi-jacking 图像的 .isr_vector 部分 header,您可以通过三种方式让真实矢量保持在需要的位置是:
编辑您的链接描述文件以指定 .isr_vector 来自名为 startup* 的文件位于其他文件的同一部分之前(但是如果您正在编辑链接描述文件,您可能会好选择你自己的部分名称)。
编辑项目设置,使启动汇编器单元在链接器命令行中出现的时间早于带有 header 的文件(GNU ld 保留输出中输入部分的顺序,其他人我不知道)
只需祈祷一下,然后检查构建输出以查看它是否有效。这些部分有 50/50 的机会按正确的顺序排列,没有任何变化。