Arduino и дозагрузка программы

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
54
8
23
[email protected]
t.me
Наверное ни кому не секрет, что в х86 процессор программу выполняет в RAM.

На avr же, она исполняется прямо в ПЗУ. Вопрос: есть ли способ догружать программу на уже запущенной ардуино например с sd card?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
На ядре ARM точно можно. Но это уже Cortex.

Для обычного ядра инфы не встречал. В Гарвардской архитектуре такое проблематично.
1610009251075.png

Обобщённая блок схема Atmel ядра. Счётчик команд управляет Flash, SRAM висит на другой шине. И счётчику команд не доступна.
 
Изменено:
  • Лойс +1
Реакции: qbaddev

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,132
412
Москва
wan-derer.ru
@qbaddev, можно используя механизм бутлоадера. Собственно, Ардуино так и делает, сама себя прошивает, получая данные по уарт.
Другой вопрос: зачем, а главное нафига? Учитывая что загрузка происходит во флэш.
Обычно, если не хватает памяти программ, просто берут МК пожирнее.
 
  • Лойс +1
Реакции: stepko

Un_ka

★★✩✩✩✩✩
13 Июл 2020
243
77
других форумов.
На Ардуино с wifinina есть возможность прошивки по воздуху. На esp вроде тоже подобное делали. Но для загрузки в память МК могут быть два варианта исполнения:
  1. Есть несколько прошивок, которые загрузчик загружает откуда-то, причём прошивки не зависят друг от друга. Также происходит сброс sram при загрузки новой прошивки. Не могу привести пример ситуации, когда такое понадобится.
  2. Загрузчик подгружает из внешнего flash программу по кускам, здесь всё гораздо сложнее.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
Наверное ни кому не секрет, что в х86 процессор программу выполняет в RAM.
Вот ключевая фраза.
Я точно знаю что контроллеры построенные по архитектуре фон Неймана это умеют.
Atmel построен по Гарвардской архитектуре. Там RAM и ROM сидят на разных шинах и вряд ли умеют выполнять код из RAM.

Загрузчик подгружает из внешнего flash программу по кускам, здесь всё гораздо сложнее.
Если он грузит в ROM, проблем нет. Если грузит в RAM, нужен пример. Я не отрицаю, что такое возможно, я ни разу не видел примера, что бы понять технологию.
 

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
54
8
23
[email protected]
t.me
На Ардуино с wifinina есть возможность прошивки по воздуху. На esp вроде тоже подобное делали. Но для загрузки в память МК могут быть два варианта исполнения:
  1. Есть несколько прошивок, которые загрузчик загружает откуда-то, причём прошивки не зависят друг от друга. Также происходит сброс sram при загрузки новой прошивки. Не могу привести пример ситуации, когда такое понадобится.
  2. Загрузчик подгружает из внешнего flash программу по кускам, здесь всё гораздо сложнее.
Ну, это не вариант.
 

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
54
8
23
[email protected]
t.me
На ядре ARM точно можно. Но это уже Cortex.

Для обычного ядра инфы не встречал. В Гарвардской архитектуре такое проблематично.
Посмотреть вложение 20679

Обобщённая блок схема Atmel ядра. Счётчик команд управляет Flash, SRAM висит на другой шине. И счётчику команд не доступна.
Вижу это, единственное решение) Спасибо
 

Un_ka

★★✩✩✩✩✩
13 Июл 2020
243
77
других форумов.

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Когда-то находил загрузчик программ с SD картридера. Но там, на память, использовалась некая сильно упрощенная ФС, и подгружать он мог только всю программу целиком и обязательно файл программы должен был быть первым в корневом каталоге, что требовало отдельной карты на каждую программу. Иначе не хватало загрузочного куска флеш для системы "поумнее".

Собственно, это та самая причина (кроме любопытства что может Атмел Мега2560 по максиуму?) из-за которой в свое время и начал ваять свою плату и блок расширенного SRAM. Оптимально (дешево, но больше 64кб) получилось на микросхемах в 512кбайт. Тут в проектах, где-то есть тема, в которой описан процесс расширения SRAM и что и как надо модифицировать в работе ИДЕ (в основном новый файл линковки) чтобы использовать всю память напрямую из программ, в т.ч. и в виде массивов.

В процессе разработки и отладки сего чуда, пришел к пониманию, что вполне можно сделать свою небольшую ОС, которая будет сидеть частично в конце программного блока флеш и занимать блок "загрузчика" с тем, чтобы решить вопрос "оверлейного загрузчика программ с SD картридера. При этом, вполне можно перенести массив векторов прерываний в "верхнюю флеш" (Атмел - позволяет) и реализовать доступ к работе с устройствами "типовыми драйверами ОС", при необходимости с подключением блоков обработки прерываний из программ, по типу "софтовая реализация функции".

А реализовав такую ОС, в приложении к имеющейся у меня библиотеке "автоматного программирования", в совокупности с реализацией "канального взаимодействия" а-ля АДА, Go .. вопрос диспетчера задач и реализации горутин становился "никчемным" или сильно упрощался. Но .. применять 0-таймер для служб ОС - посчитал слишком накладным, т.к. только он в совокупности с таймером 1, способен управлять 13-м пином одновременно, позволяя программировать "пакеты импульсов"...

В общем, подгружать куски ПО во флеш, так же как это делает загрузчик - вполне реально, "хоть откуда". Флеш стирается блоками по 256байт, так что "тереть" рабочие участки в общем-то нет никакой необходимости. Но, для этого требуется переработка файла линковки, чтобы он при сборке компилированного куска (оверлея) настраивал его во-первых с адреса, кратного 256, а во вторых фиксировал его размер кратно размеру страницы флеш.

Технически, это ничего сложного из себя не представляет, а поскольку SD читается блоками по 512байт (сектор), то даже родного ОЗУ для такой работы у Мега2560 вполне достаточно. Вопрос только в том, "кто бы это все сделал", который как обычно упирается в другой: "а зачем?"
:)

P.S.
Вопрос загрузки программ в SRAM "целиком" и их исполнения не стоит совсем, т.к. этой самой "срам" кот наплакал, а во-вторых Гарвардская архитектура не позволит исполнять из срама ничего от слова совсем, только если не делать некий интерпретатор (а-ля JS) со своим "байт-кодом".
Только опять же: "нафига козе баян?"
 
Изменено:

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
54
8
23
[email protected]
t.me
Когда-то находил загрузчик программ с SD картридера. Но там, на память, использовалась некая сильно упрощенная ФС, и подгружать он мог только всю программу целиком и обязательно файл программы должен был быть первым в корневом каталоге, что требовало отдельной карты на каждую программу. Иначе не хватало загрузочного куска флеш для системы "поумнее".

Собственно, это та самая причина (кроме любопытства что может Атмел Мега2560 по максиуму?) из-за которой в свое время и начал ваять свою плату и блок расширенного SRAM. Оптимально (дешево, но больше 64кб) получилось на микросхемах в 512кбайт. Тут в проектах, где-то есть тема, в которой описан процесс расширения SRAM и что и как надо модифицировать в работе ИДЕ (в основном новый файл линковки) чтобы использовать всю память напрямую из программ, в т.ч. и в виде массивов.

В процессе разработки и отладки сего чуда, пришел к пониманию, что вполне можно сделать свою небольшую ОС, которая будет сидеть частично в конце программного блока флеш и занимать блок "загрузчика" с тем, чтобы решить вопрос "оверлейного загрузчика программ с SD картридера. При этом, вполне можно перенести массив векторов прерываний в "верхнюю флеш" (Атмел - позволяет) и реализовать доступ к работе с устройствами "типовыми драйверами ОС", при необходимости с подключением блоков обработки прерываний из программ, по типу "софтовая реализация функции".

А реализовав такую ОС, в приложении к имеющейся у меня библиотеке "автоматного программирования", в совокупности с реализацией "канального взаимодействия" а-ля АДА, Go .. вопрос диспетчера задач и реализации горутин становился "никчемным" или сильно упрощался. Но .. применять 0-таймер для служб ОС - посчитал слишком накладным, т.к. только он в совокупности с таймером 1, способен управлять 13-м пином одновременно, позволяя программировать "пакеты импульсов"...

В общем, подгружать куски ПО во флеш, так же как это делает загрузчик - вполне реально, "хоть откуда". Флеш стирается блоками по 256байт, так что "тереть" рабочие участки в общем-то нет никакой необходимости. Но, для этого требуется переработка файла линковки, чтобы он при сборке компилированного куска (оверлея) настраивал его во-первых с адреса, кратного 256, а во вторых фиксировал его размер кратно размеру страницы флеш.

Технически, это ничего сложного из себя не представляет, а поскольку SD читается блоками по 512байт (сектор), то даже родного ОЗУ для такой работы у Мега2560 вполне достаточно. Вопрос только в том, "кто бы это все сделал", который как обычно упирается в другой: "а зачем?"
:)

P.S.
Вопрос загрузки программ в SRAM "целиком" и их исполнения не стоит совсем, т.к. этой самой "срам" кот наплакал, а во-вторых Гарвардская архитектура не позволит исполнять из срама ничего от слова совсем, только если не делать некий интерпретатор (а-ля JS) со своим "байт-кодом".
Только опять же: "нафига козе баян?"
Очень информативно, спасибо.
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@qbaddev, к сожалению, это был где-то 2016-2017год, точнее не помню. Тогда скачивал исходник, среди прочих других загрузчиков, но вот где оно лежит сейчас? Крайне сложно .. искать среди 4-6 архивных винтов, снятых в свое время "за старостью", да ещё и через ноут .. пока никак. :(
 
  • Лойс +1
Реакции: qbaddev