Да, правильно. Так ее туды и помещают

узнает размер он с помощью выше указанной строчки :
...
u32 plen = (u32)((&_etext + (&_edata - &__data_start)) - (unsigned long) AT91C_IFLASH);
...
plen - это и есть размер бинарной прошивки внутри контроллера, сразу за ней следует CRC, которую мы уже дописали из makefile. Можно и на загрузчик возложить - но гембеля много - обычно CRC так просто не запишешь - нужно запоминать/стирать страницу - а если питание в это время пропало ? или выносить CRC в отдельную страницу. И потом непонятно - если CRC не совпадает - это что испортились данные или просто загрузчик ее еще не обновил ?
Мой же принцип очень прост и надежен :
- CRC загрузчика я точно знаю после генерации бинарной прошвики
- исполняемый файл содержит заранее вычисленную на хосте и верную CRC прошивки, добавляется она в конец прошивки, много места не содержит и легко вычисляется, как на хосте (по размеру исходного bin файла) так и в MCU (по метке конца данных)
- менятся она не должна - если это произошло до нарушена целостность данных во флеше и нужно принимать меры
Другое дело, что в проекте bootloader работает только в начальный момент, его задача проверить себя, проверить приложение и запустить его. вот CRC самого приложения можно уже вместе с набором параметров класть в отдельную страницу флеша и обновлять после того как юзер залил новую версию приложения через этот самый bootloader.