问题描述:量产的产品中发现某数据阈值不合适,需要更改阈值,发现服务器中的源码(keil工程stm32单片机)并非现有hex的源码,由于原有开发人员离职,现在改阈值可以通过直接改hex中的数据;
所需工具:数据比较软件compare++,数据和校验小工具Calcu Check,下载工具jlink V8+jflash软件;
方法如下:
在现有代码中找到要更改的值,发现该阈值在某结构体中,两次更改阈值并通过keil生成新的两个hex文件,通过软件compare++比较这两个hex的差异处,找到阈值的存储方式,如查找到多处则查看前后数据是否对应源码中结构体中其他数据,依次来确定阈值在hex中的存储方式和值;如下图:
通过
明白了每行数据的存储方式为小端模式:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
可见,大端模式和字符串的存储模式类似。
方式(大小端存储)
明白了每行的意思:数据长度1Byte][数据地址2Byte][数据类型1Byte][数据nByte][检验码1Byte]
例如如下:需要修改结构体中的22000,则通过比较法找到差异处(红色字):
const LinerMotorParam XAxisMtParam=
{
24000,//totalsteps 4字节
200,//sensretsteps4字节
0,//orignpos4字节
400,4字节
1,//postdir1字节
0x2 ,//senslimit1字节
}; //
差异处行代码(16进制):1057A00000F00E00DC050000C8002602F0550000E5
由上分析可知10表示16个字节的数据,57A0是存储地址(4个字符表示),00表示类型,之后就是16个字节数据,最后一个是校验码,校验方法该行的所有字节(校验码不加进去)相加,之后用0x100减去和就得到校验码;链接中有说明。
举一个简单的例子,如第一行020000040800F2
0x02+0x00+0x00+0x00+0x04+0x08+0x00 = 0x0E
0x100 – 0x0E = 0xF2.
由此可知差异处的F0550000即是22000,有计算器换算可确认,如下图:
而该行接下面的一行是:1057B000C80000000000000090010000010200008D
其中C800000000000000900100000102分别对应结构体变量中的其他几个数据,由此可以完全确定阈值是否定位准确;
更改22000为24000,即在compare++中将F055改为C05D,另外通过校验和小工具计算更改后的和为0x73(每个字节用空格隔开),并0x100减去0x73得到检验码为0x8D,都更改后保存并通过jflash烧写到stm32中,测试通过;
检验码不正确是无法通过jflash 下载进去的。