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

 
 
> Переход на 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
Ответов
virfis
сообщение Mar 12 2010, 10:24
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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



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

 


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


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