Автоматическая настройка компоновщика в IAR Embedded Workbench

Я работаю над проектом прошивки, в котором мне нужно выполнить проверку CRC16 на целостность флеш-памяти.

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. Я получаю это значение из файла .map, т.е. от того, в каком диапазоне памяти мой код находится во флеш-памяти. Это первое изменение, которое я делаю.

Здесь мне нужно сделать 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
   }

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


person OnkarK    schedule 23.08.2012    source источник


Ответы (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"));

Я не знаю, что происходит с разделенными сегментами. Но зачем вам исключать векторы сброса из расчета контрольной суммы? Вы можете просто перейти от начала 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 к первым двум байтам во флеш-памяти, определив сегмент для этих первых двух байтов и поместив его туда.

Изменить: пропущено первое изменение. Если вы вручную настраиваете диапазон подпрограммы контрольной суммы компоновщика IAR, тогда, чтобы иметь возможность использовать внутренние функции сегмента из компилятора, вам нужно будет определить настраиваемый сегмент, который использует конец вашего кода в вашем компоновщике.

Я не знаю, есть ли способ это автоматизировать. Возможно, вам придется скомпилировать код дважды (тьфу) один раз с неограниченным сегментом, чтобы получить конец кода, затем использовать сценарий для извлечения конца кода и затем обновить сценарий компоновщика. Вероятно, вы могли бы запустить начальную сборку в событии командной строки перед сборкой и просто построить проект IAR с неограниченным файлом компоновщика. Но это кажется довольно уродливым.

person tinman    schedule 23.08.2012
comment
Спасибо Tinman за ваше предложение об использовании встроенных функций в вызове функции. Я не знал об этих. Меня действительно беспокоит то, что я хочу вычислить контрольную сумму только для того, что кажется: ‹CODE› 1 и ‹CODE› 2 в файле карты. Я хочу исключить любые другие сегменты в памяти кода, потому что у них есть некоторые глобальные данные, которые должны быть изменены, и я вычисляю контрольную сумму во время выполнения каждый час (требование проекта). - person OnkarK; 23.08.2012
comment
вот почему мне приходится вручную изменять диапазоны адресов в компоновщике и в источнике для каждой загрузки. Это то, что я хочу автоматизировать. Даже если вы можете предложить мне какой-то способ протолкнуть эти DATA20_C и DATA20_ID до ‹CODE› 2, это нормально для меня. Я просто хочу вообще исключить из расчета CRC! (FYI) __ контрольная сумма на моем изображении находится в конце. Вы можете разместить его где угодно - person OnkarK; 23.08.2012

Возможно, вы также можете изменить свое решение, чтобы построить CRC для всей флэш-памяти, зарезервированной для приложения, а не только для используемой части.

Тогда вам никогда не придется изменять файл компоновщика или код c, и даже загрузчик может вычислить crc, не зная о фактическом размере приложения.

person jeb    schedule 24.08.2012
comment
Повлияет ли это на расчет времени выполнения и проверку CRC? мне нужно проверять это каждый час. Файл карты показывает некоторые глобальные данные в сегментах DATA20_C и DATA20_ID. - person OnkarK; 24.08.2012
comment
Это повлияет на время расчета времени выполнения, но если вам это нужно только каждый час, я полагаю, это не проблема, но чтобы быть уверенным, что вы можете измерить продолжительность - person jeb; 24.08.2012
comment
для всей памяти 256 КБ на частоте 922 КГц расчет занимает почти секунду. Это все еще нормально для приложения. В любом случае, спасибо за вклад! - person OnkarK; 24.08.2012