реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Несколько программ в одной прошивке, Как проще сделать?
Непомнящий Евген...
сообщение Aug 3 2007, 04:47
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



ИАР 4.30 + Atmega128

У меня есть устройство которое выполняет несколько несвязанных между собой функций. Хотелось бы разместить эту функциональность в разных программах. При включении устройства запускается основная программа, пользователь может войти в меню и выбрать там другую программу. При этом устройство перезагрузится и она начнет выполняться.

Как это можно реализовать?

Я представляю примерно так: при загрузке устройства запускается программа-загрузчик, которая в зависимости от какого-то байта в епроме дальше передает управление по разным адресам. Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы?
Go to the top of the page
 
+Quote Post
tag
сообщение Aug 3 2007, 06:51
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Непомнящий Евгений @ Aug 3 2007, 08:47) *
ИАР 4.30 + Atmega128

У меня есть устройство которое выполняет несколько несвязанных между собой функций. Хотелось бы разместить эту функциональность в разных программах. При включении устройства запускается основная программа, пользователь может войти в меню и выбрать там другую программу. При этом устройство перезагрузится и она начнет выполняться.

Как это можно реализовать?

Я представляю примерно так: при загрузке устройства запускается программа-загрузчик, которая в зависимости от какого-то байта в епроме дальше передает управление по разным адресам. Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы?



...вопрос, а пользователь будет задавать выпополняемую программу при каждом запуске устройства?
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 3 2007, 09:46
Сообщение #3


Профессионал
*****

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



Цитата(Непомнящий Евгений @ Aug 3 2007, 08:47) *
Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы?

Да можно, главное что бы они не пересекались. ( разные xcl файлы)
Так можно объеденить бутлоадер с основоной программой.
Но вот с разными программами сложнее - как быть с прерываниями?
Можно конечно орабатывать все прерывания в мониторе - и монитор передаст управление активной программе...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 3 2007, 15:35
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(tag @ Aug 3 2007, 10:51) *
...вопрос, а пользователь будет задавать выпополняемую программу при каждом запуске устройства?


идея была такая - при включении всегда запускается основная программа, а дальше пользователь может войти в меню и выбрать другую программу. При этом будет выставлен байт в епроме. А при после перезагрузки МК и загрузки этой выбранной программы байт будет сброшен - и при следующей перезагрузке загрузится основная программа.
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 3 2007, 20:01
Сообщение #5


Профессионал
*****

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



Цитата(Непомнящий Евгений @ Aug 3 2007, 19:35) *
идея была такая - при включении всегда запускается основная программа, а дальше пользователь может войти в меню и выбрать другую программу. При этом будет выставлен байт в епроме. А при после перезагрузки МК и загрузки этой выбранной программы байт будет сброшен - и при следующей перезагрузке загрузится основная программа.

А смысл записывать eeprom и перегружать проц ради 1 раза?
Не проще ли всегда стартовать основную программу, а потом на выбраную пользователем просто делать jump.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 4 2007, 05:30
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(Непомнящий Евгений @ Aug 3 2007, 12:47) *
ИАР 4.30 + Atmega128

У меня есть устройство которое выполняет несколько несвязанных между собой функций. Хотелось бы разместить эту функциональность в разных программах. При включении устройства запускается основная программа, пользователь может войти в меню и выбрать там другую программу. При этом устройство перезагрузится и она начнет выполняться.

Как это можно реализовать?

Я представляю примерно так: при загрузке устройства запускается программа-загрузчик, которая в зависимости от какого-то байта в епроме дальше передает управление по разным адресам. Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы?

ИМХО такое решение от лукавого... А если найдется баг в одной из прошрамм или ей придется добавить функциональность? Переделаете программу и изменится размер прошивки, придется снова все соединять в кучу, следя чтобы прошивки не перекрывались в адресном пространстве... Как уже сказали вектора прерывания разделить будет проблематично, да и на до ли это? Может быть написать одну программу, а режим работы выбирать из стартового меню. Почему невозможен данный вариант?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 4 2007, 07:52
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(haker_fox @ Aug 4 2007, 09:30) *
Может быть написать одну программу, а режим работы выбирать из стартового меню. Почему невозможен данный вариант?

Да собственно примерно так оно счас и реализовано. Устройство запускается в основном режиме, а при выборе соответствующего пункта меню переходит в дополнительные. При этом основная программа "паркует" свуои данные и фактически прекращает работу.
Но меня смущает то, что при этом переходе надо отрубить/перенастроить все прерывания - если что-то забыть - то управление пойдет в основную программу, что плохо. Кроме того, в оперативке по прежнему висят все глобальные объекты, хотя текущей "программе" они не нужны. Если такой дополнительной программе нудны прерывания, то в обработчике прерывания надо проверять некий флаг и передавать управление либо "основной" либо одной из дополнительных программ.

Я думал, как от всего этого избавиться - возникла мысль о собственном "загрузчике", как в настольной ОС. Но судя по вашим ответам, это создаст массу новых проблем, так что наверное оставлю все как счас.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 4 2007, 10:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



ИМХО для такой организации лучше подходит выполнение программы из ОЗУ (внешнего видимо). В ОЗУ проще загружать требуемую программу/модуль и передавать ему управление (оверлеем вроде называется), чем каждый раз компоновать разные программы во Flash (заморачиваясь каждый раз с векторами прерываний) или перегружать Flash разными прошивками (ресурс Flash не безграничен).
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 4 2007, 16:44
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(rezident @ Aug 4 2007, 13:31) *
ИМХО для такой организации лучше подходит выполнение программы из ОЗУ (внешнего видимо). В ОЗУ проще загружать требуемую программу/модуль и передавать ему управление (оверлеем вроде называется), чем каждый раз компоновать разные программы во Flash (заморачиваясь каждый раз с векторами прерываний) или перегружать Flash разными прошивками (ресурс Flash не безграничен).

AVR выполняет программу только из внутренней flash.
Тем не менее, это можно реализовать если программа на Forth или другом подобном языке.
Go to the top of the page
 
+Quote Post
Серёга_1
сообщение Aug 8 2007, 12:06
Сообщение #10


Участник
*

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



Извиняюсь если что не так понял.
Мне кажется исполниемые модули можно загружать разные без проблем, можно использовать указатели на функции. Создать, например, константную структуру из указателей, проинициализированных соответствующими фукциями. Выбираем нужную структуру(тип структуры для всех задач один) , инициализируем переферию заново и новый цикл с новой исполнительной части загружается. С прерываниями можно также поступить, если не сильно критичен вызов функции в прерывании, или в зависимости от специфики использования прерываний одного типа, обработчик может быть общий, а использование данных от функции каждая задача определяет сама.

Добавление программы/задачи - нужно компилировать весь проект(вам и так придется компилировать + дорабатывать прошивку) .
При работе процессор перегружать не нужно.
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Aug 8 2007, 12:52
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Цитата
Но меня смущает то, что при этом переходе надо отрубить/перенастроить все прерывания - если что-то забыть - то управление пойдет в основную программу, что плохо.

Перенастроить прерывания не так уж и сложно. Для каждой вашей "программы" делаете доп. функции open и close к примеру. В open разрешаете все необходимые прерывания, в close их запрещаете.

Цитата
Кроме того, в оперативке по прежнему висят все глобальные объекты, хотя текущей "программе" они не нужны.

А зачем вам глобальные объекты, которые использутся только в одной функции? Сделайте их локальными.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Aug 8 2007, 13:31
Сообщение #12


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Непомнящий Евгений @ Aug 3 2007, 08:47) *
ИАР 4.30 + Atmega128

У меня есть устройство которое выполняет несколько несвязанных между собой функций. Хотелось бы разместить эту функциональность в разных программах. При включении устройства запускается основная программа, пользователь может войти в меню и выбрать там другую программу. При этом устройство перезагрузится и она начнет выполняться.

Как это можно реализовать?

Я представляю примерно так: при загрузке устройства запускается программа-загрузчик, которая в зависимости от какого-то байта в епроме дальше передает управление по разным адресам. Т.е. я могу сделать в иаре несколько проектов с разными стартовыми адресами, а потом руками "склеить" hex-файлы?


Наипростейший вариант реализации (на мой взгляд).
1. Или из EEPROM или чтение входных портов конфигурации.
2. Инициализация в зависимости от п.1 (switch).
3. В фоне и во всех прерывания тоже switch.
Единственный не очень ясный момент - переход в другой режим. Вероятно, после этого надо начинать от печки сразу.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 9 2007, 07:32
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 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.
Единственный не очень ясный момент - переход в другой режим. Вероятно, после этого надо начинать от печки сразу.


Да собственно так оно счас и сделано. Просто меня "посетила" мысль - реализовать для каждой независимой задачки отдельную "программу" - отдельно компилируемую, отлаживаемую и т.д. + некий загрузчик, который при старте передает управление. Но судя по всему, геморрой который при этом появляется того не стоит.
Так что тема наверное закрыта. Спасибо всем за посты.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Aug 9 2007, 09:54
Сообщение #14


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Непомнящий Евгений @ Aug 9 2007, 11:32) *
А кто говорит, что они только в одной функции? Устройство имеет основную задачу, на которую нацелены все его перерывания, память и т.д. Кроме того, его можно переключить в другую задачу (обычно сравнительно маленькую - типа преобразования интерфейсов или загрузки\выгрузки инфы). При этом основная задача прекращает исполняться.
Да собственно так оно счас и сделано. Просто меня "посетила" мысль - реализовать для каждой независимой задачки отдельную "программу" - отдельно компилируемую, отлаживаемую и т.д. + некий загрузчик, который при старте передает управление. Но судя по всему, геморрой который при этом появляется того не стоит.
Так что тема наверное закрыта. Спасибо всем за посты.

Еще вариант, если не возражаете.
Сделать типа Setup (как в PC), в который попадаем при какой- то комбинации.

Сообщение отредактировал alexander55 - Aug 9 2007, 10:37
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Aug 9 2007, 10:16
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Цитата
А кто говорит, что они только в одной функции?

Цитата
Кроме того, в оперативке по прежнему висят все глобальные объекты, хотя текущей "программе" они не нужны.

Я имел в виду, что на каждую из ваших "программ" будет заведено по одной функции.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Aug 9 2007, 17:07
Сообщение #16


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Не знаю зачем такое нужно ? да и еще на меге smile.gif, вы ведь на этом ничего не выиграете.
Лучший вариант:


Код
//типы функций прерывания
typedef  void(*irq_func_type)(void)

irq_func_type irq_function;

void irq_isr(void)  //глобальный обработчик
  {
   if (irq_function!=NULL) irq_function();
  }


void programm1_isr() //обработчик прерывания для 1 программы
  {

   }

void programm2_isr() //обработчик прерывания для 2 программы
  {

   }



void main(void)
  {
    //***************************
    //Здесь определяется какая программа должна выполнятся
    //***************************
    //назначем прерывания
    if (prigramm == 0) irq_function =   programm1_isr;
    else                       irq_function =   programm2_isr;
    while(1)
     {
           if (prigramm == 0)
             {
               //выполняем программу 1
             }
          else
             {
               //выполняем программу 2
             };
     }
  }
Go to the top of the page
 
+Quote Post
Redaer
сообщение Aug 15 2007, 14:38
Сообщение #17


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 12-07-06
Пользователь №: 18 762



Здравствуйте



Дабы не засорять конференцию похожими темами, задам свой вопрос здесь. Пытаюсь с помощью IAR 4.40 запрогать AT91SAM7S256. Так вот вопрос состоит в следующем: Можно ли с помощью иара залить во флешь процессора 2 разные программы переопределив в файлах at91SAM7S256_64KRAM.xlc и at91SAM7S256_NoRemap.xlc параметр -DROMSTART



В частности первую программку хочется залить по адресу 0x0 вторую же по адресу 0x2000

Я так понимаю, при запуске АРМ начинает работать с нулевого адреса. Так?

Собсно, хочется из первой программки(бутлоадер своеобразные) прыгнуть на вторую(основную)... Можно ли это сделать посредством ассемблеровской вставки asm("B 0x2000")



И ещё вопрос. При загрузке программы в АРМ посредством ИАРа какие-нть происходят действия с флеш (полностью ли она затирается или начиная с аддреса, обозначенного в xlc)?



Попробовал в бутлоадере сделать asm("B 0x2000"). Залил во флеш.

Потом в основной проге в обоих xcl изменяю -DROMSTART=0x00002000. Пытаюсь залить во флеш через дебагер. Ну и дебагер у меня подвисает, т.е. как я понимаю, прыжка не происходит на адрес 0x2000 со стороны бутлоадера.



Уж простите за сумбурное объяснение проблемы. Прошу вас, задавайте вопросы, попытаюсь раскрыть тему более полно.



Помогите советом или ссылкой на доки, пожалуйста help.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 15 2007, 16:24
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Redaer @ Aug 15 2007, 17:38) *
Можно ли с помощью иара залить во флешь процессора 2 разные программы переопределив в файлах at91SAM7S256_64KRAM.xlc и at91SAM7S256_NoRemap.xlc параметр -DROMSTART
Теоретически да, причем поскольку во флешь, то использовать второй из перечисленных файлов и не забыть, что память стирается страницами, чтобы при стирании памяти под одну программу не затереть часть другой.
Цитата(Redaer @ Aug 15 2007, 17:38) *
Я так понимаю, при запуске АРМ начинает работать с нулевого адреса. Так?

Собсно, хочется из первой программки(бутлоадер своеобразные) прыгнуть на вторую(основную)... Можно ли это сделать посредством ассемблеровской вставки asm("B 0x2000")
Да, начинает с адреса 0. Не уверен, что команда "B" в асм-вставке поймет абсолютный адрес. Можно в .xcl первой программы определить символ, скажем -DApplication=0x2000, а в самой программе сделать extern void Application(); Application();
Цитата(Redaer @ Aug 15 2007, 17:38) *
И ещё вопрос. При загрузке программы в АРМ посредством ИАРа какие-нть происходят действия с флеш (полностью ли она затирается или начиная с аддреса, обозначенного в xlc)?
Затираются только те страницы, в которые записываются данные. Т.е. если программа заняла 1К, то только этот 1К будет стерт, даже если в .xcl под программу отведено 100К.
Цитата(Redaer @ Aug 15 2007, 17:38) *
Попробовал в бутлоадере сделать asm("B 0x2000"). Залил во флеш.

Потом в основной проге в обоих xcl изменяю -DROMSTART=0x00002000.
Это лишнее. Первый .xcl нужен только для отладки в RAM.
Цитата(Redaer @ Aug 15 2007, 17:38) *
Пытаюсь залить во флеш через дебагер. Ну и дебагер у меня подвисает, т.е. как я понимаю, прыжка не происходит на адрес 0x2000 со стороны бутлоадера.
Сначала убедитесь, что асм-вставка действует именно так, как вы хотите. Пройдите это место в симуляторе и убедитесь, что переход происходит. Команда "B" подразумевает в качестве аргумента смещение относительно PC.

P.S. Надо было все же в отдельную тему писать - предыдущее обсуждение шло про AVR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Redaer
сообщение Aug 16 2007, 07:11
Сообщение #19


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 12-07-06
Пользователь №: 18 762



Большое спасибо за развернутые ответыsmile.gif

Че-то я не сообразил по поводу темы про АВР.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 08:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01549 секунд с 7
ELECTRONIX ©2004-2016