【发布时间】:2019-02-13 00:33:00
【问题描述】:
我正在为 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。我已关闭优化,因此编译器不应删除未使用的常量。
【问题讨论】:
-
您创建了一个XY problem。 “我需要应用程序知道引导加载程序的版本(主要、次要、构建)”——这是一种低质量的设计,会给应用程序带来不必要的负担。相反,引导加载程序和应用程序之间的接口应该用相应的版本号明确定义。该版本号如何传递给应用程序是 API 的一部分。
-
@sawdust 为什么你认为这是一个 XY 问题?这是一种在嵌入式系统上识别某些东西的版本的相当常见的解决方案。
-
@sawdust 应用程序需要知道引导加载程序版本的原因是,当不可避免地在引导加载程序的第一个版本中发现错误时,软件可以知道它需要应用解决方法, 如果没有安装没有错误的新引导加载程序。
-
执行此操作的可用方法是特定于工具链的 - 您的工具链是什么?您的工具链无法识别的
#pragma指令将被忽略 - 可能但不一定带有警告。编译器/链接器不需要以任何特定顺序、邻接或对齐方式放置单独的变量 - 使用数组UINT8 VER[] = {0xFE, 0xED, 0xFA, 0xCE} ;来强制执行您想要的顺序和对齐方式。 -
@sawdust,在这种情况下没有 API。引导加载程序和主应用程序是完全独立的实体,并且必须保持如此。根据定义,他们不能互相交谈。引导加载程序在重置超时或完成重新刷新应用程序代码时简单地跳转到应用程序入口点。你确定你不是在考虑 Windows 编程吗?