Перейти к содержанию
    

Переход на scmRTOS

Добрый день.

Есть 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но при этом важно чтобы существующие прерывания исполнялись так же как выполняются сейчас, с таким же быстродействием и были приоритетнее чем задачи LwIP.

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

Некоторое замедление исполнения обработчика прерываний будет все же ввиду того, что потребуется вставить везде требуемые ОС обертки TISRW, и по выходу из прерываний будет включаться шедулер. Но если у вас обработчики не совсем уж маленькие, то степень оверхеда будет весьма небольшая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. если я возьму любой из 3-х демо проектов (я скачал последнюю версию), оставлю 1 процесс и в for(;;) вставлю то что у меня было в while(1) программа по идее должна работать?

Ну и системный таймер переставлю на Timer0 например.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смысла в РТОС с одним процессом не особо много.

Вообще еще все прерывания нужно будет снабдить обертками TISRW как минимум и по идее должно работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понимаю что с одним процессом не много смысла, смысл только в том чтобы для начала с минимумом переделок программы, она заработала совместно с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Используйте для переключения контекста прерывание SPM. Пример есть в порте для avr-gcc.
С этим немного возникает вопрос. Программа использует часть flash памяти для конфигурации (EEPROM не хватает). И позволяет менять конфигурацию "на лету". Для этого функция записи flash находится в секции загрузчика (они там вместе прекрасно уживаются). Фкнция не использует прерывание, а только ассемблерные вставки с отключением прерываний на время записи страницы. не вызовет ли это несвоевременное переключение контекста?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фкнция не использует прерывание, а только ассемблерные вставки с отключением прерываний на время записи страницы. не вызовет ли это несвоевременное переключение контекста?

Ну если прерывание от системного таймера случится в момент, когда прерывания запрещены, конечно переключение будет позже. Но ведь известно на сколькооно опоздает, все можно будет просчитать. Зачем вам переключать контекст во время записи страницы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не вызовет ли это несвоевременное переключение контекста?
Нет, не вызовет. Там используется тот факт, что при нормальной работе флаг SPM всегда взведен. Планировщик лишь разрешает прерывание, а поскольку флаг уже взведен - обработчик будет вызван как только прерывания будут разрешены глобально. Вы своими функциями записи можете ненадолго сбрасывать флаг, но это не приводит ни к чему плохому, поскольку флаг сброшен в те моменты, когда флешь недоступна и когда прерывания ОС не могут быть вызваны - вы ведь наверняка запрещаете прерывания на время записи. А после окончания записи флаг SPIF снова выставится аппаратно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понял не получится LwIP подключить к scmRTOS, т.к. требуется создание и удаление потоков во время исполнения программы. Придется смотреть в сторону freeRTOS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно просморел код, то часть касающаяся PPP работает только под RTOS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...