|
Скрипты линкера ld |
|
|
|
Mar 26 2009, 15:29
|

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

|
Цитата(BigBolt @ Mar 26 2009, 14:55)  Возникла задача подсчитать CRC прошивки загружаемой во флэш AVR и писать в CRC ну скажем в последнюю ячейку памяти. Считать СRC бинарного файла и потом отдельно загружать в память совсем неудобно. Хотелось бы что бы в WinAVR собрал проект и загрузил. Люди подсказали что такое можно сотворить если написать скрипт для линкера. Что-то я не припомню, чтобы ld умел считать CRC. Почему неудобно считать и загружать? ld должен зарезервировать место в прошивке. Srecord умеет считать CRC и вставлять ее в указанное место HEX-файла. Вызов SRecord можно добавить в качестве одной из целей в makefile.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2009, 16:58
|
Местный
  
Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997

|
Цитата(Сергей Борщ @ Mar 26 2009, 18:29)  Что-то я не припомню, чтобы ld умел считать CRC. Почему неудобно считать и загружать? ld должен зарезервировать место в прошивке. Srecord умеет считать CRC и вставлять ее в указанное место HEX-файла. Вызов SRecord можно добавить в качестве одной из целей в makefile. Вопрос не в том кто будет CRC считать, а в том что бы автоматизировать процесс. Спасибо за ссылочку, будем изучать.... Мне вообще тоже казалось что вроде как подсчёт CRC не задача линкера...
Сообщение отредактировал BigBolt - Mar 26 2009, 17:11
|
|
|
|
|
Mar 27 2009, 14:04
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Harbour @ Mar 27 2009, 14:38)  это кусман от арм, но принцип тот же и для AVR. compute_csum - это та-же f() только внутри паршивки Спасибо Вам за мысль. Правильно-ли я Вас понимаю, что загрузчик вызывает функцию верификации CRC из области приложения? Как быть если хочется поместить в сам загрузчик и эту функцию. Т.е. как bootloader узнает размер уже запрограммированной прошивки для верификации CRC только по реально используемой flash? Может на загрузчик возложить обязанность первоначального расчёта CRC сразу после обновления. Ведь в этот момент известен размер прошивки. Если boot контролирует правильность записи каждой отдельной страницы и протокол обмена тоже гарантирует целостность, то на мой взгляд можно... После окончания обновления записать в последнюю ячейку размер прошивки и рядышком CRC (посчитанное и по байтикам размера прошивки).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 28 2009, 08:06
|

Местами Гуру
    
Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323

|
Да, правильно. Так ее туды и помещают  узнает размер он с помощью выше указанной строчки : ... u32 plen = (u32)((&_etext + (&_edata - &__data_start)) - (unsigned long) AT91C_IFLASH); ... plen - это и есть размер бинарной прошивки внутри контроллера, сразу за ней следует CRC, которую мы уже дописали из makefile. Можно и на загрузчик возложить - но гембеля много - обычно CRC так просто не запишешь - нужно запоминать/стирать страницу - а если питание в это время пропало ? или выносить CRC в отдельную страницу. И потом непонятно - если CRC не совпадает - это что испортились данные или просто загрузчик ее еще не обновил ? Мой же принцип очень прост и надежен : - CRC загрузчика я точно знаю после генерации бинарной прошвики - исполняемый файл содержит заранее вычисленную на хосте и верную CRC прошивки, добавляется она в конец прошивки, много места не содержит и легко вычисляется, как на хосте (по размеру исходного bin файла) так и в MCU (по метке конца данных) - менятся она не должна - если это произошло до нарушена целостность данных во флеше и нужно принимать меры Другое дело, что в проекте bootloader работает только в начальный момент, его задача проверить себя, проверить приложение и запустить его. вот CRC самого приложения можно уже вместе с набором параметров класть в отдельную страницу флеша и обновлять после того как юзер залил новую версию приложения через этот самый bootloader.
|
|
|
|
|
Mar 30 2009, 06:15
|

Местами Гуру
    
Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323

|
Конец данных, обычно это и есть последнее что записывается в прошивку, вот классический пример :
........... .data : AT (_etext) { __data_start = . ; *(.data) *(.data.*) SORT(CONSTRUCTORS) . = ALIGN(4); *(.fastrun) /* "RAM-Functions" */ /* added by mthomas */
} > DATA
. = ALIGN(4);
_edata = . ; PROVIDE (edata = .); ..........................................
Если нет своих или каких либо специальных секций, то содержимое прошивки представляет собой две секции : .text и .data, длины которых известны на этапе линковки и могут быть доступны для вычисления изнутри программы непосредственно по меткам линкера. Это как-бы азы работы с ld - описано по многу раз, как в инете, так и тут на форуме. В данном случае разбивают проект на crypto bootloader и приложение (app), выделяем 1 страницу флеш для хранения app crc и ее параметров (serial number, version и т.д.), размещаем их в памяти последовательно (bootloader + param page + app):
- шьем бутлодер - шьем с помощью бутлодера app (в этом месте бутлодер уже знает длину app) - бутлодер вычисляет app crc и вместе с переданными параметрами записывает все это дело в param page - при старте бутлодер проверяет себя, проверяет приложение, и если все пучком - стартует его - если нет - переходит в режим ожидания/программирования с соответствующей индикацией/сообщением
|
|
|
|
|
Dec 17 2009, 14:06
|
Группа: Участник
Сообщений: 6
Регистрация: 26-04-09
Пользователь №: 48 288

|
а где бы можно посмотреть примеры скрипта линкера для AVR ? а то для арма почти в каждом проекте и скрипт и startup, а для AVR ни того ни другого не могу встретить в каком нить тестом проекте для gcc. правда в отличии от арма тут прошивка и так компилится, но видно он откуда-то библиотечные startup и ld по умолчанию берет. где бы почитать как его составлять этот скрипт?
|
|
|
|
|
Dec 17 2009, 14:30
|

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

|
Цитата(boldgambler @ Dec 17 2009, 16:06)  а где бы можно посмотреть примеры скрипта линкера для AVR ? В WinAVR - C:\WinAVR\avr\lib\ldscripts. В линуксе - аналогичная папка, в которую становятся binutils-avr. Цитата(boldgambler @ Dec 17 2009, 16:06)  а то для арма почти в каждом проекте и скрипт и startup, а для AVR ни того ни другого не могу встретить в каком нить тестом проекте для gcc. правда в отличии от арма тут прошивка и так компилится, но видно он откуда-то библиотечные startup и ld по умолчанию берет. ARMы слишком разные, и слишком разные конфигурации карт памяти возможны в системах с внешними ОЗУ/ПЗУ. У AVR все внутри, поэтому базовые скрипты вшиты в линкер. Цитата(boldgambler @ Dec 17 2009, 16:06)  где бы почитать как его составлять этот скрипт? В документации на binutils
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|