如何在 STM32 微控制器上的两个程序之间共享单段闪存

Posted

技术标签:

【中文标题】如何在 STM32 微控制器上的两个程序之间共享单段闪存【英文标题】:How to share a single segment of flash memory between two programs on an STM32 microcontroller 【发布时间】:2021-12-19 09:01:33 【问题描述】:

我正在编写一个嵌入式程序,它分为两部分:引导加载程序和应用程序。 (我的目标是 STM32,并使用 Eclipse IDE 用 C 语言进行开发。)

我正在使用显示器,所以我编写了一些函数和 3 种不同的字体。 这个想法是使用微控制器的一个扇区并共享它。 字体区域使用链接器 (ld) 脚本定义,如下所示:

 .mySegment start_of_FONT_segm : KEEP(*(.Courier_New_Bold_20_Section))
 .mySegment1 0x8011298 : KEEP(*(.Terminal6x8_Section))

然后,我用数组写入:

const unsigned char __attribute__((section (".Terminal6x8_Section"))) Terminal6x8[] = 
   0x00,
   0x00,
   ...

但我如何从另一个程序(在本例中为应用程序)读取它?

我试过了:

unsigned char *Terminal6x8 = (volatile unsigned char*)0x08011298;

但编译器会将Terminal6x8 放入RAM。

我也很乐意分享一些函数,但我也不知道如何用 ld 和 C 语法声明它们。

【问题讨论】:

"但是编译器把'Terminal6x8'" 你的意思是指针还是数组也称为Terminal6x8?你为什么给他们取相同的名字?该数组可能需要在文件范围内声明,因此它不能与其他地方的某个指针具有相同的名称。 这两个定义在不同的项目中。第一次写入flash(带“section ...”),其他项目只是读取,但意思是一样的,所以我用同样的方式调用另外两个项目包含不同的#define,所以我可以在代码不考虑它们在哪里。 【参考方案1】:

以下代码行:

unsigned char *Terminal6x8 = (volatile unsigned char*)0x08011298;

由于许多不同的原因而不好:

    它使用固定(硬编码)地址,这不是很好。 它将数据声明为volatile,在这种情况下没有任何意义。 它没有将数据声明为常量。

如果你想让指针也放在闪存中,你应该写:

const unsigned char * const Terminal6x8 = (const unsigned char * const) 0x08011298;

我也很乐意分享一些函数,但也不知道如何在 ld 和 C 语法中声明。

正确的做法是声明一个向量表(ie,一个指针表),其中包含指向数据的指针以及您希望在闪存段之间共享的函数。 p>

【讨论】:

你说得对,我忘了去掉“易失性”这个词。感谢您的建议。【参考方案2】:

确实,指针 *Terminal6x8 已放入 RAM。如果要将指针存储在闪存中,请将其声明为 const。

虽然,*Terminal6x8 指向的数据根据​​需要存储在地址 0x08011298 的闪存中。无论指针存储在何处。

【讨论】:

我不明白OP是指指针还是数组,所以如果没有澄清,这个问题就无法真正回答。如果它是数组,它可能与另一个 Eclipse 链接器失败有关,而且回答起来并不简单。 是的。你是对的,它可能是 OP 所指的数组本身。我没有注意到他也调用了数组Terminal6x8。确实需要OP的澄清。

以上是关于如何在 STM32 微控制器上的两个程序之间共享单段闪存的主要内容,如果未能解决你的问题,请参考以下文章

将 VL53L0X 与 STM32 微控制器一起使用

STM32F4高性能MCU微控制器

如何使用 OpenOCD 通过 JTAG 链批量刷写 STM32 微控制器?

stm32f103微控制器通用定时器的常用工作模式都有哪些

什么是弱函数,它们的用途是什么?我正在使用 stm32f429 微控制器

我应该从哪里获得 STM32 微控制器的头文件?