So I'm trying to figure out a way to calculate a CRC with srec_cat
before putting the code on a microcontroller. Right now, my post-build script uses the ielftool
from IAR to do the calculation and insert it into the correct spot in the hex file.
I'm wondering how I can produce the same CRC with srec_cat
, using the same hex file of course.
Here is the ielftool command that produces the CRC32 that I want to replicate:
--checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060000-0x081fffff
APP_SYS_ApplactionCrc
is the symbol where the checksum will be stored with a 4 byte offset addedcrc32
is the algorithm1
specifies one’s complementm
reverses the input bytes and the final checksumi
initializes the checksum value with the start value0xffffffff
is the start value- And finally,
0x08060000-0x081fffff
is the memory range for which the checksum will be calculated
I've tried a lot of things, but this, I think, is the closest I've gotten to the same command so far with srec_cat
:
-crop 0x08060000 0x081ffffc -Bit_Reverse -crc32_b_e 0x081ffffc -CCITT -Bit_Reverse
-crop 0x08060000 0x081ffffc
In a way specifies the memory range for which the CRC will be calculated-Bit_Reverse
should do the same thing asm
in the ielftool when put in the right spot-crc32_b_e
is the algorithm. (I'm not sure yet if I need big endian_b_e
or little endian_l_e
)0x081ffffc
is the location in memory to place the CRC-CCITT
The initial seed (start value inielftool
) is all one bits (it's the default, but I figured I'd throw it in there)
Does anyone have ideas of how I can replicate the ielftool's CRC? Or am I just trying in vain?
I'm new to CRCs and don't know much more than the basics. Does it even matter anyway if I have exactly the same algorithm? Won't the CRC still work when I put the code on a board?
Note: I'm currently using ielftool 10.8.3.1326
and srec_cat 1.63
After many days of trying to figure out how to get the CRCs from each tool to match (and to make sure I was giving both tools the same data), I finally found a solution.
Based on Mark Adler's comment above I was trying to figure out how to get the CRC of a small amount of data such as an unsigned int. I finally had a lightbulb moment this morning and I realized that I simply needed to put a uint32_t with the value
123456789
in the code for the project I was already work on. Then I would place the variable at a specific location in memory using:This way I knew the variable location and length so could then tell the
ielftool
andsrec_cat
to only calculate the CRC over the area of that variable in memory.I then took the elf file from the compiled project and created an intel hex file, so I could more easily look and make sure the correct variable data was at the correct address.
Next I sent the elf file through
ielftool
with this command:And I sent the hex file through
srec_cat
with this command:After converting the elf with the CRC to a hex file and comparing two hex files I saw that the CRCs were very similar. The only difference was the endianness. Changing
-crc32_b_e
to-crc32_l_e
got both tools to give me9E 6C DF 18
as the CRC.I then changed the memory address ranges for the CRC calculation to what they originally were (see the question) and I once again got the same CRC with both
ielftool
andsrec_cat
.