最终写入ROM的数据通常只是构成应用程序的代码和常量数据,因此除了可能被分割成代码和数据之外没有其他结构,如果你创建了它们,可能还有自定义段。这种意义上的结构由链接器脚本或用于构建代码的配置定义。包含该代码/数据的文件可以是原始二进制文件,或编码的二进制格式,例如Intel Hex或Motorola S-Record。
通常,您的工具链也会生成一个目标代码文件,该文件不仅包含代码/数据,还包含调试器使用的符号和调试信息。在这种情况下,当调试器运行时,它会将代码加载到目标(如上面的二进制文件中),并将符号/调试信息加载到主机以允许源级调试。这些文件可以是特定于工具链的专有目标文件格式,但通常是标准的“开放”格式,例如ELF。但是严格地说,目标文件的元数据组件不是其中的一部分 固件 因为它们没有加载到目标上。
大多数工具输出ELF或COFF,或类似的东西,最终可归结为HEX / bin文件。
然而,这不一定是你的目标想要看到的。每个供应商都有自己的“固件”文件格式。有时它们是加密和签名的,有时是纯文本。有时会有压缩,有时它是原始的。它可能是一个简单的文件,或者复杂的东西,不仅仅是你的程序。
嵌入式工作的一个组成部分是构建流程和系统启动/启动过程,以及将代码放到部件上。不要低估这种努力。