0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 38
|
|
1 | |
Возможность изменять программу во время выполнения.26.08.2016, 21:17. Показов 8476. Ответов 25
Метки нет (Все метки)
И всем доброго времени суток.
Есть "безумная идея", но необходини коллективная помощь, думаю данная задачка была бы интересна многим. Как сделать возможность менять программу во время выполнения, без остановки работы МК? Т.е к примеру имеем массив переменных и нужно как бы "долить" в процессе еще переменных, или поменять что нибудь в основном цикле программы, но без остановки и перезапуска МК. Такое реализовано к примеру к ПЛК Шнайдеров, там можно сделать небольшие изменения в самой программе Unity и "дозалить", глобальные изменения конечно не поддерживают "доливку", а мелкие да и это очень удобно. Есть какие нибудь идеи? Или что посоветуете, куда копать?
0
|
26.08.2016, 21:17 | |
Ответы с готовыми решениями:
25
Как изменять SQL-запросы во время выполнения? Компонент, который дает возможность размещать компоненты прямо на форме во время ее выполнения Написать программу, позволяющую считывать и изменять локальное время Написать программу, позволяющую считывать и изменять системное время Посоветуйте программу, которая может изменять дату и время создания файла |
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
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
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
http://schneider.nt-rt.ru/imag... 3879RU.pdf
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
Пиши конкретно с копипастой из док для конкретных моделей с ссылками на документацию и фотками внутренностей... Сейчас в промышленности используются сотни разновидностей ПЛК разной аппаратной сложности - одни можно программировать только на языках МЭК, у других и винда может быть в качестве ОС :) Мои настольные "убеждения" реальны... в отличии от "одна_баба_в_гугле_написала" 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
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
Суть такова: есть интерфейс, в котором не определены функции Код
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; Код
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 | |
28.08.2016, 14:26 | |
Помогаю со студенческими работами здесь
20
Запустить программу и подсчитать время ее выполнения Как закрыть программу во время выполнения цикла while Вычислить время выполнения программы, исправить программу Добавить возможность изменять структуру Добавить возможность изменять студентов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |