在特定的内存位置嵌入常数

时间:2019-02-13 00:33:00

标签: c embedded

我正在为NXP S12ZVL32上的嵌入式应用程序编写引导加载程序。我需要应用程序知道引导加载程序的版本(主要,次要,内部版本)。是否可以在引导加载程序源中的特定位置声明常量,以便应用程序可以找到它们?

我尝试在#pragma节的开头声明常量,这样我就知道它从哪里开始。

#pragma CODE_SEG SHADOW_ROM
const UINT8 VER_MAJOR = 0xFE;
const UINT8 VER_MINOR = 0xED;
const UINT16 VER_BUILD = 0xCEFA;

S12是小的字节序,因此我希望能够在生成的.sx文件中搜索FEEDFACE,但是甚至找不到FEED或FACE。我已关闭优化功能,因此编译器不应删除未使用的常量。

3 个答案:

答案 0 :(得分:1)

是的,可以在特定的内存地址处定位一个常量。有多种方法可以完成此操作,并且如何执行此操作的细节从一个工具链到另一个工具链都各不相同。一种方法是在源代码定义中使用特定于编译器的#pragma_attribute_语句来指定常量应位于的内存地址。另一种方法是通过在所需的内存地址处创建一个特殊的内存部分来自定义链接器指令(又名链接器脚本或分散加载)文件。然后,在代码中使用#pragma或其他链接程序指令,将常量放入自定义内存部分。有关详细信息,请参见您的工具链文档。

答案 1 :(得分:0)

首先,定义全局const值将使编译器仅使用该值(作为右值,因为通常不引用MATH_PI的地址)并使用该值在每个地方都可能需要。如果要将常量放置在固定位置,最好的指定方法是在汇编器中。

在我小的时候,我曾经使用whatis Unix命令来查看带有#(@)前缀的字符串,该字符串通常在SCCS修订系统中存储版本信息。当我不得不切换到cvs时,我使用了在每个源文件中定义常量的想法,然后进行搜索(可以使用grep(1)或某些过滤器程序轻松地进行搜索)来扫描二进制文件(是的,程序)以$Id:开头的行,因此我嵌入了以下行:

static const char CVS_id[] = "\n$Id$\n";

在源文件中,当grep(1)查验二进制文件时,我得到了可执行文件中链接的每个模块的完整修订版。

Git本身不会放置版本字符串,但是最好的方法是(因为不需要将内容放入绝对地址中)将版本信息放入具有特定模式的字符串中(git可以放置它)通过 git hook 来为自己服务),不要被扫描代码与其他东西混淆。这样,您只需扫描二进制文件即可获取包含的每个源文件的版本信息。

所有这些都不需要您将事物固定到固定的位置,因此,从我的角度来看,可以为您的内存映射提供更大的灵活性,并为您提供一种更便携式的工作方式。

答案 2 :(得分:0)

假设引导加载程序和主应用程序都在您的控制之下,则可以使引导加载程序跳转到应用程序入口点,并在寄存器中指向版本信息(以及您希望的任何其他信息),以使应用程序执行认为合适的使用。这样就消除了对固定内存位置的任何依赖。