|
thiwyzordptusptus
|
|
Исполнение программного кода из флеш-памяти09.01.2014, 04:13. Показов 22836. Ответов 54
Метки нет (Все метки)
Требования к устройству:
<ul><li> исполнять код, загружаемый из флеш-памяти;</li><li> исполняемый код должен получаться путём компиляции из C (возможно, урезанного);</li><li> производительность может быть низкой;</li><li> важна техническая возможность собрать устройство руками, не заказывая плату на заводе.</li></ul> Решения, которые я нашёл: <ul><li> эмуляцией, допустим, процессора 8080 на AVR;</li><li> STM32 (умеет исполнять загруженный из флеш-памяти в ROM код);</li><li> FPGA с, допустим, процессором 8086, памятью и прочей периферией.</li></ul> Какой подход можете посоветовать вы? Уточнение #1: Я говорю про загрузку кода из флеш-памяти и его исполнение уже во время работы основной прошивки. По сути должна быть основная прошивка, некая микро-ОС, которая по командам пользователя загружает из флеш-памяти программный код и запускает его исполнение. То есть аналог обычного ПК, с его ОС, которая загружает программы с жёсткого диска в ОЗУ и запускает их исполнение. Уточнение #2: Сделать я хочу аналог умных часов (Pebble, Sony SmartWatch и т. п.). То есть получение уведомлений от смартфона через Bluetooth о новых звонках, SMS, emailах, с передачей данных о них (номер телефона, имя контакта, текст сообщения). Управление смартфоном (так же через Bluetooth) - плеером, звонками (принять/сбросить). Но хочется, чтобы устройство было расширяемо, как и промышленные аналоги. То есть можно было написать новую программу и загрузить на них. Без обновления всей прошивки при этом. Вот для этого это исполнение программ, о котором я говорю, и нужно. Для написания программ должно быть доступно API часов, обеспечивающее доступ к периферии: получение и передача данных по Bluetooth и USB, получение данных акселерометра, чтение состояния кнопок (3-4 шт.), включение вибромоторчика, подача звукового сигнала через спикер, работа с LCD-экраном. Уточнение #3: Крайне важно, чтобы эти дополнительные программы писались на C. |
|
| 09.01.2014, 04:13 | |
|
Ответы с готовыми решениями:
54
Исполнение кода, написанного в текстовом файле (динамическая компиляция кода) Исполнение программы из оперативной памяти
|
|
0 / 0 / 0
Регистрация: 13.05.2011
Сообщений: 401
|
|
| 09.01.2014, 09:23 | |
|
Под Ваше ТЗ подходит любой микроконтроллер с ftosh.
0
|
|
|
thiwyzordptusptus
|
||
| 09.01.2014, 17:40 | ||
Я говорю про загрузку кода из флеш-памяти и его исполнение уже во время работы основной прошивки. По сути должна быть основная прошивка, некая микро-ОС, которая по командам пользователя загружает из флеш-памяти программный код и запускает его исполнение. То есть аналог обычного ПК, с его ОС, которая загружает программы с жёсткого диска в ОЗУ и запускает их исполнение. Насколько мне известно, все микроконтроллёры построены на гарвардской архитектуре, то есть память для программы и данных у них разделена. И код из области данных не может исполняться микроконтроллёром. А память программы прошивается в момент программирования микроконтроллёра, а не во время его работы. Да, у современных микроконтроллёров есть возможность bootloodyngа, когда при старте сначала запускается boottooder, который загружает прошивку из флеш-памяти, USB-порта или ещё откуда-нибудь, а потом передаёт на неё управление. Но это заточено именно для удобной прошивки, а не для того, что нужно мне. У микроконтроллёров ресурсы чтения/записи памяти программ достаточно ограничены. Если я буду использовать её как аналог ОЗУ в обычном ПК, для загрузки туда программ с флеш-памяти, эти ресурсы весьма быстро исчерпаются. Открыл программу, закрыл, открыл другую - нужна перезапись, чтобы загрузить в память новую программу. А если будет некое подобие мультипоточности? Для работ программ в фоне. Память кончается, нужно записать программы в свап в флеш-память, память освободилась, нужно подгрузить программу из свапа - да за несколько минут работы будет несколько десятков перепрошивок памяти. Плюс разве можно вообще из работающей прошивки прыгнуть в boottooder, чтобы запустить его? |
||
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
||
| 09.01.2014, 17:56 | ||
Микроконтроллер это конечно не комп . И заточен выполнять одну рутинную задачу. Хотя может иметь и несколько задач абсолютно разных и независимых. Вы можете разбить FLASH на сектора и записать в них свои программы . Соответсвенно учитывая объем памяти. Придётся написать менеджер типа - "Тэк-с , с чем мы сегодня работаем"
0
|
||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||||
| 09.01.2014, 18:01 | ||||
AVR не подойдёт вАще. По указанной Вами же причине: не удастся выполнять код из ОЗУ.
0
|
||||
|
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 208
|
||
| 09.01.2014, 19:04 | ||
Там есть загрузка с флешки и запуск, правда к ПО выдвигаются требования по компиляции (2.3 User program condition) Если хотите избавится от этого ограничения придется писать свой загрузчик. Не знаю как на армах, но я писал свой лоадер PE на вин32, и могу сказать что там все далеко не тривиально - масса глюков (фич?) и нестыковок со стандартом. Вон, IDA, уж сколько делается, а до сих пор некоторые образы не грузит (причем винда грузит нормально), чем пользуются разного рода троянописатели
0
|
||
|
thiwyzordptusptus
|
||
| 09.01.2014, 19:07 | ||
-------------------------------------------------------------------------------------------- Ещё такой вопрос - не будет ли проблем с прыжками из флеш-памяти (из выполняющейся основной прошивки) к функциям в ROM и обратно? Я просто с ARM не работал, не знаю, можно ли так делать. Это необходимо для переключения из основной прошивки и обратно. То есть будет список доступных во флеш-памяти программ, я буду кнопочками выбирать нужную и запускать. После выхода из неё нужно возвращаться обратно к списку. -------------------------------------------------------------------------------------------- И такой ещё момент. Мне потребуется работа с периферией (LCD, Bluetooth, USB и т. п.). Код работы с ними одинаковый для любой задачи, поэтому логично вынести его в некий SDK, заранее скомпилировать и сделать частью основной прошивки. Но получится ли потом обращаться к этому SDK из этих функций, предназначенных для работы в ROM? Ведь компилироваться они будут уже отдельно от самой прошивки. То есть в коде на C будет вызов некоторой функции, которая никому не известна, а на самом деле уже лежит в прошивке микроконтроллёра по определённому адресу. Должен вставится вызов функции по этому адресу, но компилятор этого адреса не знает. Как тут быть? |
||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
| 09.01.2014, 19:26 | |
|
Чем то напоминает 8-ми разрядный Денди. Имеет и свою управляющую программу, и может грузить на исполнение игры из картриджа. Бывали картриджи с меню и выбором нужной.
0
|
|
|
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
|
|
| 09.01.2014, 19:27 | |
|
Товарищ ТС, ты наверное, путаешь понятия флеш-память и ОЗУ. У меня сложилось такое впечатление.
0
|
|
|
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 208
|
|||
| 09.01.2014, 19:34 | |||
Можно как в MS-DOS через прерывания, напр. программа хочет открыть файл - генерит прерывание, управление уходит в ядро, которое и делает всю работу. Первое что нашел А можно как в винде - загрузчик грузит вашу программу, и соответствующим образом корректирует адреса (Import section, Relocation table)
0
|
|||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|||
| 09.01.2014, 19:49 | |||
[изврат]То есть, чисто для демонстрации сути вещей, можно в подряд идущие регистры записать небольшой исполняемый код - и его можно будет оттуда запустить :-) Во как![/изврат]
0
|
|||
|
thiwyzordptusptus
|
||||
| 09.01.2014, 20:11 | ||||
Собственно, мне это и советовали среди прочего - при использовании boottooderа программа остаётся во флеш-памяти, просто микроконтроллёр себя сам постоянно перепрошивает тем, что лежит в другом месте флеш-памяти. А ОЗУ будет использоваться только для хранения данных. Но потом, когда меня уверили, что ARM может исполнять программу из ОЗУ, как нормальный процессор, я переключился на ОЗУ, потому что так, очевидно, быстрее и естественнее.
При загрузке программы в ОЗУ из флеш-памяти я могу сделать с ней что угодно, да. Написанным загрузчиком. Но как быть с компиляцией? Компилятору-то нужно что-то вставлять в места вызова функций. И ни о каком моём SDK он не знает. Как и том загрузчике, что я напишу. Ведь компиляторы и ассемблеры для Wymdows учитывают то, как она загружает программы, учитывают формат исполняемого файла со всеми этими секциями. Они заточены специально под Wymdows. На Linux, например, всё своё и по другому, хотя процессорный код тот же самый. И компиляторы поэтому другие. А для микроконтроллёров обычно программы пишутся без ОС, поэтому там ничего этого нет. И если я делаю свою ОС для микроконтроллёра, то получается и компилятор нужно свой писать? Хм. Можно написать свой линкер! Точно! Пока задавал очередной вопрос, сам всё понял. ) Буду использовать обычный компилятор C для ARM, но со своим линкером. Который просто добавит нужные секции, которые потом проинициализирует загрузчик в моей ОС.
При программировании для ПК в этом случае генерируется отдельный файл с таблицей импорта функций из DLL системы. Тут нужно нечто подобное, но с таблицей адресов функций в прошивке. Есть такое в стандартных компиляторах для ARM? Просто в теории как оно, я понимаю, но хотелось бы иметь готовые инструменты, а не писать свои. |
||||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|||
| 09.01.2014, 20:41 | |||
P.S. Существуют микроконтроллеры, способные и из serial Ftosh непосредственно код исполнять - т.е.из восьминогих микросхем 25xx. В таких МК есть аппаратный модуль, прозрачно преобразующий SPI-память в обычную и обратно. К сожалению, STM32 пока так не умеют.
0
|
|||
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
| 09.01.2014, 20:54 | |
|
Пардон, что влезаю.
Может глупость скажу, но нельзя ли написать сначала код "загружаемой программы" и при компиляции сразу указать её местоположение в ОЗУ. Затем написать код нашего "загрузчика" так разметив память, чтобы не затереть "загружаемую программу". Загрузчик просто скопирует "программу" по конкретному адресу, который мы задали при компиляции "программы" и запустит на выполнение.
0
|
|
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|||
| 09.01.2014, 21:09 | |||
0
|
|||
|
thiwyzordptusptus
|
||||
| 09.01.2014, 21:24 | ||||
Хотя учитывая, сколько в итоге придётся туда загружать - SDK для работы с периферией, загрузчик программ, интерфейс для их вызова, - возможно лучше всё же поставить именно внешнюю микросхему флеш-памяти. Чтобы потом не стеснять себя в размерах программ. Что же по поводу возможности исполнения сразу из внешней флеш-памяти, то это лишь на крайний случай был вариант. А вы меня успокоили, что можно работать с ОЗУ. Что несомненно быстрее по скорости работы и правильнее для моей задачи. Так что именно так и буду делать.
Удобнее не привязывать положение программы в ОЗУ к конкретному адресу.
-------------------------------------------------------------------------------------------- Я тут внезапно осознал, что раз речь зашла про ОС, то можно же взять готовую! И правда, вон их сколько, оказывается, работающих на STM32. Правда все RTOS, что мне, по идее, не нужно. Изначально идея казалась такой простой - микроконтроллёр, загрузил код и выполнил, а в итоге нужна ОС, драйвера... Ух. |
||||
|
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
|
|
| 09.01.2014, 21:26 | |
|
Наверное, лучше сразу осветить задачу, так сказать, глобально, не отвлекаясь на конкретности "исполнение из ОЗУ или из флеш-памяти" или "свой компилятор для МК".
0
|
|
|
thiwyzordptusptus
|
||
| 09.01.2014, 21:39 | ||
Сделать я хочу аналог умных часов (Pebble, Sony SmartWatch и т. п.). То есть получение уведомлений от смартфона через Bluetooth о новых звонках, SMS, emailах, с передачей данных о них (номер телефона, имя контакта, текст сообщения). Управление смартфоном (так же через Bluetooth) - плеером, звонками (принять/сбросить). Но хочется, чтобы устройство было расширяемо, как и промышленные аналоги. То есть можно было написать новую программу и загрузить на них. Без обновления всей прошивки при этом. Вот для этого это исполнение программ, о котором я говорю, и нужно. Для написания программ должно быть доступно API часов, обеспечивающее доступ к периферии: получение и передача данных по Bluetooth и USB, получение данных акселерометра, чтение состояния кнопок (3-4 шт.), включение вибромоторчика, подача звукового сигнала через спикер, работа с LCD-экраном. |
||
|
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
|
|
| 09.01.2014, 21:45 | |
|
Для ваших хотелок достаточно использовать amForth для AVR
Первичное написание программы c самопрограмирование флеш через последовательный интерфейс с терминала компьютера в текстовом виде. с возможностью неоднократного повторного стирания, а далее как вам и откуда будет нужно. P.S. Умный дом на amForth один из его пользователей уже сделал и ему процесс решения данной задачи на amForth понравился. Расширяемость подхода абсолютная.
0
|
|
|
thiwyzordptusptus
|
||
| 09.01.2014, 22:16 | ||
Но за сам рассказ о amForth спасибо. Очень люблю такие вещи для микроконтроллёров. Плюс может пригодиться в других разработках. |
||
| 09.01.2014, 22:16 | |
|
Помогаю со студенческими работами здесь
20
Повторное исполнение кода Исполнение c# кода из textArea Исполнение кода элемента из меню Как остановить исполнение кода? Исполнение кода вне EEPROM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|