|
Прошу помочь с подсчетом КС программы |
|
|
|
Feb 20 2007, 22:13
|
Группа: Новичок
Сообщений: 11
Регистрация: 3-05-06
Пользователь №: 16 721

|
Прошу помочь с подсчетом КС программы. Прочитал HELP на линкер, приведенный там пример не заработал (хотя узнал массу нового). Вопросы следующие: 1. Как вытащить начало и конец кода программы в функцию подсчета КС? 2. Есть ли возможность заставить линкер рассчитать CRC32 с заданным мною полиномом? Если можно практические рекомендации.
|
|
|
|
|
Feb 20 2007, 22:51
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ПАВ @ Feb 20 2007, 21:13)  Прочитал HELP на линкер, приведенный там пример не заработал (хотя узнал массу нового). Вопросы следующие: 1. Как вытащить начало и конец кода программы в функцию подсчета КС? 2. Есть ли возможность заставить линкер рассчитать CRC32 с заданным мною полиномом? 1. По именам программ и/или сегментов естественно. Собственно проблема не понятна. 2. Естественно да в хелпе подробно описано. Конкретная проблема какая? И еще это: http://supp.iar.com/Support/?note=91733&from=note+76314
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 22 2007, 00:04
|
Группа: Новичок
Сообщений: 11
Регистрация: 3-05-06
Пользователь №: 16 721

|
Уточню задачу. Имеется несколько устройств, с разными AVR (128 и 2560). ПО в этих AVR перекрывается на 20-30%. В том числе совпадает (я надеюсь так сделать) и контроль целостности ПО. Как прицепиться к началу проги я разобрался (конец сегмента прерываний). Непонятно как прицепиться к концу ПО, ведь в каждом устройстве своя программа, свои сегменты и т.д.
|
|
|
|
|
Feb 22 2007, 00:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ПАВ @ Feb 21 2007, 23:04)  Непонятно как прицепиться к концу ПО, ведь в каждом устройстве своя программа, свои сегменты и т.д. Заводите свой сегмент и линкуете его в конец заодно в нем и собственно контрольную сумму размещаете. Цитата(ПАВ @ Feb 21 2007, 23:04)  Как прицепиться к началу проги я разобрался (конец сегмента прерываний). Вообще-то ROMSTART и ROMEND имеют место быть  Код extern int ROMSTART; extern int ROMEND; И все
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 29 2007, 10:47
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191

|
Написал процедуру расчета CRC-кода программы и наткнулся на следующую проблему: обявляю указатель и присваиваю ему первый адрес памяти FLASH:
const unsigned char *Flash_ptr = (const unsigned char *)0x0001; //
далее в программу читаю данные по адресу, на который ссылается указатель, отдаю эти данные процедуре расчета CRC-кода, а указатель инкрементирую (потом) (привожу листинг):
269 do{ 270 asm ("wdr");
\ ??FLASH_test_0: \ 00000002 95A8 wdr
271 data = *Flash_ptr; 272 CRC8_calc(data);
\ 00000004 .... LDI R24, LOW(BitFld) \ 00000006 .... LDI R25, (BitFld) >> 8 \ 00000008 01FC MOVW R31:R30, R25:R24 \ 0000000A 81A4 LDD R26, Z+4 \ 0000000C 81B5 LDD R27, Z+5 \ 0000000E 910D LD R16, X+ \ 00000010 83A4 STD Z+4, R26 \ 00000012 83B5 STD Z+5, R27 \ 00000014 .... RCALL CRC8_calc 273 }while(++Flash_ptr <= (const unsigned char *)0x1FFE);
Вопрос в следующем: почему компилятор генерит код чтения из ОЗУ (команды LD, LDD) а не из FLASH (командой LPM)? В результате чего не получается посчитать CRC-код программы...
Сообщение отредактировал Василий Зыков - Mar 29 2007, 10:58
|
|
|
|
|
Mar 29 2007, 13:14
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191

|
Сам задал вопрос - сам и отвечаю  Изменил определение указателя на следующее: const unsigned char __flash *Flash_ptr = (const unsigned char __flash *)0x0000; и все заработало! Цитата(Сергей Борщ @ Mar 29 2007, 15:51)  Потому что AVR имеет несколько адресных пространств. Указатель на флеш, расположенный в озу объявляется как __flash unsigned char const* Flash_ptr = (__flash unsigned char const*)0x0001; И считать сумму надо наверное с нулевого адреса? Спасибо за ответ! Я даже не заметил его. Только когда свой уже ответ самому же себе написал, тогда и заметил. Но все равно спасибо. не знаю почему, но в таком виде, как Вы говорите, "не работает"...: __flash unsigned char const* Flash_ptr = (__flash unsigned char const*)0x0001; причем, я так пробовал, что меня и сбило с толку и заставило сюда написать. Но стоит только перенести __flash в конец определения типа - начинает работать: const unsigned char __flash *Flash_ptr = (const unsigned char __flash *)0x0000; Конечно же, надо считать с нулевого адреса. Там в целях отладки стояла единица.
Сообщение отредактировал Василий Зыков - Mar 29 2007, 13:16
|
|
|
|
|
Mar 29 2007, 14:12
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
Цитата(Василий Зыков @ Mar 29 2007, 12:14)  ...
не знаю почему, но в таком виде, как Вы говорите, "не работает"...: __flash unsigned char const* Flash_ptr = (__flash unsigned char const*)0x0001; __flash unsigned char const* Flash_ptr; // Указатель в flash памяти ОЗУ unsigned char const __flash * Flash_ptr; // Указатель в ОЗУ на flash память unsigned char const* Flash_ptr; // Указатель в ОЗУ на память ОЗУ
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Mar 29 2007, 14:55
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191

|
Цитата(Faradey @ Mar 29 2007, 17:12)  __flash unsigned char const* Flash_ptr; // Указатель в flash памяти ОЗУ
unsigned char const __flash * Flash_ptr; // Указатель в ОЗУ на flash память
unsigned char const* Flash_ptr; // Указатель в ОЗУ на память ОЗУ Спасибо! Теперь все ясно!
|
|
|
|
|
Apr 20 2007, 00:05
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Цитата(ПАВ @ Feb 22 2007, 01:04)  Как прицепиться к началу проги я разобрался (конец сегмента прерываний). Непонятно как прицепиться к концу ПО, ведь в каждом устройстве своя программа, свои сегменты и т.д. Цитата(zltigo @ Feb 22 2007, 01:15)  Заводите свой сегмент и линкуете его в конец заодно в нем и собственно контрольную сумму размещаете. Вообще-то ROMSTART и ROMEND имеют место быть  А зачем, собс-но, весь этот танец с началом и концом программы, когда IARовский линкер сам умеет КС считать? С ней в run-time и сравнивать. Я, например, в очень многих устройствах этот способ использую для контроля целостности программы. Опять же, начало и конец программы не помогут подсчитать КС на этапе компиляции, тогда какая-то постобработка нужна.
|
|
|
|
|
Apr 20 2007, 00:31
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sz36 @ Apr 19 2007, 23:05)  А зачем, собс-но, весь этот танец с началом и концом программы, когда IARовский линкер сам умеет КС считать? С ней в run-time и сравнивать. Так в run-time же надо ее тоже посчитать, чтобы было что сравнивать. Для этого и нужен. Только зачем считать именно до конца программы, когда можно просчитать до конца памяти? И вот тут уже иаровский линкер лажается. Он считает, что незанятая память содержит нули, а на самом-то деле там 0xFF. Чтобы его результат совпадал с реальным приходится давать команду "заполнить свободное место константой 0xFFFF" и файл прошивки неприлично разбухает. По этой причине я отказался от расчета КС линкером в пользу самописной утилиты, считающей как мне надо и размещающей КС по указанному мной адресу (в конец памяти).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 20 2007, 09:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Apr 19 2007, 23:55)  Проблем написать утилиту - никаких. Только зачем? Диапазоны подсчета задаются, место расположения контрольной суммы задается, алгоритмов (даже без задания произвольных полиномов) изядное количество. Еще раз: Если в этом диапазоне будут пустоты, то линкер считает, что там 0. А программа в реал-тайме находит там 0xFF. Сумма не совпадает. Чтобы этого избежать, надо указать линкеру заполнить свободное место константой, а это не всегда приемлемо. Цитата(zltigo @ Apr 19 2007, 23:55)  Ну а считать всю память не всегда допустимо Это уже частности. Важно, что считается определенный диапазон, адреса которого фиксированы независимо от размера прошивки. Ибо подсчет (у меня) делает загрузчик, а он понятия не имеет о реальном размере прошивки, он только знает какая область под нее выделена.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 17 2007, 02:48
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 22-06-04
Из: Челябинск
Пользователь №: 88

|
Цитата(Сергей Борщ @ Apr 20 2007, 16:24)  Еще раз: Если в этом диапазоне будут пустоты, то линкер считает, что там 0. А программа в реал-тайме находит там 0xFF. Сумма не совпадает. Чтобы этого избежать, надо указать линкеру заполнить свободное место константой, а это не всегда приемлемо.Это уже частности. Важно, что считается определенный диапазон, адреса которого фиксированы независимо от размера прошивки. Ибо подсчет (у меня) делает загрузчик, а он понятия не имеет о реальном размере прошивки, он только знает какая область под нее выделена. Именно поэтому делаем в *.xcl вот так Код // fill empty code space with 0x00 -H00 // generate a 2-byte crc16 checksum -J2,crc16
|
|
|
|
|
May 17 2007, 03:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(lamerok @ May 17 2007, 09:48)  Именно поэтому делаем в *.xcl вот так А что, от заполнения свободного места прошивки нулями вместо 0xFFFF ее размер сильно сохранится? Цитата Чтобы его результат совпадал с реальным приходится давать команду "заполнить свободное место константой 0xFFFF" и файл прошивки неприлично разбухает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|