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_ApplactionCrcis the symbol where the checksum will be stored with a 4 byte offset addedcrc32is the algorithm1specifies one’s complementmreverses the input bytes and the final checksumiinitializes the checksum value with the start value0xffffffffis the start value- And finally,
0x08060000-0x081fffffis 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 0x081ffffcIn a way specifies the memory range for which the CRC will be calculated-Bit_Reverseshould do the same thing asmin the ielftool when put in the right spot-crc32_b_eis the algorithm. (I'm not sure yet if I need big endian_b_eor little endian_l_e)0x081ffffcis the location in memory to place the CRC-CCITTThe 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
123456789in 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
ielftoolandsrec_catto 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
ielftoolwith this command:And I sent the hex file through
srec_catwith 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_eto-crc32_l_egot both tools to give me9E 6C DF 18as 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
ielftoolandsrec_cat.