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 value0x08060000-0x081fffff
is the memory range for which the checksum will be calculatedI'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 as m
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 in ielftool
) 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:
#pragma location=0x08060188
__root const uint32_t CRC_Data_Test = 123456789; //IAR specific pragma and keyword
This way I knew the variable location and length so could then tell the ielftool
and srec_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:
ielftool proj.elf --checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060188-0x0806018b proj.elf
And I sent the hex file through srec_cat
with this command:
srec_cat proj.hex -intel -crop 0x08060188 0x0806018c -crc32_b_e 0x081ffffc -o proj_srec.hex -intel
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 me 9E 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
and srec_cat
.