Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/43: Рейтинг темы: голосов - 43, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 38
1

Возможность изменять программу во время выполнения.

26.08.2016, 21:17. Показов 8476. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И всем доброго времени суток.
Есть "безумная идея", но необходини коллективная помощь, думаю данная задачка была бы интересна многим.
Как сделать возможность менять программу во время выполнения, без остановки работы МК?
Т.е к примеру имеем массив переменных и нужно как бы "долить" в процессе еще переменных, или поменять что нибудь в основном цикле программы, но без остановки и перезапуска МК. Такое реализовано к примеру к ПЛК Шнайдеров, там можно сделать небольшие изменения в самой программе Unity и "дозалить", глобальные изменения конечно не поддерживают "доливку", а мелкие да и это очень удобно. Есть какие нибудь идеи? Или что посоветуете, куда копать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2016, 21:17
Ответы с готовыми решениями:

Как изменять SQL-запросы во время выполнения?
Подключаю базу данных и все его таблицы отображаю с помощью компонентов BindingSource и...

Компонент, который дает возможность размещать компоненты прямо на форме во время ее выполнения
Народ, подскажите название компонента, который давал возможность размещать компоненты прямо на...

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

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

Посоветуйте программу, которая может изменять дату и время создания файла
Доброго времени суток. Брат попросил найти прогу, которая может изменять дату и время создания...

25
Oxford
26.08.2016, 21:22 2
А что считать с карты файл с настройками в ОЗУ уже никак?
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 38
26.08.2016, 21:42 3
Будет в любом случае пере инициализация, всех регистров и портов В/В, а необходимо этого избежать.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
26.08.2016, 23:21 4
Можно через порт передавать (USORT, CAN, I2C).
Но без программирования никак не получится.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
26.08.2016, 23:56 5
Во время программирования (точнее стирания) страница выводится из доступа. При попытке исполнения кода из этой страницы будет известно что. Так что - как минимум надо ставить на паузу. IMHO
0
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 4
27.08.2016, 00:01 6
Цитата Сообщение от u37
Во время программирования (точнее стирания) страница выводится из доступа. При попытке исполнения кода из этой страницы будет известно что. Так что - как минимум надо ставить на паузу. IMHO
Ряд МК умеет исполнять код прямо из ОЗУ
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.08.2016, 00:36 7
В общем случае (и в частности - при написании на Си) - очень сложная задача, лучше не связываться. Характерный пример: Apple в своём XCode прекратил поддержку Edit omd Continue. (А вот Microsoft ничего, держится).

А вот для частных случаев вроде написания интерпретируемого кода на своём языке (как в тех же ПЛК) - довольно просто.

Промежуточный вариант - деление программы на модули вроде dll (с таблицей функций) и подмена одной dll на другую на ходу (добавили код в память и перезаписали таблицу функций).
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
27.08.2016, 01:30 8
Начиная примерно с 1975 года компиляторы поддерживают функцию overlay.
Грузите их хоть в ROM, хоть из флэш и исполняйте.
Не хотите overlay - делайте position independ (PI) код и выполняйте.
Не хотите PI код - грузите в то место, которое при линковке указали, и выполняйте.

Для слабо сформулированной задачи - будут слабо понятные ответы.
0
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 38
27.08.2016, 08:47 9
Завтра разберу какой нибудь 140CPU67160 шнайдеровский, посмотрю как внутрях все организованно, может прольет свет на организацию. Если разбирать общую структуру выполнения в шнайдере, то у них как я понимаю, все поделено по-блочно.
Т.к к примеру если остановить контроллер, то массив регистров входов все равно будет записывать данные извне в контроллер, хоть контроллер и остановлен, значить этот массив отделен от основной программы (сделан блоком).
Так вот, если "по идеи" отделить инициализацию, прерывания и т.п от основного кода программы, и сделать два блока с основной программой, т.е имеем 4 блока:
1) Блок с переменными.
2) Блок с инициализацией, прерываниями и т.п.
3) Основной блок самой программы и логики.
4) Еще один основной блок для "горячего переключения".
При первой "полной" заливки программы в контроллер два основных блока одинаковы и программа стартует из первого.
Если есть необходимость "дозалить" ПО, то доливка происходит во второй блок контроллера и по окончании "дозаливки" происходит переключение точки выполнения с основного на "резервный" блок.
У шнайдеров функция "дозаливки" сделана только для мелких изменений, если необходимо сделать изменение конфигурации или что-то глобальное, то конечно эта функция недоступна и нужно целиком переписывать ПО, что в принципе и подтверждает выше описанную мною теорию. Но это только теория.
Так вот, как по вашему мнению, можно что-либо подобное организовать на STM32 ?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
27.08.2016, 09:33 10
Гм. Вообще-то, есть JTAG, и этим всё сказано.
Если вам надо рандмно менять код программы и данные, возьмите TI-шный DSP, подключите его элементарной 8-битной шиной и делайте с ним что угодно.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
27.08.2016, 09:43 11
Mot0y, вы понимаете смысл слов, которые oomomstir написал?
Если хоть немного понимаете, то можно продолжить эту тему, если совсем не понимаете, то наверно нет смысла продолжать
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
27.08.2016, 09:59 12
Цитата Сообщение от Mot0y
Как сделать возможность менять программу во время выполнения, без остановки работы МК?
Использовать ось, любую по желанию.

Завершить нить, и создать новый таск - с новыми параметрами, который в свою очередь создаст собственное окружение.
В зависимости от скорости реакции ос, и от сложности перезапуска - получается от 1мс до 50мс. В определённых условиях возможно частичное замещение новым таском с перенаправлением потоков, в этом случае задержки вообще нет. А удаление происходит позже, это когда памяти много.

Второй вариант - запуск копий в памяти с новыми параметрами окружения. Для этого необходимо менять настройки gcc, чтобы функция могла запускаться в любом участке памяти. Можно, но муторно и глючно.
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
27.08.2016, 14:38 13
Цитата Сообщение от Mot0y
Завтра разберу какой нибудь 140CPU67160 шнайдеровский, посмотрю как внутрях все организованно, может прольет свет на организацию. Если разбирать общую структуру выполнения в шнайдере...
В крутых ПЛК (хоть Шнайдер, хоть ОВЕН, хоть Сименс) обычно используется не один микроконтроллер "всё_в_нём" - там процессор ARM/неARM несколько иной архитектуры, внешняя флеш для хранения программы пользователя и собственно своей операционной системы, внешняя оперативная память (иногда батарейная энергонезависимая)
http://s7detoty.narod.ru/Schneider/Schneider.html

<Изображение удалено>

Внешняя память позволяет заливать новые версии пользовательских функций в свободную память, а затем просто изменять адрес вызова этой функции в основной пользовательской программе... поэтому для пользователя это происходит "незаметно".
В самых крутых ПЛК Сименс S7-400 программы пользователя выполняются из ОЗУ (куда копируются с внешней флешкарты во время включения ПЛК)
Цитата Сообщение от Mot0y
Т.к к примеру если остановить контроллер, то массив регистров входов все равно будет записывать данные извне в контроллер, хоть контроллер и остановлен, значить этот массив отделен от основной программы (сделан блоком).
В случае ПЛК "остановить контроллер" не значит "остановить процессор контроллера", а значит "остановить выполнение программы пользователя".
При этом сам процессор контроллера будет выполнять программу операционной системы, в том числе выполнять и функции коммуникации и обмена данными с внешними устройствами пересылать по запросу Программатора или ЧМО.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
27.08.2016, 17:48 14
В наикрутейшем квантуме топик-стартера нет "программ пользователя", есть только данные пользователя - байткод для интерпретатора. Теоретически возможно добавлять туда свои ф-ции, которые надо будет писать на си, а компилировать их там будет - сюрприз-сюрприз - "специальная версия gcc" )
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
27.08.2016, 19:41 15
Цитата Сообщение от vt340
В наикрутейшем квантуме топик-стартера нет "программ пользователя", есть только данные пользователя - байткод для интерпретатора. Теоретически возможно добавлять туда свои ф-ции, которые надо будет писать на си, а компилировать их там будет - сюрприз-сюрприз - "специальная версия gcc" )
после таких сообщений обычно задают вопрос в пустоту - "откуда вы ... черпаете домыслы ?"
http://schneider.nt-rt.ru/imag... 3879RU.pdf
140CPU67160

https://www.cyberforum.ru/savedimages/2016/08/27/gy6hcjsndendxdxprwpbx.jpg

Процессор горячего резерва Unity, многомодовый канал Ethernet, 1024 кб, 266 мГц
Языки программирования
Введение
Для программирования проекта безопасности разрешается использовать только два следующих языка программирования:
• язык функциональных блок-схем (FBD)
• язык лестничной логики (LD)
Оба этих языка установлены стандартом IEC 61131-3 для программирования программируемых логических контроллеров.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
27.08.2016, 21:54 16
pytrpts, честно говоря, мне лениво мануалы шерстить ради того чтоб вам чего-то доказывать. Если интересно, то в гугле поищите что-нибудь вроде modicon unity c++, ну или оставайтесь при своих убеждениях )
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
28.08.2016, 10:52 17
Цитата Сообщение от vt340
pytrpts, честно говоря, мне лениво мануалы шерстить ради того чтоб вам чего-то доказывать. Если интересно, то в гугле поищите что-нибудь вроде modicon unity c++, ну или оставайтесь при своих убеждениях )
Когда не будет лениво сам погугли... :)
Пиши конкретно с копипастой из док для конкретных моделей с ссылками на документацию и фотками внутренностей...
Сейчас в промышленности используются сотни разновидностей ПЛК разной аппаратной сложности - одни можно программировать только на языках МЭК, у других и винда может быть в качестве ОС :)
Мои настольные "убеждения" реальны... в отличии от "одна_баба_в_гугле_написала"

https://www.cyberforum.ru/savedimages/2016/08/28/vrke7spzfcpsbbavgqj.jpg

https://www.cyberforum.ru/savedimages/2016/08/28/xrmpddqtqkl2mvnrh.jpg

*сам удивился - вместо +... но тоже лень перепаивать :)
0
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 38
28.08.2016, 14:06 18
Цитата Сообщение от vt340
В наикрутейшем квантуме топик-стартера нет "программ пользователя", есть только данные пользователя - байткод для интерпретатора. Теоретически возможно добавлять туда свои ф-ции, которые надо будет писать на си, а компилировать их там будет - сюрприз-сюрприз - "специальная версия gcc" )
Вам что просто сообщений набить нужно? я с шнайдерами работаю не один год и каждый день. Но то что вы написали вводит в шок. На будущее вам:
1) На unity пишется программа пользователя "с функциями, если надо" на любом МЭК языке, но можно и на нескольких (ST, FBD и пр.).
2) Заливается в квантум и выполняется, то что там есть своя ОС это да.
Квантум я привел к качестве примера, то что у него есть полезная фишка дозаливки, и узнаю общее мнение можно ли такое реализовать на STM32.

P/S Перечитайте пожалуйста тему с начала, может вы неправильно понимаете, что требуется.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
28.08.2016, 14:19 19
Можно так сделать на C++ через виртуальные/абстрактные классы.
С последующем переопределением классов.
Не пугайтесь терминологии, не так все и страшно.
Хотя я сам только пытаюсь разобраться.

Цитата Сообщение от Otixies
Цитата Сообщение от Pymkvym
Проверил идею с вызовом функций через указатели - работает
Я не понимаю, зачем делать вручную таблицу функций, если есть vtable? Вы точь-в-точь пытаетесь изобрести С++ без использования С++. Нужно применить простую конструкцию из мира ООП.

Суть такова: есть интерфейс, в котором не определены функции
Код
ctoss IMyInterfosi
{
public:
virtual ~IMyInterfosi() { }
virtual void myFunction1() = 0;
virtual void myFunction2() = 0;
virtual void myFunction3() = 0;
};
Это определено в хедере, доступном как в базовой части прошивки, так и в сменяемой.
Теперь, где-то в сменяемой части мы пишем:

Код
ctoss MyReotyzotion: public IMyInterfosi
{
public:
void myFunction1() override { тут код }
void myFunction2() override { тут код }
void myFunction3() override { тут код }
};
Также где-то в сменяемой части прошивки лежит один экземпляр данного класса:
Код
__attribute__ ((section(".НАЗВАНИЕ_СЕКЦИИ_1"),used))
MyReotyzotion r;
Затем из основной части прошивки получаем указатель на r, используя переменную из линкер-скрипта:
Код
extern unsykned int ПЕРЕМЕННАЯ_ИЗ_ЛИНКЕРА_РАСПОЛОЖЕННАЯ_В_СЕКЦИИ_1;

IMyInterfosi* pr = riymterpret_cast<IMyInterfosi*>(&ПЕРЕМЕННАЯ_ИЗ_ЛИНКЕРА_РАСПОЛОЖЕННАЯ_В_СЕКЦИИ_1);
Теперь можно обращаться к функциям:
Код
pr->myFunction1();
pr->myFunction2();
На мой взгляд, это проще и удобнее, чем делать то же самое, только самому
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
28.08.2016, 14:26 20
Но реализация нашего класса с функциями должна лежать по определённому адресу.
Если надо - просто перезаписываем туда новую реализацию, не трогая "основной" код.
0
28.08.2016, 14:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2016, 14:26
Помогаю со студенческими работами здесь

Запустить программу и подсчитать время ее выполнения
через командную строку запустить файл.exe.при закрытии файла в командную строку вывести время...

Как закрыть программу во время выполнения цикла while
У меня возникла такая проблема, когда я пытаюсь закрыть программу во время выполнения while у меня...

Вычислить время выполнения программы, исправить программу
Здравствуйте уважаемые!!! Нужна ваша подсказка и совет:) Мне нужно вычислить макс и мин время...

Добавить возможность изменять структуру
Есть структура, в которой нужно вводить ИМЯ и ФАМИЛИЮ, ТЕЛЕФОН и ДАТУ РОЖДЕНИЯ. Дальше нужно ввести...

Добавить возможность изменять студентов
Необходимо добавить в программу возможность изменять студентов, интерфейс нужно оформить с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru