vladimir_ad 0 27 сентября, 2007 Опубликовано 27 сентября, 2007 · Жалоба Дальше вы видите цикл по восьми битам. ....Вы не поняли. Пример не работает - crc всегда 0. ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Waso 1 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Почему линкер при линковке требует больше места чем ему требуется на самом деле? Смотрю 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Почему линкер при линковке требует больше места чем ему требуется на самом деле?Это баг. Примерно догадываюсь, откуда он идет. Судя по адресам речь об ARM. Безусловный переход в ARM может быть сделан одним из двух способов - B label и LDR PC,=label (аналоги RJMP и JMP у AVR). Во втором случае требуется еще одно слово для хранения абсолютного адреса (label) в виде константы. В коде место под константу зарезервировано. При линковке линкер смотрит, может ли он дотянуться до метки командой B label. Если может, вставляет эту команду и удаляет ставшую ненужной константу с адресом label. Предполагаю, что код может просматриваться в несколько проходов, ибо переходы, которые были слишком длинными на первой итерации, после удаления части констант тоже могут заменены на короткие. Таким образом размер кода уменьшается. Видимо подсчет размера кода и выдача сообщения об ошибке происходит перед операцией замены длинных переходов на короткие. Это мое мнение, просто предположение. Увы, обход только один - выделить чуть больше памяти и вручную смотреть, что получившийся код уместился в имеющуюся память. Ой. только сейчас увидел: Вы не поняли. Пример не работает - crc всегда 0. Ага, ошибочка: if (crc & (1U<<15)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 25 ноября, 2007 Опубликовано 25 ноября, 2007 · Жалоба Видимо подсчет размера кода и выдача сообщения об ошибке происходит перед операцией замены длинных переходов на короткие.Тема получила неожиданное продолжение на другом форуме, там же рецепт обхода проблемы. Еще не проверял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Waso 1 27 ноября, 2007 Опубликовано 27 ноября, 2007 · Жалоба Рецепт работает, благодарю! Еще вопрос по CRC - хочу дописывать в конец файла число, которое давало бы нулевую CRC после прохода функции подсчета по файлу и этому числу вконце. Взял функцию crc16 из иаровских апнотов. Прогнал по прошивке. Результат сходится. В иаре менял настройку чтоб вставлял инверсионную сумму. И делал завершающий проход по этому числу. Результат ненулевой. Где я ошибся/как правильно??? Именно эту тонкость в гугле не нашол. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 27 ноября, 2007 Опубликовано 27 ноября, 2007 · Жалоба В иаре менял настройку чтоб вставлял инверсионную сумму. И делал завершающий проход по этому числу. Результат ненулевой.Во-первых надо вставлять не инвертированный, а прямой результат. Во-вторых, если в коде встречаются "дыры", т.е. незаполненные участки, то линкер считает, что там нули, а на самом деле там единицы. Поэтому надо давать опцию заполнять свободное место константой 0xFFFFFFFF. Эту тему zltigo прорабатывал. Я ограничился написанием самописной утилиты, которая считает CRC как мне надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться