如何在 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 微控制器上的两个程序之间共享单段闪存的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OpenOCD 通过 JTAG 链批量刷写 STM32 微控制器?