virfis 0 12 марта, 2010 Опубликовано 12 марта, 2010 (изменено) · Жалоба Добрый день. Есть 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. Изменено 12 марта, 2010 пользователем virfis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 12 марта, 2010 Опубликовано 12 марта, 2010 · Жалоба Но при этом важно чтобы существующие прерывания исполнялись так же как выполняются сейчас, с таким же быстродействием и были приоритетнее чем задачи LwIP. Прерывания апприоре приоритетнее, чем любая из задач ОС. Правда приоритет тикового таймера ОС нужно проследить, чтоб был ниже всех других более важных прерываний. Некоторое замедление исполнения обработчика прерываний будет все же ввиду того, что потребуется вставить везде требуемые ОС обертки TISRW, и по выходу из прерываний будет включаться шедулер. Но если у вас обработчики не совсем уж маленькие, то степень оверхеда будет весьма небольшая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 12 марта, 2010 Опубликовано 12 марта, 2010 · Жалоба Т.е. если я возьму любой из 3-х демо проектов (я скачал последнюю версию), оставлю 1 процесс и в for(;;) вставлю то что у меня было в while(1) программа по идее должна работать? Ну и системный таймер переставлю на Timer0 например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 12 марта, 2010 Опубликовано 12 марта, 2010 · Жалоба Смысла в РТОС с одним процессом не особо много. Вообще еще все прерывания нужно будет снабдить обертками TISRW как минимум и по идее должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 12 марта, 2010 Опубликовано 12 марта, 2010 (изменено) · Жалоба Понимаю что с одним процессом не много смысла, смысл только в том чтобы для начала с минимумом переделок программы, она заработала совместно с 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, то какое значения ставить в опциях компилятора? Изменено 12 марта, 2010 пользователем virfis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 марта, 2010 Опубликовано 12 марта, 2010 · Жалоба Я так понял что они отвечают за переключение процессов. У меня задействованы абсолютно все выводы МК.Используйте для переключения контекста прерывание SPM. Пример есть в порте для avr-gcc.Если я создаю процесс process<OS::pr0, 0x300, 200> TProc1, то какое значения ставить в опциях компилятора?То, что вы ставили в опциях компилятора используется до вызова OS::Run(). Прикиньте, сколько вам там нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 12 марта, 2010 Опубликовано 12 марта, 2010 · Жалоба То, что вы ставили в опциях компилятора используется до вызова OS::Run(). Прикиньте, сколько вам там нужно.Понятно, там инициализация. Прикинуть можно. Используйте для переключения контекста прерывание SPM. Пример есть в порте для avr-gcc.С этим немного возникает вопрос. Программа использует часть flash памяти для конфигурации (EEPROM не хватает). И позволяет менять конфигурацию "на лету". Для этого функция записи flash находится в секции загрузчика (они там вместе прекрасно уживаются). Фкнция не использует прерывание, а только ассемблерные вставки с отключением прерываний на время записи страницы. не вызовет ли это несвоевременное переключение контекста? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 12 марта, 2010 Опубликовано 12 марта, 2010 · Жалоба Фкнция не использует прерывание, а только ассемблерные вставки с отключением прерываний на время записи страницы. не вызовет ли это несвоевременное переключение контекста? Ну если прерывание от системного таймера случится в момент, когда прерывания запрещены, конечно переключение будет позже. Но ведь известно на сколькооно опоздает, все можно будет просчитать. Зачем вам переключать контекст во время записи страницы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 13 марта, 2010 Опубликовано 13 марта, 2010 · Жалоба не вызовет ли это несвоевременное переключение контекста?Нет, не вызовет. Там используется тот факт, что при нормальной работе флаг SPM всегда взведен. Планировщик лишь разрешает прерывание, а поскольку флаг уже взведен - обработчик будет вызван как только прерывания будут разрешены глобально. Вы своими функциями записи можете ненадолго сбрасывать флаг, но это не приводит ни к чему плохому, поскольку флаг сброшен в те моменты, когда флешь недоступна и когда прерывания ОС не могут быть вызваны - вы ведь наверняка запрещаете прерывания на время записи. А после окончания записи флаг SPIF снова выставится аппаратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 16 марта, 2010 Опубликовано 16 марта, 2010 · Жалоба Как я понял не получится LwIP подключить к scmRTOS, т.к. требуется создание и удаление потоков во время исполнения программы. Придется смотреть в сторону freeRTOS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 16 марта, 2010 Опубликовано 16 марта, 2010 · Жалоба LwIP неплохо работает и без RТОS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 17 марта, 2010 Опубликовано 17 марта, 2010 · Жалоба Если я правильно просморел код, то часть касающаяся PPP работает только под RTOS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 17 марта, 2010 Опубликовано 17 марта, 2010 · Жалоба С осью оно конечно сподручнее, но и без нее думаю можно только напильником надо поработать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться