TOG 0 December 14, 2022 Posted December 14, 2022 · Report post Товарищи, имеется программа для STM32 на Си. Компилятор Keil MDK-ARM, оптимизация отключена. В программе имеется такой массив нулей и единичек. uint8_t data[] = {1,1,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,0 .. и так далее 180 байт всего}; Я решил поискать эту последовательность в файле прошивки и ничего похожего там не нашел. Как создаются в памяти эти инициализированные переменные при старте программы ? И кто этим занимается ? Quote Share this post Link to post Share on other sites More sharing options...
x893 6 December 14, 2022 Posted December 14, 2022 · Report post startup_....s call __main Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 25 December 14, 2022 Posted December 14, 2022 · Report post 1 hour ago, TOG said: И кто этим занимается ? 1. Можно прочитать в документации на компилятор. Обычно там расписан процесс запуска с момента старта процессора до входа в функцию main(). 2. Можно пройтись отладчиком с вектора сброса до main(). 3. Выше уважаемый @x893 уже ответил. 1 hour ago, TOG said: Я решил поискать эту последовательность в файле прошивки и ничего похожего там не нашел. Может быть формат поиска текста не совпал? Quote Share this post Link to post Share on other sites More sharing options...
x893 6 December 14, 2022 Posted December 14, 2022 · Report post 1 minute ago, haker_fox said: Может быть формат поиска текста не совпал? Там в кодированном виде. Примерно - тип инициализации, значение, длина (разные есть). Можно Отладчиком/IDA/гидрой посмотреть. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 December 14, 2022 Posted December 14, 2022 · Report post 1 час назад, TOG сказал: ...в файле прошивки... static const uint8_t data[] = ... Quote Share this post Link to post Share on other sites More sharing options...
Variant99 0 December 14, 2022 Posted December 14, 2022 (edited) · Report post В зависимости от того, где этот массив создан - локально внутри функции или глобально (в том числе и статически локально). Вот они, глобально созданные 5 элементов (20 байт) и локально созданные и инициализованные 7 элементов (28 байт): указаны адреса, по которым лежат эти значения. Это же можно увидеть в файле листинга .list, ищите в нем вверху табличку и строки .rodata и .data, там указаны те же сведения, что и на скрине выше. Для globalArray они находятся во флеше начиная от адреса 0x08000258 и копируются в SRAM начиная с адреса 0x20000000 перед запуском main(), и затем располагаются в SRAM. КРазмещением кода занимается секция .data скрипта загрузчика .ld, и непосредственно код копирования CopyDataInit в файле startup. Если глобально создать массив, но не обращаться к нему в тексте кода, то он не будет включен в компиляцию. Для localArray инициализующие значения хранятся во флеше по указанному адресу 0x08000234, и копируются в SRAM в стек функции в момент вызова функции, в которой этот массив определен. Адрес размещения в SRAM в общем случае неизвестен и зависит от того, в каком месте программы вызывается эта фкнуция. Вот код этого копирования: А вот кстати они в скомпилированном бинарнике по указанным адресам и сидят (в hex-виде, не в десятичном!): Смотреть бинарник или hex конечно нужно через утилиту просмотра hex или bin, например ST-Link. В hex-файле в чистом виде там конечно ничего не поймете, ибо он закодирован. Edited December 14, 2022 by Variant99 Quote Share this post Link to post Share on other sites More sharing options...
dimka76 15 December 14, 2022 Posted December 14, 2022 · Report post On 12/14/2022 at 8:39 AM, Variant99 said: Смотреть бинарник или hex конечно нужно через утилиту просмотра hex или bin, например ST-Link. В hex-файле в чистом виде там конечно ничего не поймете, ибо он закодирован. Чем и кем он закодирован ? HEX файл это обычный тестовый файл. Открывается любым блокнотом. С очень простым форматом. On 12/14/2022 at 8:10 AM, haker_fox said: Может быть формат поиска текста не совпал? Видимо да. On 12/14/2022 at 6:51 AM, TOG said: Я решил поискать эту последовательность в файле прошивки и ничего похожего там не нашел. Вот так ваша последовательность выглядит в бинарном файле Вот так последовательность выглядит в HEX файле Quote :10CFB000208240420024F400D5AF020801010100A4 :10CFC000000001000100010101000000010001005A :10CFD0000100010088000020000000007403002010 On 12/14/2022 at 6:51 AM, TOG said: Как создаются в памяти эти инициализированные переменные при старте программы ? И кто этим занимается ? Выше ответили. А вообще, не понятно для чего это вам нужно. Какая разница куда там чего компилятор разместил. Quote Share this post Link to post Share on other sites More sharing options...
aaarrr 30 December 14, 2022 Posted December 14, 2022 · Report post 2 hours ago, Arlleex said: static const uint8_t data[] = ... Именно! RW-данные могут быть и скомпрессированы, например. Quote Share this post Link to post Share on other sites More sharing options...
Variant99 0 December 14, 2022 Posted December 14, 2022 · Report post 38 минут назад, dimka76 сказал: Чем и кем он закодирован ? Авторами формата HEX. Внедрены дополнительные символы в начале и в конце строки, они могут путать. 15 минут назад, aaarrr сказал: static const uint8_t data[] В случае квалификатора const массив вообще исчезает из видимости в явном виде и представляет собой ассемблерные инструкции непосредственно в том месте, где элементы массива используются. Например, может преобразоваться вот в такой вариант: const int globalArray[5] = {1000, 20000, 300000, 4000, 5}; int a = globalArray[0]; 8000152: f44f 737a mov.w r3, #1000 ; 0x3e8 8000156: 60fb str r3, [r7, #12] int b = globalArray[1]; 8000158: f644 6320 movw r3, #20000 ; 0x4e20 800015c: 60bb str r3, [r7, #8] int c = globalArray[2]; 800015e: 4b06 ldr r3, [pc, #24] ; (8000178 <main+0x2c>) 8000160: 607b str r3, [r7, #4] Квалификатор static указывает только на область видимости для работы компилятора. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 25 December 14, 2022 Posted December 14, 2022 · Report post 2 hours ago, Arlleex said: static const uint8_t data[] = ... Возможно, что автор хочет эти данные менять по ходу пьесы) Как я понял, ему интересно, где находятся его данные для инициализации Quote Share this post Link to post Share on other sites More sharing options...
Variant99 0 December 14, 2022 Posted December 14, 2022 (edited) · Report post При любом раскладе, инициализующие данные находятся во флеше, где ж им еще быть то. Для случая глобального массива с квалификатором const массив в явном виде исчезает и превращается в нечто подобное: 8000152: f44f 737a mov.w r3, #1000 ; 0x3e8 ... 8000158: f644 6320 movw r3, #20000 ; 0x4e20 ... 800015e: 4b06 ldr r3, [pc, #24] ; (8000178 <main+0x2c>) ... 8000178: 000493e0 .word 0x000493e0 ... 8000162: 2305 movs r3, #5 Однако, локальный const массив может быть помещен снова в виде явного массива во флеш. Кароче, всё сильно зависит от того, как именно и где именно объявлен массив и какая именно оптимизация включена. Edited December 14, 2022 by Variant99 Quote Share this post Link to post Share on other sites More sharing options...
dimka76 15 December 14, 2022 Posted December 14, 2022 · Report post On 12/14/2022 at 11:23 AM, haker_fox said: Возможно, что автор хочет эти данные менять по ходу пьесы) Как я понял, ему интересно, где находятся его данные для инициализации У автора не static const, а простой массив, который в ОЗУ располагается. И такой массив как раз и нужен, чтобы его менять по ходу пьесы. Quote Share this post Link to post Share on other sites More sharing options...
TOG 0 December 14, 2022 Posted December 14, 2022 (edited) · Report post On 12/14/2022 at 1:23 PM, haker_fox said: Возможно, что автор хочет эти данные менять по ходу пьесы) Как я понял, ему интересно, где находятся его данные для инициализации Сотрудник, который сделал эту программу на больничном. У меня есть только МК с прошивкой. У него в программе на Си я точно видел, что объявлен массив был просто uint8_t data[] = {1,1,1,0,0,1 ..... всего 180 байт). Сейчас хотел немного подправить массив в прошивке, а найти его не могу. Для эксперимента сделал два проекта в котором массивы нулей и единичек отличаются только первым и последним байтом. И вот так выглядим место в прошивке, где есть отличия. То есть так просто тут изменения не внесешь. Edited December 14, 2022 by TOG Quote Share this post Link to post Share on other sites More sharing options...
x893 6 December 14, 2022 Posted December 14, 2022 · Report post 10 minutes ago, TOG said: То есть так просто тут изменения не внесешь. Уже написал - данные сжаты конкретным алгоритмом. Выход конечно есть. Cделайте свой код и запускаёте его вместо main. Там исправьте что нужно в таблице и потом перейдите на оригинальный main. Мысль понятна ? Или отнесите апельсинов в больницу, что бы коллега быстрее вышел из комы и смог рассказать, что надо исправить в программе. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 25 December 14, 2022 Posted December 14, 2022 · Report post 42 minutes ago, TOG said: Сотрудник, который сделал эту программу на больничном. Его состояние позволяет Вам дать исходник? 42 minutes ago, TOG said: Сейчас хотел немного подправить массив в прошивке Так делать опасно: прошивка может быть защищена контрольной суммой или линкер склеил одинаковые секции. Вы поправите данные массива, даже если их и найдёте, а программа перестанет работать. Т.к. эти данные нужны были другому участку кода. Quote Share this post Link to post Share on other sites More sharing options...