Перейти к содержанию
    

CRC в IAR и определение конечного адреса

Дальше вы видите цикл по восьми битам. ....
Вы не поняли. Пример не работает - crc всегда 0.

;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему линкер при линковке требует больше места чем ему требуется на самом деле?

Смотрю map-файл или готовый бинарник, сгенеренный когда линкеру дается весь флеш и затем задаю это (даже немного большее) значение как ROMEND.

-DBOOTSIZE=00008000
//-DAPPMAXSIZE=00010000
-DAPPMAXSIZE=0000AB0F
-DROMSTART=(00100000+BOOTSIZE)
-DROMEND=(00100000+BOOTSIZE+APPMAXSIZE)

Тогда линковщик начинает ругаться:

Error[e16]: Segment DATA_C (size: 0x2e3c align: 0x2) is too long for segment definition. At least 0xc24 more bytes needed. The problem occurred while processing the segment placement  
command "-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND", where at the moment of placement the available memory ranges were "CODE:1108f6-112b0f" 
   Reserved ranges relevant to this placement: 
   108000-1083a7        ICODE 
   1083a8-1108a5        CODE 
   1108a6-1108bf        INITTAB 
   1108c0-112b0f        DATA_ID

Если дать ему эти нехватающие 0xC24 байта, то линкуется нормально, но это выделенное пространство заполняет как пустое неиспользованное место.

Почему? На всяк случай приложил map и xcl файлы.

pack.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему линкер при линковке требует больше места чем ему требуется на самом деле?
Это баг. Примерно догадываюсь, откуда он идет. Судя по адресам речь об ARM. Безусловный переход в ARM может быть сделан одним из двух способов - B label и LDR PC,=label (аналоги RJMP и JMP у AVR). Во втором случае требуется еще одно слово для хранения абсолютного адреса (label) в виде константы. В коде место под константу зарезервировано. При линковке линкер смотрит, может ли он дотянуться до метки командой B label. Если может, вставляет эту команду и удаляет ставшую ненужной константу с адресом label. Предполагаю, что код может просматриваться в несколько проходов, ибо переходы, которые были слишком длинными на первой итерации, после удаления части констант тоже могут заменены на короткие. Таким образом размер кода уменьшается. Видимо подсчет размера кода и выдача сообщения об ошибке происходит перед операцией замены длинных переходов на короткие. Это мое мнение, просто предположение. Увы, обход только один - выделить чуть больше памяти и вручную смотреть, что получившийся код уместился в имеющуюся память.

 

 

Ой. только сейчас увидел:

Вы не поняли. Пример не работает - crc всегда 0.
Ага, ошибочка: if (crc & (1U<<15))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо подсчет размера кода и выдача сообщения об ошибке происходит перед операцией замены длинных переходов на короткие.
Тема получила неожиданное продолжение на другом форуме, там же рецепт обхода проблемы. Еще не проверял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рецепт работает, благодарю!

 

Еще вопрос по CRC - хочу дописывать в конец файла число, которое давало бы нулевую CRC после прохода функции подсчета по файлу и этому числу вконце. Взял функцию crc16 из иаровских апнотов. Прогнал по прошивке. Результат сходится. В иаре менял настройку чтоб вставлял инверсионную сумму. И делал завершающий проход по этому числу. Результат ненулевой. Где я ошибся/как правильно??? Именно эту тонкость в гугле не нашол. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В иаре менял настройку чтоб вставлял инверсионную сумму. И делал завершающий проход по этому числу. Результат ненулевой.
Во-первых надо вставлять не инвертированный, а прямой результат. Во-вторых, если в коде встречаются "дыры", т.е. незаполненные участки, то линкер считает, что там нули, а на самом деле там единицы. Поэтому надо давать опцию заполнять свободное место константой 0xFFFFFFFF. Эту тему zltigo прорабатывал. Я ограничился написанием самописной утилиты, которая считает CRC как мне надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...