запись шестнадцатеричного файла в ОЗУ в ARM Cortex-M

Я занимаюсь текущим проектом по написанию упрощенной ОС для хобби/обучения. Я могу генерировать шестнадцатеричные файлы, и теперь я хочу написать скрипт на чипе, чтобы принимать их через последовательный порт, загружать их в оперативную память, а затем выполнять. Для простоты я пишу на ассемблере, так что весь стартовый код остается за мной. С чего начать? Я знаю, что формат шестнадцатеричного файла хорошо задокументирован, но так ли просто читать заголовки для каждой строки, выравнивать адреса, затем помещать данные в ОЗУ и переходить к адресу? Похоже, мне нужно гораздо больше, но это проблема, которую большинство людей даже не пытаются решить. Любая помощь будет здорово.


person Michael Stachowsky    schedule 18.01.2017    source источник


Ответы (1)


слишком расплывчато, существует много разных форматов файлов и по крайней мере два действительно популярных, которые используют текст с данными в шестнадцатеричном формате. Так что здесь нам не очень помогают.

написание сценария на чипе означает, что у вас есть операционная система, работающая на вашем микроконтроллере? какая операционная система и как выглядит командная строка и т.д.

сборка не требуется, чтобы полностью все контролировать (в основном baremetal) можно использовать asm для начальной загрузки C, а затем все остальное на C, не проблема.

Вы хотите загрузить в оперативную память и запустить или хотите загрузить, а затем записать на флэш-память, чтобы каким-то образом сбросить настройки?

По сути, то, что вы делаете, это загрузчик. И да, мы постоянно пишем загрузчики, по одному для каждой платформы, иногда заимствуя код с предыдущей платформы, иногда нет.

Прежде всего, на своем компьютере для разработки, Windows, Mac, Linux, любом другом, напишите программу (в идеале на C или Pascal, что-то, что вы можете легко портировать на микроконтроллер), которая считывает весь файл в массив, а затем напишите код, который в основном принимает по одному байту за раз, как если бы вы получали его последовательно. Проанализируйте этот формат файла в любом формате, который вы выберете (первоначально, затем, возможно, измените форматы, если вы решите, что он вам больше не нравится), возьмите настоящие программы, которые вы создали, которые дизассемблер или другие инструменты должны иметь другие параметры вывода, чтобы показать вам, какие байты или слова по каким адресам должна быть посадка. Проанализируйте эти данные, распечатайте элементы адреса/байта или адреса/слова, которые вы найдете, а затем сравните это с тем, что показал набор инструментов. вырежьте инструмент синтаксического анализа и замените printf на запись в память по этому адресу. а затем да, вы переходите к точке входа, если вы можете это понять, и / или вы, как разработчик, решаете, что все программы должны иметь определенную точку входа.

Intel Hex и Motorola s-record — хороший выбор (-O ihex или -O srec, мой текущий фаворит — --srec-forceS3 -O srec), оба задокументированы в Википедии. и, по крайней мере, инструменты gnu будут создавать и то, и другое, вы можете использовать тупую терминальную программу (minicom), чтобы сбросить файл в ваш микроконтроллер и, надеюсь, разобрать и записать в оперативную память по мере его поступления. Если вы не можете справиться с этим потоком, вы можете подумать о необработанный двоичный файл (-O двоичный) и внедрить приемник xmodem в ваш загрузчик.

person old_timer    schedule 19.01.2017