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

 
 
> Переход на scmRTOS, Перевести программу без ОС для ATMega128 на scmRTOS + LwIP
virfis
сообщение Mar 12 2010, 08:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732



Добрый день.
Есть ATMega128 со внешней памятью 64К. Программа под нее использует UART0, UART1, TWI, SPI, оставшие выводы МК используются как порты ввода/вывода общего назначение. На одном из UART подключен GPRS-модем со встроенным TCP/IP стеком. Задействованы прерывания UART0, UART1, TWI, Timer1 - 1 ms, Timer3 - 1ms. Скорость работы UART 115200, TWI - 400KHz. Программа написана на IAR EWAVR и занимает около 80 Кб кода. Интересует переход на стек LwIP, так как только он имеет PPP протокол, чтобы отказаться от использования встроенных стеков модемов. ПОтому что это универсальнее, можно выбрать любой модем, и быстрее, зачастую в модемах стеки работают не очень весело, особенно в дешевых. Как я понял LwIP требуется операционка. Реально ли пересадить всю программу на scmRTOS, например в один низкоприоритетный процесс, и настроить LwIP так как ему надо? Но при этом важно чтобы существующие прерывания исполнялись так же как выполняются сейчас, с таким же быстродействием и были приоритетнее чем задачи LwIP.
Вариант смены железа не применим в принципе: достаточно большое кол-во оборудования уже установлено у заказчиков.
Если использовать LwIP, то примерно 10 Кб освободиться, потому что уберутся драйвера модемов. От LwIP требуется только TCP и UDP.

Сообщение отредактировал virfis - Mar 12 2010, 09:01
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
jorikdima
сообщение Mar 12 2010, 09:08
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(virfis @ Mar 12 2010, 11:53) *
Но при этом важно чтобы существующие прерывания исполнялись так же как выполняются сейчас, с таким же быстродействием и были приоритетнее чем задачи LwIP.

Прерывания апприоре приоритетнее, чем любая из задач ОС. Правда приоритет тикового таймера ОС нужно проследить, чтоб был ниже всех других более важных прерываний.
Некоторое замедление исполнения обработчика прерываний будет все же ввиду того, что потребуется вставить везде требуемые ОС обертки TISRW, и по выходу из прерываний будет включаться шедулер. Но если у вас обработчики не совсем уж маленькие, то степень оверхеда будет весьма небольшая.
Go to the top of the page
 
+Quote Post
virfis
сообщение Mar 12 2010, 09:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732



Т.е. если я возьму любой из 3-х демо проектов (я скачал последнюю версию), оставлю 1 процесс и в for(;;) вставлю то что у меня было в while(1) программа по идее должна работать?
Ну и системный таймер переставлю на Timer0 например.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Mar 12 2010, 09:54
Сообщение #4


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Смысла в РТОС с одним процессом не особо много.
Вообще еще все прерывания нужно будет снабдить обертками TISRW как минимум и по идее должно работать.
Go to the top of the page
 
+Quote Post
virfis
сообщение Mar 12 2010, 10:24
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732



Понимаю что с одним процессом не много смысла, смысл только в том чтобы для начала с минимумом переделок программы, она заработала совместно с LwIP. Потом уже можно распараллеливать задачи и т.п.
Прикрутил с одним процессом, прерывания не оборачивал. Таймер 1 заменил таймером 0. Работает. Но возникли вопросы, переделал main вот так:
int main()
{
// DDRB |= (1 << 4);

TCCR2 |= (1 << WGM21); // CTC mode
OCR2 = 230; //
TCCR2 |= (1 << CS22); // Timer1 run with prescaling 1
TIMSK |= (1 << OCIE2); // Timer1 OC interrupt enable

TCCR0 = 0x03; // Start System Timer
TIMSK |= (1 << TOIE0); //

ACSR |= (1 << ACBG) | (1 << ACIE); /* Ref ON, IE ON */
// DDRB |= (1 << 3); /* AIN1*/


OS::Run();
}
Какой смысл закомментированных строк? Как их можно заменить? Я так понял что они отвечают за переключение процессов. У меня задействованы абсолютно все выводы МК.
Еще вопрос, где определять размер стека? В опциях компилятора у меня стояли значения для CSTACK 0x300, RSTACK 100. Если я создаю процесс process<OS::pr0, 0x300, 200> TProc1, то какое значения ставить в опциях компилятора?

Сообщение отредактировал virfis - Mar 12 2010, 11:01
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 12 2010, 12:19
Сообщение #6


Гуру
******

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



Цитата(virfis @ Mar 12 2010, 12:24) *
Я так понял что они отвечают за переключение процессов. У меня задействованы абсолютно все выводы МК.
Используйте для переключения контекста прерывание SPM. Пример есть в порте для avr-gcc.
Цитата(virfis @ Mar 12 2010, 12:24) *
Если я создаю процесс process<OS::pr0, 0x300, 200> TProc1, то какое значения ставить в опциях компилятора?
То, что вы ставили в опциях компилятора используется до вызова OS::Run(). Прикиньте, сколько вам там нужно.


--------------------
На любой вопрос даю любой ответ
"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
virfis
сообщение Mar 12 2010, 12:55
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732



Цитата
То, что вы ставили в опциях компилятора используется до вызова OS::Run(). Прикиньте, сколько вам там нужно.
Понятно, там инициализация. Прикинуть можно.

Цитата
Используйте для переключения контекста прерывание SPM. Пример есть в порте для avr-gcc.
С этим немного возникает вопрос. Программа использует часть flash памяти для конфигурации (EEPROM не хватает). И позволяет менять конфигурацию "на лету". Для этого функция записи flash находится в секции загрузчика (они там вместе прекрасно уживаются). Фкнция не использует прерывание, а только ассемблерные вставки с отключением прерываний на время записи страницы. не вызовет ли это несвоевременное переключение контекста?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Mar 12 2010, 13:32
Сообщение #8


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(virfis @ Mar 12 2010, 15:55) *
Фкнция не использует прерывание, а только ассемблерные вставки с отключением прерываний на время записи страницы. не вызовет ли это несвоевременное переключение контекста?

Ну если прерывание от системного таймера случится в момент, когда прерывания запрещены, конечно переключение будет позже. Но ведь известно на сколькооно опоздает, все можно будет просчитать. Зачем вам переключать контекст во время записи страницы?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 13 2010, 11:10
Сообщение #9


Гуру
******

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



Цитата(virfis @ Mar 12 2010, 14:55) *
не вызовет ли это несвоевременное переключение контекста?
Нет, не вызовет. Там используется тот факт, что при нормальной работе флаг SPM всегда взведен. Планировщик лишь разрешает прерывание, а поскольку флаг уже взведен - обработчик будет вызван как только прерывания будут разрешены глобально. Вы своими функциями записи можете ненадолго сбрасывать флаг, но это не приводит ни к чему плохому, поскольку флаг сброшен в те моменты, когда флешь недоступна и когда прерывания ОС не могут быть вызваны - вы ведь наверняка запрещаете прерывания на время записи. А после окончания записи флаг SPIF снова выставится аппаратно.


--------------------
На любой вопрос даю любой ответ
"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
virfis
сообщение Mar 16 2010, 06:54
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732



Как я понял не получится LwIP подключить к scmRTOS, т.к. требуется создание и удаление потоков во время исполнения программы. Придется смотреть в сторону freeRTOS.
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 16 2010, 11:58
Сообщение #11


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



LwIP неплохо работает и без RТОS.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
virfis
сообщение Mar 17 2010, 09:06
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732



Если я правильно просморел код, то часть касающаяся PPP работает только под RTOS.
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 17 2010, 11:49
Сообщение #13


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



С осью оно конечно сподручнее, но и без нее думаю можно только напильником надо поработать.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post

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

 


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


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