Автоматизация настройки компоновщика в IAR Embedded Workbench
Я работаю над проектом прошивки, в котором я должен сделать проверку crc16 на целостность flash.
Crc вычисляется с помощью линкера IAR Xlink и хранится в конце вспышки. Снова crc вычисляется во время выполнения из кода и сравнивается с сохраненным значением во флэш-памяти для проверки целостности. Однако мы можем вычислить crc только на сегменте кода флэш-памяти. Его размер может меняться всякий раз, когда мы вносим некоторые изменения в код. Могу ли я автоматизировать этот процесс, который я выполняю вручную прямо сейчас делаешь?
От В.файл компоновщика xcl:
// ---------------------------------------------------------
// CRC16 Essentials: -H for fill,-J for checksum calculation
// ---------------------------------------------------------
-HFF
-J2,crc16,,,CHECKSUM2,2=(CODE)5C00-FF7F;(CODE)10000-0x20A13
Здесь мне нужно изменить конечное значение второго сегмента кода, которое является 0x20A13 прямо сейчас.
Я получаю это значение от.файл карты, т. е. на том, сколько памяти мой код находится внутри флэш-памяти.
Это первое изменение, которое я делаю.
Здесь мне нужно сделать 2-е изменение из кода:
sum = fast_crc16(sum, 0x5C00, 0xFF7F-0x5C00+1);
sum = fast_crc16(sum, 0x10000,0x20A13-0x10000+1);
//Check the crc16 values
if(sum != __checksum)
{
// Action to be taken if checksum doesn't match
}
Пожалуйста, помогите автоматизировать этот процесс!!
2 ответов:
Вы можете попробовать использовать встроенные функции
__segment_beginи__segment_sizeили__segment_endв IAR, которые описаны в "справочном руководстве по компилятору C/C++", доступ к которому можно получить из меню справки в IAR EW430. В руководстве говорится, что они работают с сегментами, определенными в файле компоновщика, и многие люди в Интернете, похоже, используют его таким образом, но я попытался и получил ошибки компилятора (IAR EW430 5.40.7). Если это каким-то образом сломано, вы можете сообщить об этом в IAR и получить исправление (при условии, что у вас есть поддержка контракт).Вы можете использовать их следующим образом:
Я не знаю, что происходит с расщепленными сегментами. Но почему вы исключаете векторы сброса из расчета контрольной суммы? Вы можете просто перейти от начала кода к концу и включить векторы сброса.sum = fast_crc16(sum, __segment_begin("CODE"), __segment_size("CODE"));Я думаю, вы могли бы структурировать свой код следующим образом:
Кроме того, вы можете заметить или не заметить, что переменнаяsum = fast_crc16(sum, __segment_begin("CODE"), (char *)__segment_begin("INTVEC") - (char *)__segment_begin("CODE") + 1); sum = fast_crc16(sum, 0x10000, (char *)__segment_end("CODE") - 0x10000);__checksumпомещается в память везде, где она помещается. Я обнаружил, что он скрывается за моим сегментомDATA16_ID, что поставило его прямо в середину диапазона моего кода контрольной суммы, и я не знал способа автоматизировать пропуск разделов памяти для вычисления контрольной суммы. То, что я сделал, было принудительно__checksumк первым двум байтам во flash, определив сегмент для этих первых двух байтов и поместив его туда.Правка: пропущено первое изменение. Если вы вручную настраиваете диапазон процедуры контрольной суммы компоновщика IAR, то для использования встроенных сегментов компилятора вам потребуется определите пользовательский сегмент, который использует конец кода в компоновщике.
Я не знаю, есть ли какой-нибудь способ автоматизировать это. Возможно, Вам потребуется скомпилировать код дважды (тьфу) один раз с сегментом unlimited, чтобы получить конец кода, затем использовать скрипт для извлечения конца кода и затем обновить сценарий компоновщика. Вы, вероятно, можете запустить начальную сборку на событии командной строки перед сборкой и просто построить проект IAR с неограниченным файлом компоновщика. Но это выглядит довольно уродливо.
Возможно, вы также можете изменить свое решение, чтобы построить crc поверх полной флэш-памяти, зарезервированной для приложения, а не только для используемой части.
Тогда вам никогда не придется изменять ни файл компоновщика, ни c-код, и даже загрузчик может вычислить crc, не зная о фактическом размере приложения.
Comments