|
Прикручиваю ось к LPC2478, Есть и будут вопросы) |
|
|
|
Aug 21 2012, 06:22
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Добрый день, коллеги!
Скачал последнюю версию порта для LPC2xxx. К сожалению, на LPC2478 код не запускается, пришлось маленько пофиксить инициализацию периферии, немного ассемблера в одном из файлов ОСи. Вроде дело пошло. Задачи запускаются. Я не уверен в надежности и стабильности, пока тестирую.
Пока первый вопрос.
Как я понял, планировщик может вызываться из прерывания системного таймера и по софтовому прерыванию. Это задается опцией scmRTOS_CONTEXT_SWITCH_SCHEME. Мне кажется, что для LPC2478 софтовое прерывание не нужно. Достаточно таймерного. Я правильно понимаю? Т.е. можно использовать scmRTOS_CONTEXT_SWITCH_SCHEME = 0?
Гм... скажем так, я, прочитав документацию, так и не понял, чем отличаются два метода вызова планировщика, и какой когда использовать?
Спасибо!
--------------------
Выбор.
|
|
|
|
|
Aug 21 2012, 08:02
|

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

|
QUOTE (haker_fox @ Aug 21 2012, 09:22)  Как я понял, планировщик может вызываться из прерывания системного таймера и по софтовому прерыванию. Это задается опцией scmRTOS_CONTEXT_SWITCH_SCHEME. Неправильно поняли  . Планировщик вызывается там, где возникла необходимость передать управление другой задаче. Это может быть и в основном коде потока, и в прерывании периферии и в прерывании системного таймера. А вот методов вызова перепланировки предусмотрено два: scmRTOS_CONTEXT_SWITCH_SCHEME = 0 - простой вызов функции, которая будет складывать на стек все регистры, даже если она вызвана на выходе из прерывания и часть регистров уже сохранены обработчиком, и scmRTOS_CONTEXT_SWITCH_SCHEME = 1 - для переключения контекста вызывается отдельное прерывание, обработчик которого написан на асме и это гарантирует, что ни один регистр не будет сохранен дважды. Второй вариант, как видно, менее требователен к стеку. Другое его преимущество - если приоритет этого прерывания сделать самым низким, то при возникновении нескольких прерываний переключение контекста будет выполнено один раз после выхода из последнего обработчика, а не на выходе из каждого. Поэтому такой метод и рекомендуется использовать. "Нулевой" метод используется лишь там, где нет возможности использовать "первый" - например, в ADuC702x, где нет контроллера прерываний и невозможно сгенерить прерывание программно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 21 2012, 15:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(haker_fox @ Aug 21 2012, 18:19)  Да, привязаны к аппаратным часам. Но "когда-то" они должны вызывать некую функцию в отдельно потоке. А аппаратный таймер - это что физически? Цитата(haker_fox @ Aug 21 2012, 18:19)  Следовательно поллинг здесь мало подходит Смотря как часто опрашивать. Я не думаю что ваша задача управления автоматикой выглядит так: в 9:00 выставить в порт заданный уровень, время реакции - 3 мкс.
|
|
|
|
|
Aug 21 2012, 16:05
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (_Артём_ @ Aug 22 2012, 00:35)  А аппаратный таймер - это что физически? В LPC2478 есть RTC. QUOTE (_Артём_ @ Aug 22 2012, 00:35)  мотря как часто опрашивать. Я не думаю что ваша задача управления автоматикой выглядит так: в 9:00 выставить в порт заданный уровень, время реакции - 3 мкс. Да, пока поллингом и делаю. На другой платформе. Опрашиваю раз в 0.5 сек. А может быть действительно - лишнее это (виртуальные таймеры). Буду думать. Но вот динамическое создание/удаление процессов было бы полезно: сработал таймер, запустили процесс, выдали в сеть команду, удалили процесс. Поскольку этот процесс может занимать иногда ощутимое конечное время (сеть одна, устройств много, много кто хочет с ними пообщаться, приходится ждать), то чтобы не задерживать работу системы, он бы мог работать отдельно. Хотя здесь может помочь буферизация в очереди. В общем будем думать. Просто лапки чешутся что-нить "поковырять". Впрочем, это уже для другой темы разговор.
--------------------
Выбор.
|
|
|
|
|
Aug 21 2012, 16:15
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(haker_fox @ Aug 21 2012, 19:05)  В LPC2478 есть RTC. И что можно разрешить прерывание в заданное время (часы-минуты-дата)? Цитата(haker_fox @ Aug 21 2012, 19:05)  Но вот динамическое создание/удаление процессов было бы полезно: сработал таймер, запустили процесс, выдали в сеть команду, удалили процесс. Видимо динамическое создание/удаление процессов вызовет падение скоростных характеристик Оси. Но если таких процессов немного (которые создавать-удалять хотите), то что мешает их сделать обычными процессами с низким приоритетом, ожидающими своего события и начинающими работать, например от сигнала пришедшего от RTC_Handler?
|
|
|
|
|
Aug 22 2012, 04:52
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (_Артём_ @ Aug 22 2012, 01:15)  И что можно разрешить прерывание в заданное время (часы-минуты-дата)? Да, на одну дату можно. Но мне нужно больльше. Например 32 таймера. Кажется, что поллингом проще будет. QUOTE (_Артём_ @ Aug 22 2012, 01:15)  Видимо динамическое создание/удаление процессов вызовет падение скоростных характеристик Оси. Но если таких процессов немного (которые создавать-удалять хотите), то что мешает их сделать обычными процессами с низким приоритетом, ожидающими своего события и начинающими работать, например от сигнала пришедшего от RTC_Handler? Да, можно и так! Спасибо, хорошее обсуждение получилось, мои мысли упорядочились)
--------------------
Выбор.
|
|
|
|
|
Aug 22 2012, 05:21
|

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

|
QUOTE (haker_fox @ Aug 22 2012, 07:52)  Да, на одну дату можно. Но мне нужно больльше. Например 32 таймера. Кажется, что поллингом проще будет. Почему бы не создать сортированный список времен срабатывания таймеров, как сделано в FreeRTOS? Срабатывает будильник, отсылает сообщение, берет из списка следующее время, программирует его в будильник RTC и т.д.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 26 2012, 06:53
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Ну вот и следующий вопрос. Хочу сделать оговорку, он, конечно, мало относится к этой оси, но все же.
Хочу прикрутить TCP/IP стек. В настоящее время мое внимание сосредоточено на lwIP и TCP/IP стек от Юрия Темкина (www.tnkernel.com).
Не могу определится с окончательным выборомом. Что от стека нужно: 1. ICMP. 2. TCP. 3. UDP. 4. DHCP.
На базе стека планируется использовать web server (возможно понадобится ftp server, telnet server).
Сосбственно сам вопрос: что лучше - взять и прикрутить lwIP, либо TCP/IP tnkernel? С одной стороны есть примеры интеграции обоих стеков в оси (для первого это FreeRTOS, для второго - сама TNkernel). Но все же. Что, согласно идеологии scmRTOS, для нее больше подойдет в качестве сетевого стека?
Спасибо!
--------------------
Выбор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|