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

 
 
 
Reply to this topicStart new topic
> опрос флагов в РТОС, общий вопрос
Dubov
сообщение Jun 9 2014, 01:40
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Недавно задался вопросом, как лучше организовать опрос флага в ОСРВ(FreeRTOS, SYSBIOS... др.)

Поясню задачу: контроллер DMA по заполнению буфера выставляет один бит в регистре готовности данных. Прочитать этот бит должна т.н. background подпрограмма.
Вопрос: как осуществляется решение подобной задачи в ОСРВ?

Пока на ум приходит только опрос через

CODE
while(1)
{
if(flag == 1)
data_proc();
}



Есть более грамотные решения?

Сообщение отредактировал Dubov - Jun 9 2014, 02:10
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jun 9 2014, 01:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



создаете семафор с нулевым значением
подпрограмма должна попытаться захватить семафор, но раз ноль, то подпрограмма будет заблокирована
в прерывании DMA освобождаете семафор, и сразу после этого планировщик переведет вашу задачу в состояние ready

P.S. Пишите RTOS или ОСРВ, вы же не пишите Москоу


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Intel4004
сообщение Jun 9 2014, 01:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Ну, обычно этот-же бит является флагом прерывания.
Написать обработчик этого прерывания, который будет взводить семафор, а в background-подпрограмме ждать его.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jun 9 2014, 02:12
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Сколько не смотрю примеры, а от while(1) всё равно никуда не деться, хоть выставляй семафор в прерывании, хоть опрашивай флаг регистра напрямую...

Пример из SYSBIOS:

CODE
task()
{
UInt events;
while (TRUE) {
/* Wait for ANY of the ISR events to be posted *
events = Event_pend(myEvent, Event_Id_NONE,
Event_Id_00 + Event_Id_01 + Event_Id_02,
BIOS_WAIT_FOREVER);
/* Process all the events that have occurred */
if (events & Event_Id_00) {
processISR0();
}
if (events & Event_Id_01) {
processISR1();
}
if (events & Event_Id_02) {
processISR2();
}
}
}


Сообщение отредактировал Dubov - Jun 9 2014, 02:13
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jun 9 2014, 02:17
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



когда не пришло прерывание, этот task находится в Event_pend в заблокированном состоянии, и дает возможность выполнятся более низкоприоритетным задачам.

Если же тупо опрашивать бит, то процессор впустую будет молотить на одном месте


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jun 9 2014, 04:39
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
Вопрос: как осуществляется решение подобной задачи в ОСРВ?

Через семафор. Однако если лень и производительность не критична, можно тупо читать битовый флаг. А также можно читать флаги и переменные без опаски до тех пор, пока они не превышают размера регистра процессора.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jun 9 2014, 06:10
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Че его организовывать?
В CoOS:
ret = CoWaitForSingleFlag(myFlag, 10);
ждет 10 миллисекунд, например. Если 0, ждет до бесконечности.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 9 2014, 08:12
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В Keil RTX у каждой задачи могут быть до 16 событий (Event), по которым они могут выполняться. События устанавливаются в других задачах, а проверяются в планировщике.
Go to the top of the page
 
+Quote Post

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

 


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


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