Автоматизация настройки компоновщика в 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
}


Пожалуйста, помогите автоматизировать этот процесс!!

425   2  

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

    Ничего не найдено.