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

 
 
> Структура программы (AVR studio)
pistoletov
сообщение Mar 1 2013, 20:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-02-12
Из: Донецк
Пользователь №: 70 323



Привет всем. Пытаюсь сделать проектик на xmega. Устройство представляет собой торговый автомат. Задача стоит периодической отправки данных
по гпрс каналу. Работа с модемом требует ожиданий ответов, очень бы не хотелось тормозить работу периферии на эти моменты. С RTOS не хочется связываться пока сложнова-то для меня и много кажется ртос для такой задачи. Я вижу решение что всю перефирию-клавиатуру, датчики итп..повесить на прерывания у xmega их хватает. Нормальное ли это решение или есть какие-о варианты на фоне основного цикла в фоне работает функция отправки данных по гпрс-модему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
SyncLair
сообщение Mar 1 2013, 20:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



ну либо вы пишите в виде автоматов -- они же с небольшой дороботкой преврашаются в сопрограммы -- собсвенно так как вы и сказали и получается

либо вариант номер 2 -- ось с двумя потоками один из которых имеет меньший приоритет


--------------------
Go to the top of the page
 
+Quote Post
pistoletov
сообщение Mar 2 2013, 19:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-02-12
Из: Донецк
Пользователь №: 70 323



Подскажите простую оську для авр студии. Что бы не сильно мудренная была
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 2 2013, 20:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(pistoletov @ Mar 2 2013, 21:56) *
Подскажите простую оську для авр студии. Что бы не сильно мудренная была

Для AVRStudio - Windows XP самое то.
Go to the top of the page
 
+Quote Post
pistoletov
сообщение Mar 3 2013, 15:26
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-02-12
Из: Донецк
Пользователь №: 70 323



Спасибо за совет предпочитаю Win 7. А пока в качестве RTOS выбор пала на FreeRtos порт под хmega вроде как имеется.
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Mar 7 2013, 09:43
Сообщение #6


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

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



Если без оси - в main организовываете петлю while(!Error), внутри вызывает функции вида gprs_handler() , sale_handler(), ну или какие там еще задачи могут быть у торгового автомата. В модуле gprs.c реализуете набор состояний через enum{}, текущее состояние храните в статической переменной. В начале gprs_handler() размещает switch (gprs_state). Если состояние соответствует ожиданию - проверяете буфферы/флаги, если состояние не изменилось - return. И так по кругу.
Мне кажется, так очень просто получается. А операционку можете пока изучать. Как получите готовый прототип - портируете код на операционку при желании.

Сообщение отредактировал Misile_Inc - Mar 7 2013, 09:45
Go to the top of the page
 
+Quote Post
pistoletov
сообщение Mar 9 2013, 20:30
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-02-12
Из: Донецк
Пользователь №: 70 323



спасибо. Классная идея. Попробую так сделать. Ртос как-то не совсем простая для освоения.и Нормального порта под хмеga не нашел. Сам портировать пока не готов-). Вот еще вариант нашел как мне показался интересный но не уверен подойдет ли мне с моими задержками в ожидании сигналов http://habrahabr.ru/post/148992/
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Mar 17 2013, 10:08
Сообщение #8


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

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



pistoletov решать Вам, но мне не очень понравилась такая архитектура в применении к простой (как Вы сказали) задаче.
Особенно не понравилось выполнение чего - либо в прерывании. Лично мне кажется, что в прерывании таймера без крайней необходимости в точной синхронизации ничего кроме установки флагов делать нельзя. Остальное все в main().
Для задач, которые нужно вызывать по времени можно завести полупрограммные таймеры. Тогда код может выглядеть как-то так:
CODE
enum
{
timer_100ms,
timer_1000ms,
number_of_timers
}
static uint16_t timer_counts[number_of_timers];
void timer_interrupt_handler ()
{
for (i = 0; i<number_of_timers)
{
if (timer_counts[i] > 0)
{
timer_counts[i] -= 1;
}
}
}
void main(void)
{
init_timer ();
while (!Error)
{
gprs_handler();
sale_handler();
if(!get_count(timer_100ms))
{
supply_control();
reinit(timer_100ms) = 0;
}
if (timer_1000ms)
{
coin_control();
reinit(timer_1000ms) = 0;
}
}

}

Естественно, объявление функций, переменных таймера следует вынести в свои модули, чтобы не превращать код в нечто нечитаемое.
От описанного мной приема я тоже не в восторге, но он сопровождаем и понимаем даже для новичков. Значительно проще и короче, чем по вашей ссылке.

Самый главный совет: начните работать над программой. Только на практике Вы сможете выработать свой стиль и понять, какая архитектура больше подходит.

Сообщение отредактировал Misile_Inc - Mar 17 2013, 10:21
Go to the top of the page
 
+Quote Post
pistoletov
сообщение Mar 22 2013, 21:36
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-02-12
Из: Донецк
Пользователь №: 70 323



Самый главный совет: начните работать над программой. Только на практике Вы сможете выработать свой стиль и понять, какая архитектура больше подходит.
Вот это действительно класс совет - многое при реальной отладке прорисовывается.
думаю что со switch оптимальный вариант и возвратом в основной цикл программы.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 14:24
Рейтинг@Mail.ru


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