|
Несколько программ в одной прошивке, Как проще сделать? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Aug 3 2007, 06:51
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(Непомнящий Евгений @ Aug 3 2007, 08:47)  ИАР 4.30 + Atmega128
У меня есть устройство которое выполняет несколько несвязанных между собой функций. Хотелось бы разместить эту функциональность в разных программах. При включении устройства запускается основная программа, пользователь может войти в меню и выбрать там другую программу. При этом устройство перезагрузится и она начнет выполняться.
Как это можно реализовать?
Я представляю примерно так: при загрузке устройства запускается программа-загрузчик, которая в зависимости от какого-то байта в епроме дальше передает управление по разным адресам. Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы? ...вопрос, а пользователь будет задавать выпополняемую программу при каждом запуске устройства?
|
|
|
|
|
Aug 3 2007, 09:46
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Непомнящий Евгений @ Aug 3 2007, 08:47)  Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы? Да можно, главное что бы они не пересекались. ( разные xcl файлы) Так можно объеденить бутлоадер с основоной программой. Но вот с разными программами сложнее - как быть с прерываниями? Можно конечно орабатывать все прерывания в мониторе - и монитор передаст управление активной программе...
|
|
|
|
|
Aug 4 2007, 07:52
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(haker_fox @ Aug 4 2007, 09:30)  Может быть написать одну программу, а режим работы выбирать из стартового меню. Почему невозможен данный вариант? Да собственно примерно так оно счас и реализовано. Устройство запускается в основном режиме, а при выборе соответствующего пункта меню переходит в дополнительные. При этом основная программа "паркует" свуои данные и фактически прекращает работу. Но меня смущает то, что при этом переходе надо отрубить/перенастроить все прерывания - если что-то забыть - то управление пойдет в основную программу, что плохо. Кроме того, в оперативке по прежнему висят все глобальные объекты, хотя текущей "программе" они не нужны. Если такой дополнительной программе нудны прерывания, то в обработчике прерывания надо проверять некий флаг и передавать управление либо "основной" либо одной из дополнительных программ. Я думал, как от всего этого избавиться - возникла мысль о собственном "загрузчике", как в настольной ОС. Но судя по вашим ответам, это создаст массу новых проблем, так что наверное оставлю все как счас.
|
|
|
|
|
Aug 8 2007, 12:06
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 30-05-06
Из: Минск,Белорусия
Пользователь №: 17 572

|
Извиняюсь если что не так понял. Мне кажется исполниемые модули можно загружать разные без проблем, можно использовать указатели на функции. Создать, например, константную структуру из указателей, проинициализированных соответствующими фукциями. Выбираем нужную структуру(тип структуры для всех задач один) , инициализируем переферию заново и новый цикл с новой исполнительной части загружается. С прерываниями можно также поступить, если не сильно критичен вызов функции в прерывании, или в зависимости от специфики использования прерываний одного типа, обработчик может быть общий, а использование данных от функции каждая задача определяет сама.
Добавление программы/задачи - нужно компилировать весь проект(вам и так придется компилировать + дорабатывать прошивку) . При работе процессор перегружать не нужно.
|
|
|
|
|
Aug 8 2007, 12:52
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата Но меня смущает то, что при этом переходе надо отрубить/перенастроить все прерывания - если что-то забыть - то управление пойдет в основную программу, что плохо. Перенастроить прерывания не так уж и сложно. Для каждой вашей "программы" делаете доп. функции open и close к примеру. В open разрешаете все необходимые прерывания, в close их запрещаете. Цитата Кроме того, в оперативке по прежнему висят все глобальные объекты, хотя текущей "программе" они не нужны. А зачем вам глобальные объекты, которые использутся только в одной функции? Сделайте их локальными.
|
|
|
|
|
Aug 8 2007, 13:31
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Непомнящий Евгений @ Aug 3 2007, 08:47)  ИАР 4.30 + Atmega128
У меня есть устройство которое выполняет несколько несвязанных между собой функций. Хотелось бы разместить эту функциональность в разных программах. При включении устройства запускается основная программа, пользователь может войти в меню и выбрать там другую программу. При этом устройство перезагрузится и она начнет выполняться.
Как это можно реализовать?
Я представляю примерно так: при загрузке устройства запускается программа-загрузчик, которая в зависимости от какого-то байта в епроме дальше передает управление по разным адресам. Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы? Наипростейший вариант реализации (на мой взгляд). 1. Или из EEPROM или чтение входных портов конфигурации. 2. Инициализация в зависимости от п.1 (switch). 3. В фоне и во всех прерывания тоже switch. Единственный не очень ясный момент - переход в другой режим. Вероятно, после этого надо начинать от печки сразу.
|
|
|
|
|
Aug 9 2007, 07:32
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(_Sam_ @ Aug 8 2007, 16:52)  А зачем вам глобальные объекты, которые использутся только в одной функции? Сделайте их локальными. А кто говорит, что они только в одной функции? Устройство имеет основную задачу, на которую нацелены все его перерывания, память и т.д. Кроме того, его можно переключить в другую задачу (обычно сравнительно маленькую - типа преобразования интерфейсов или загрузки\выгрузки инфы). При этом основная задача прекращает исполняться. Цитата(alexander55 @ Aug 8 2007, 17:31)  Наипростейший вариант реализации (на мой взгляд). 1. Или из EEPROM или чтение входных портов конфигурации. 2. Инициализация в зависимости от п.1 (switch). 3. В фоне и во всех прерывания тоже switch. Единственный не очень ясный момент - переход в другой режим. Вероятно, после этого надо начинать от печки сразу. Да собственно так оно счас и сделано. Просто меня "посетила" мысль - реализовать для каждой независимой задачки отдельную "программу" - отдельно компилируемую, отлаживаемую и т.д. + некий загрузчик, который при старте передает управление. Но судя по всему, геморрой который при этом появляется того не стоит. Так что тема наверное закрыта. Спасибо всем за посты.
|
|
|
|
|
Aug 9 2007, 09:54
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Непомнящий Евгений @ Aug 9 2007, 11:32)  А кто говорит, что они только в одной функции? Устройство имеет основную задачу, на которую нацелены все его перерывания, память и т.д. Кроме того, его можно переключить в другую задачу (обычно сравнительно маленькую - типа преобразования интерфейсов или загрузки\выгрузки инфы). При этом основная задача прекращает исполняться. Да собственно так оно счас и сделано. Просто меня "посетила" мысль - реализовать для каждой независимой задачки отдельную "программу" - отдельно компилируемую, отлаживаемую и т.д. + некий загрузчик, который при старте передает управление. Но судя по всему, геморрой который при этом появляется того не стоит. Так что тема наверное закрыта. Спасибо всем за посты. Еще вариант, если не возражаете. Сделать типа Setup (как в PC), в который попадаем при какой- то комбинации.
Сообщение отредактировал alexander55 - Aug 9 2007, 10:37
|
|
|
|
|
Aug 9 2007, 10:16
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата А кто говорит, что они только в одной функции? Цитата Кроме того, в оперативке по прежнему висят все глобальные объекты, хотя текущей "программе" они не нужны. Я имел в виду, что на каждую из ваших "программ" будет заведено по одной функции.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|