Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после CRC до конца флэш, считая, что там везде 0xFF.
Не сходится

Все диапазоны сделаны на манер STL (поэтому конец флэш 0x40000, а не 0x3FFFF).
Код
-J2,crc16,,,,1,0=2004-3ffff
Код
unsigned short slow_crc16(unsigned short sum, u8_t const * p, unsigned short len)
{
while (len--)
{
int i;
unsigned char byte = *p++;
for (i = 0; i < 8; ++i)
{
unsigned long osum = sum;
sum <<= 1;
if (byte & 0x80)
sum |= 1;
if (osum & 0x8000)
sum ^= 0x1021;
byte <<= 1;
}
}
return sum;
}
bool is_code_valid(void)
{
if (validate_write_address(bootloader_programm_size))
{
u8_t const * const programm_begin = reinterpret_cast<u8_t const *>(0x2004);
u8_t const * const programm_end = reinterpret_cast<u8_t const *>(bootloader_programm_size);
u8_t const * const flash_end = reinterpret_cast<u8_t const *>(0x40000);
u8_t const zero[] = {0, 0};
u16_t crc = 0;
crc = slow_crc16(crc, programm_begin, programm_end - programm_begin);
crc = slow_crc16(crc, programm_end + 2, flash_end - programm_end - 2);
crc = slow_crc16(crc, zero, 2);
u16_t linker_crc;
my_memcpy(&linker_crc, programm_end, 2); // читается правильно
return crc == linker_crc; // вообще не сходится, ни инвертирование, ни меняя endian.
}
else
{
return false;
}
}
Код
MODULE PROGRAMM_SIZE;
PUBLIC bootloader_programm_size;
EXTERN __checksum;
RSEG PRGSIZE:CODE:NOROOT(2);
bootloader_programm_size DC32 __checksum;
ENDMOD;
Код
****************************************
* *
* SEGMENTS IN ADDRESS ORDER *
* *
****************************************
SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
PRGSIZE 00002000 - 00002003 4 rel 2
PRGENTRY 00002004 - 0000207F 7C rel 2
ICODE 00002080 - 00002633 5B4 rel 2
DIFUNCT 00002634 - 00002637 4 rel 2
CODE 00002638 - 00014ED7 128A0 rel 2
INITTAB 00014ED8 - 00014EEF 18 rel 2
DATA_ID 00014EF0 - 00014EF3 4 rel 2
DATA_C 00014EF4 - 000194FE 460B rel 2
CHECKSUM 000194FF - 00019500 2 rel 0
?FILL2 00019501 - 0003FFFF 26AFF rel 0
****************************************
* *
* CHECKSUMS *
* *
****************************************
Symbol Checksum Memory Start End Initial value
------ -------- ------ ----- --- -------------
__checksum 0xe424 CODE 00002004 - 000194FE 0x0
CODE 00019501 - 0003FFFF