问题标签 [srecord]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
crc32 - 扩展 SRecord 以处理 crc32_mpeg2?
问题陈述:
我正在使用具有专用 CRC 硬件模块的 Kinetis L 系列(ARM Cortex M0+)。通过反复试验并使用这个出色的在线 CRC 计算器,我确定 CRC 硬件配置为计算 CRC32_MPEG2。
我想使用srec_input(SRecord 1.64的一部分)为 .srec 文件生成 CRC,其结果必须与硬件计算的 CRC_MPEG2 匹配。但是,srec 的内置 CRC 算法(CRC32 和 STM32)不会生成与 CRC_MPEG2 相同的结果。
问题:
有没有一种直接的方法来扩展 srec 来处理 CRC32_MPEG2?我目前的想法是分叉 srec 源代码树并对其进行扩展,但似乎有人已经走上了这条路。
或者,有没有办法让 srec 调用外部程序?(快速扫描后我没有看到。)这也可以解决问题。
一些细节
硬件CRC32算法的参数为:
- 输入反射:否
- 输出反射:否
- 多项式:0x4C11DB7
- 初始种子:0xFFFFFFFF
- 最终异或:0x0
为了测试它,输入字符串:
应该导致 CRC32 值:
首先是什么产生了CRC值?
为回应 Mark Adler 提出的恰当问题,固件使用飞思卡尔 fsl_crc 库来计算 CRC。相关代码和参数(略有编辑)如下:
memory - 为微处理器的两个不同区域复制可执行文件。记录?制作?
这是一个关于性能的问题,我为此苦苦挣扎了一段时间,而我的 google-fu 并没有帮助我找到修复它的方法。
我正在为嵌入式项目交叉编译应用程序。代码所在的微处理器的内存被分成两半,我可以决定从 address_0 或 addres_max/2 运行软件。
目前我有一个静态库,它链接到 main 两次。
和一个完全相同的链接到另一个区域。
基本上 main 的编译执行了两次,链接执行了两次,参数不同。
我为很多目标复制了这个操作,基本上我想清理代码以缩短编译时间。
我现在的问题是2:
- 有人知道如何在不编译的情况下重新定位代码吗?我阅读了关于 srecord 的信息,但我不确定是否可以将其用于此目的。
- 有人知道如何在不创建另一个目标的情况下更改 cmake 中的链接标志吗?
c - s37和elf文件的区别
我使用嵌入式系统。在 C 源代码构建之后,我得到了很多文件。文件名相同,但扩展名不同:
.s37 .elf .hex .sig
它们之间有什么区别?主要是.s37和.elf有什么区别?
谢谢,L。
c - 是否可以在 SRecord 中使用非绝对地址范围并将一些数据粘贴到二进制文件的最后一个字节上?
我正在使用 STM32CubeIDE(带有 gcc 编译器的基于 Eclipse 的 IDE)为 ARM Cortex-M4 微控制器制作项目,并希望将整个固件的 CRC 嵌入到二进制文件的末尾。我已经修改了链接器脚本以创建一些放置在已编译二进制文件末尾的变量。这是我对链接器脚本的修改:
这是C中上述变量的声明:
使用链接描述文件创建的最后一个变量应该存储整个固件的 CRC32。我想使用 SRecord 脚本来计算 CRC 值,并希望能够像 C 代码中的普通变量一样引用它的值。
我的目标是制作 SRecord 脚本,它将使用-binary
格式打开文件,用 SRecord 计算的 CRC32 替换最后 4 个字节,并用替换的 CRC 值进行输出。但我不明白如何将非绝对地址范围-crop
放入或-exclude
过滤器。我想做这样的事情:
我的问题是:是否有可能以及如何在 SRecord 中使用相对地址?或者是否有可能以及如何用 SRecord 覆盖二进制文件末尾的一些数据?
关于替代解决方案:我知道我可以从链接器中删除fwCrc变量并创建如下内容:
但这样的解决方案对我来说不可接受。我想要存储 CRC 值的变量。插入一些数据/变量而不是未使用的中断向量元素的解决方案也不可接受。
也许我可以接受fwCrc变量不分配任何内存并使用 SRecord 将 CRC 附加到二进制文件末尾的解决方案,但我不知道如何强制链接器不为 C 代码中使用的变量分配内存。
c - 使用 GHS MULTI 填充链接器脚本中的内存空白
在 GHS MULTI 中构建代码后,我的 .srec 文件中有一些内存空白。我尝试过 =fill 和 FILL() 命令,但没有任何变化。任何人都可以提出解决方案。我需要一个可以在链接器脚本中使用的解决方案。
任何人都可以提供一些完整的 =fill 和 FILL() Section 属性的工作示例。
我试过如下,SECTIONS { .text CLEAR : FILL(0xFF) >. 或 .text 填充(0xFF):>。或 FILL(0xFF) .text : > 。或 .text = 0xFF : > 。或 .text : > 。=0xFF 或 .text : =0xFF > . 我已经尝试了所有提到的场景,但是在所需的位置没有填充内存,并且当使用 clear 时,一些内存在结束地址处被框住(首先它是 .srec 中的 S315,但是当使用 CLEAR 时它变成了 S309)
linker - S-Record 文件中的地址来自哪里?
我正在为 ARM Cortex-M 微控制器开发一个独立的应用程序,在研究 S-Record 文件的结构时,我发现我对 S-Record 格式中地址的表示方式存在某种误解。
我在源代码中定义了一个变量,如下所示:
当我运行 objdump 时,我看到变量最终出现在地址 0x1ffe01c4 的 .data 部分中:
这是有道理的,因为我的链接器脚本的内存部分看起来像这样并且 .data 将进入 RAM:
但是,当我检查 srec 文件时,我发现记录的地址不是 0x1FFE0000。它是 0x0005F570,它似乎把它放在了 FLASH 部分(为清楚起见,添加了空格)。
是否在不同的记录条目中编码了隐式偏移量?objcopy 是如何得到这个新地址的呢?如果这个值以某种方式被编码到一个函数中(可能是一些变量的主前初始化)?
最终,我的目标是能够解析 srec 文件并修补 IP 地址值以创建新的 srec 文件。做这样的事情的惯用方式是否只是为了创建一个结构来硬编码一些可以在文件中检测到的前导幻数序列?
c - STM8L001J3 SDCC 和使用 STM 工具集刷新 s19 文件的问题
我刚刚开始将 STM8(一个 STM8L001J3,不幸的是开源工具链支持的最差)与 SDCC 一起使用。由于 ST Visual Programmer 只支持 s19,所以我需要选择这个作为输出格式。查看映射文件,一切似乎都很好,链接器将主函数放置在代码空间 0x8028 开头的稍微后面(就在中断向量后面)。
代码本身如下所示:
我什至设置--code-loc 0x8000
了链接器的选项以正确放置它,当我向 VSCode(带有 EIDE 扩展)询问命令行时,它告诉我以下信息:
当我现在在 ST Visual Programmer 中打开文件时,它会显示:
如果我生成一些英特尔 HEX 文件并将其放入http://www.dlwrr.com/electronics/tools/hexview/hexview.html的在线查看器中,它看起来也不错。
由于我不会流利地说摩托罗拉 s19,也许有人可以给我一个提示。
如果有人可以批准,十六进制很好并将我链接到一个编程工具,在 Windows (10) 上支持这个变体,这也是一个可行的解决方案。