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

aaarrr

Модератор
  • Постов

    14 112
  • Зарегистрирован

  • Победитель дней

    19

aaarrr стал победителем дня 29 ноября 2023

aaarrr имел наиболее популярный контент!

Репутация

56 Очень хороший

Информация о aaarrr

  • Звание
    Гуру
    Гуру

Контакты

  • Сайт
    Array
  • ICQ
    Array

Посетители профиля

17 534 просмотра профиля
  1. В том-то и дело, что компилятор считает его неизменным, и вправе провести оптимизацию на основании своих представлений о содержимом. Это тот случай, когда volatile нужен. Верните hash_section в конец региона загрузки.
  2. Тогда нельзя будет пользоваться содержимым хеша из программы.
  3. Потому что содержимое hash.o волшебным образом превратилось в RW. Смешно, но это оно на volatile так реагирует.
  4. Поместили секции файла hash.c в конец региона загрузки. Это атрибуты для переменной, содержащей хеш. В этом случае не обязательно будет укладывать её в отдельный файл. В скрипте линкера: ER_IROM2 +0 { * (hash_section) }
  5. Угу. Немного не так надо было: 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 (было + 0 в оригинале) .ANY (+RW +ZI) } ER_IROM2 +0 { hash.o (*, +Last) } } Тут уже и +Last не особо нужен, но пусть будет.
  6. Может, но объявлять нужно именно как volatile const - это важно. Да, к концу.
  7. Его не просто так объявили, это единственный объект в файле hash.c; далее hash.c превратится после компиляции в hash.o, содержимое которого будет расположено в конце загрузочного региона (hash.o (*, +Last)). Можно и не городить отдельный файл, тогда нужно поместить переменную в отдельную секцию через #pragma arm section с соответствующими поправками в .sct
  8. hash.c volatile const hash_type_t fw_hash = { 0 }; .sct: LR_IROM1 0x00000000 { ; load region size_region ER_IROM1 0x00000000 { ; load address = execution address *.o (NUC_INIT, +First) *(InRoot$$Sections) .ANY (+RO) hash.o (*, +Last) } RW_RAM1 +0 { ; RW_RAM1 start address is after ER_ROM1 .ANY (+RW +ZI) } } В программе считаем хеш от начала (Load...Base) до &fw_hash, сравниваем с fw_hash. Внешней утилитой перезаписываем последние sizeof(hash_type_t) байт прошивки.
  9. Да, .sct Можно, например, определить массив под хеш и средствами линкера закинуть его в конец загрузочного региона (+LAST).
  10. Вы правы, посмотрел сейчас - у меня в конце CRC дописывается, поэтому 0. А внутри только длина и номер сборки. Достаточно скрипт линкера поправить таким образом, чтобы в конце загрузочного региона оставалось пространство, достаточное для хранения хеша. И спокойно приклеивать его.
  11. Перетирает. Участвуют. План такой: - Резервируете поле в известном месте прошивки (не обязательно в векторах, просто так удобнее), пишете в него 0 - Считаете CRC прошивки, заменяете 0 на результат В прошивке считаете CRC подряд, убеждаетесь, что на выходе результат 0 В прошивке считаете CRC с нулевым содержимого поля, сравниваете с реальным.
  12. Не разместилось ли что аккурат по тому адресу, где ожидалась добавленная вручную КС.
×
×
  • Создать...