Метценгерштейн
Свой-
Постов
1 563 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о Метценгерштейн
-
Звание
Профессионал
- День рождения 07.05.1978
Контакты
-
Сайт
Array
-
ICQ
Array
Информация
-
Город
Array
Посетители профиля
6 154 просмотра профиля
-
Наверное, нужен др подход. Я чуть может ввел в заблужение. Еще раз. Прошивка заканчивается 0x0001e194 - 1 И я хочу внешним софтом положить к концу ее некий кусок данных. Потом считать его самой прошивкой. И вот мап, где ОЗУ существенно залезает аж внутрь флеш памяти, соответственно, перетирает записанное мной. Надо скатер может настроить вот он: LR_IROM1 0x00000000 { ; load region size_region ER_IROM1 0x00000000 { ; load address = execution address *.o (NUC_INIT, +First) *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 +0 { ; RW_RAM1 start address is after ER_ROM1 .ANY (+RW +ZI) } } Даже здесь видно что ОЗУ сразу должно идти за флеш, но оно залазит внутрь. Строчка RW_RAM1 +0 замену на RW_RAM1 +32- идет ошибка, то что-то там с ОЗУ не то будет, данные потеряются. В общем, пока не очень понятно
-
Если так можно, то это решит вопрос. Проговорим- массив в коде объявлен, объявление участвует в хешировании. Но содержимое его никак не влият на хеш. Только если можно, попрошу пример как это делается. Тогда можно самой прошивкой себя обсчитывать и записывать в этот массив. Но пока как-то расплывчато все равно.
-
можно попросить раскрыть подробности? Скрипт линкера- это .sct файл? Тогда в коде прошивки как это будет выглядеть? Объявляю массив по адресу, что в линкере не учитывается?
-
Думаем. Решаема. Скорее, надо считать хеш внутри самой прошивки и положить куда-то туда, где он будет вне прошивки. Внешняя флеш- может как вариант. Но как только я объявляю массив с __attribute__ и указывваю на его размещение, не войдет ли этот массив в состав прошивки?
-
Все равно еще не улавливаю мысли как сделать. есть прошивка от 0 до 0x0001E194 B хэш я считаю именно ее, без таблицы векторов и прочего.
-
Спасибо. А если усложнить тем, что моя КС- это 32 байта? Тут как поступить? Еще раз, мне не CRC32 надо. Мне хэш всего и сразу. Его нельзя по кускам посчитать.
-
Алгоритм- хэш сумма. Не важно, MD5 или что. Там блоками не считают. Сразу всё. И посчитать надо как-то без самого вкрапления в прошивку этой суммы- исказит результат
-
Картина начинает вырисовываться. Только мне не CRC надо, а хэш. Там один бит поменял, хэш совсем другой. А коллега выше постом что говорит? Вот не могу его мысль уловить как сделать.
-
при том, что я имею прошивку, где конец ее до 0x0001E194. Т.е. 0x0001E193- полседний байт прошивки. Со 0x0001E194 добавляю руками КС. А по мапу получается, что-то дописывает ко мне и перетирает? Получается, моя задача- стандартная- много когда нужна КС прошивки? а вектора эти- они не участвуют в теле прошивки? Т.е. при подсчете КС, не будут посчитаны?
-
проверяю. пока не понял как это. Тут еще проблема, чтобы при подсчете КС именно этот массив не принимал участие в подсчете. Исключить его из тела прошивки. Иначе- никогда не сосчитать будет КС
-
Открыл мар файл. Еще раз, что там посмотреть можно? Не размера только, а ее КС. Я КС добавляю руками, уже к готовому .bin файлу прошивки. Т.о. всегда после самой прошивки
-
Открыл сейчас дамп памяти МК и свою прошивку. Похоже, что да, затирает как раз. Сумма была добавлена просто в ручную к прошивке. И при старте, скорее, доходит до символов, что это конец прошивки и не грузит ее в память больше. Т.о. в ОЗУ МК нет того куска кода добавленного в ручную. Есть только до места, пока не добавляли. Читать да, можно просто по указателю памяти- соответствует ОЗУ и сам файл прошивки.
-
0x0001E194 это конец прошивки, и начало адреса данных, где начинается контрл сумма- с этого адреса. Мне ее надо прочитать Но вот не пойму, прошивка есть. Льем в МК, там флеш нет, если только внешнее, есть ОЗУ, где прошивка и располагается. Как непосредственно читать куски прошивки?
-
Есть прошивка. Есть контрл. сумма, лежащая в конце ее по опред. адресу. Как ее прочитать? static int ReadHash(unsigned int hashAddr, unsigned char *hashBuf, unsigned int hashLength) { unsigned char *hashPtr; if (hashBuf == NULL || hashLength == 0) return -1; hashPtr = (unsigned char *)hashAddr; memcpy (hashBuf, hashPtr, hashLength); return 0; } такой способ не работает. Похоже, из ОЗУ читает.
-
Наверное, тут я плыву. Регион загрузки из скатер файла берется. И ему без разницы, где лежит прошивка - ОЗУ или флеш? По- другому спрошу- регион загрузки- это что тогда такое? Вот нет у него флеш.