реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> CRC в IAR и определение конечного адреса, Подготовка к написанию BootLoadera
vladimir_ad
сообщение Sep 27 2007, 10:51
Сообщение #16





Группа: Новичок
Сообщений: 5
Регистрация: 25-09-07
Пользователь №: 30 828



Цитата(Сергей Борщ @ Sep 27 2007, 13:10) *
Дальше вы видите цикл по восьми битам. ....
Вы не поняли. Пример не работает - crc всегда 0.
;-)
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 22 2007, 09:29
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Почему линкер при линковке требует больше места чем ему требуется на самом деле?
Смотрю 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 ( 2.65 килобайт ) Кол-во скачиваний: 23
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2007, 11:03
Сообщение #18


Гуру
******

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



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


Ой. только сейчас увидел:
Цитата(vladimir_ad @ Sep 27 2007, 12:51) *
Вы не поняли. Пример не работает - crc всегда 0.
Ага, ошибочка: if (crc & (1U<<15))


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2007, 18:43
Сообщение #19


Гуру
******

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



Цитата(Сергей Борщ @ Nov 22 2007, 13:03) *
Видимо подсчет размера кода и выдача сообщения об ошибке происходит перед операцией замены длинных переходов на короткие.
Тема получила неожиданное продолжение на другом форуме, там же рецепт обхода проблемы. Еще не проверял.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 27 2007, 09:13
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



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

Еще вопрос по CRC - хочу дописывать в конец файла число, которое давало бы нулевую CRC после прохода функции подсчета по файлу и этому числу вконце. Взял функцию crc16 из иаровских апнотов. Прогнал по прошивке. Результат сходится. В иаре менял настройку чтоб вставлял инверсионную сумму. И делал завершающий проход по этому числу. Результат ненулевой. Где я ошибся/как правильно??? Именно эту тонкость в гугле не нашол. sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 27 2007, 11:01
Сообщение #21


Гуру
******

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



Цитата(Waso @ Nov 27 2007, 11:13) *
В иаре менял настройку чтоб вставлял инверсионную сумму. И делал завершающий проход по этому числу. Результат ненулевой.
Во-первых надо вставлять не инвертированный, а прямой результат. Во-вторых, если в коде встречаются "дыры", т.е. незаполненные участки, то линкер считает, что там нули, а на самом деле там единицы. Поэтому надо давать опцию заполнять свободное место константой 0xFFFFFFFF. Эту тему zltigo прорабатывал. Я ограничился написанием самописной утилиты, которая считает CRC как мне надо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016