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

 
 
> Несколько вопросов начинающего
MiklPolikov
сообщение Nov 16 2013, 13:09
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Помогите пожалуйста побыстрее разобраться что к чему.

Вопрос 1:
Есть задача, управляющая миганием светодиода. Мигать он может с разными частотами и разным цветом. Что бы он мигал задача всё время "крутится",
а частота мигания регулируется при помощи vTaskDelay.
Мигание светодиода должно зависеть от результатов выполнения других задач. Как правильнее всего реализовать передачу данных из нескольких разных задач в эту одну ?
Пришло в голову : сделать очередь, в которую все задачи управляющие миганием будут записывать данные по мере их появления. В задаче мигания проверять наличие в очереди непрочитанного элемента. И только если он есть читать, иначе задача заблокируется и светодиод перестанет мигать совсем.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
7 страниц V  « < 2 3 4 5 6 > »   
Start new topic
Ответов (45 - 59)
juvf
сообщение Feb 5 2014, 02:25
Сообщение #46


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



для этого существуют эвэнты. в v8.0 наконецто их добавили. задачи Б, С, Д блокируй в ожидании установки флага (эвента). Задачи Б, С, Д могут ждать одного флага, а можно для каждой задачи сделать отдельный флаг в группе флагов.

А с проверкой хэндлера..... дак это прийдется в задачах Б, С, Д с какимто периодом проверять хендлер. С таким же успехом можно завести глобальную переменную и проверять её в Б, С, Д и не заморачиваться с хендлером.
Go to the top of the page
 
+Quote Post
Timma
сообщение Feb 5 2014, 13:16
Сообщение #47


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 26-11-07
Пользователь №: 32 693



Цитата(MiklPolikov @ Feb 5 2014, 00:46) *
Вопрос по организации алгоритма :

Допустим начала работать задача А(была создана, была разблокирована), и пока она работает должны заблокироваться задачи Б, С, Д. Когда задача А завершила работу, Б С Д должны разблокироваться. Как это принято делать так, что бы было наименее путано ? Сделать очередь из одного элемента, из которой задачи Б С Д читают этот элемент без удаления, а задача А его либо удаляет либо возвращает ?
Нет ли способа проверять внутри задачи Д чему равен хэндлер задачи А, так что бы когда он не NULL задача Д блокировалась бы, а когда снова стал NULL разблокировалась бы?


Спасибо.

Может просто сделать приоритет А выше других?
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Feb 12 2014, 19:37
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Ещё вопрос:

Как я понял , для того что бы использовать флаги событий нужно добавить в FreeRTOSConfig.h следующие строки, без них не компилируется.
Из каких соображений нужно выбирать то, что я отметил //// ?

Рассуждаю так :
configTIMER_TASK_PRIORITY 0 самый верхний приоритет для того что бы всё что с этим будет связано обрабатывалось быстрее моих задач, так будет работать гарантированно однозначно.
configTIMER_QUEUE_LENGTH 1 маленькая длинна очереди т.к. приоритет всё равно самый верхний, очередь не должна переполнится

Заранее спасибо за ответ !

Цитата
#define INCLUDE_xEventGroupSetBitFromISR 1
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY 0 ////
#define configTIMER_QUEUE_LENGTH 1 ////
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE ////
#define INCLUDE_xTimerPendFunctionCallFromISR 1


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
juvf
сообщение Feb 14 2014, 02:42
Сообщение #49


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Я работал с флагами (эвентами) в др ртос. В ФрииРТОС пока не доводилось, не разбирался. С чем их есть во фри - не знаю. laughing.gif
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Feb 14 2014, 07:21
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Настроил как написал выше, и вроде бы всё хорошо.

Ещё один вопрос, мучает уже давно :
Почему в примерах в объявлениях семафоров , мьютиксов и т.п. нет директивы volatile, и почему без неё работает когда семафор выдаётся в прерывании ?
Заранее спасибо за объяснение !

Код
/*volatile*/  xSemaphoreHandle    x_RTC_Second_Change;  //разве тут не нужен volatile ?

//.....

xSemaphoreGiveFromISR(x_RTC_Second_Change,&xHigherPriorityTaskWoken);


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Feb 15 2014, 10:02
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



И ещё вопрос по флагам событий :
Я верно понимаю, что xEventGroupWaitBits работает только по факту наличия флага, сделать так чтоб работало по моменту выставления способа не предусмотрено ? Иными словами : пользователь жмёт кнопку, при этом выставляются и снимаются флаги "кнопка была нажата" "кнопка была отпущена". В задаче нужно чтоб программа проходила строку xEventGroupWaitBits после нажатия, а при следующем попадании на неё же ждала следующего отпускания + нажатия. Сбрасывать флаги нельзя, т.к. они используются в других функциях.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 15 2014, 14:19
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(MiklPolikov @ Feb 14 2014, 11:21) *
Код
/*volatile*/  xSemaphoreHandle    x_RTC_Second_Change;  //разве тут не нужен volatile ?
//.....
xSemaphoreGiveFromISR(x_RTC_Second_Change,&xHigherPriorityTaskWoken);

Не нужен volatile, потому что xSemaphoreHandle - это указатель и он в прерывании не изменяется.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 24 2014, 14:41
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Ещё один вопрос, по архитектуре кода :

Перевожу свои старые коды без ОС на FreeRTOS. К примеру есть функция, инициализирующая SD карту, в ней в каких-то циклах ожидание чего-то.
Как теперь с этим поступить наиболее правильно ?
а) Вставить в функцию команды переключения контекста. Функция будет вызываться в задаче, но выполняться будет не быстро, т.к. функция чего-то ждёт внутри себя.
С одной стороны контекст будет переключатся, т.е. система в целом работать правильно, но с другой та задача, которая функцию вызвала, будет останавливаться на этой функции на большое время, что на мой взгляд криво.
б) Сделать из функции отдельную задачу. Создавать её когда надо проинициализировать карту, когда инициализация прошла удалять, а о том что инициализация прошла узнавать через эвенты или симафоры.

Заранее спасибо.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
DASM
сообщение Apr 24 2014, 16:08
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Б
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 24 2014, 18:54
Сообщение #55


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(MiklPolikov @ Apr 24 2014, 18:41) *
...есть функция, инициализирующая SD карту...


в) всю работу с карточкой убрать в нитку. обслуживать запросы можно и синхронно и асинхронно - в зависимости от дальнейшей надобности.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 24 2014, 19:25
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(kolobok0 @ Apr 24 2014, 22:54) *
в) всю работу с карточкой убрать в нитку. обслуживать запросы можно и синхронно и асинхронно - в зависимости от дальнейшей надобности.


Объясните пожалуйста на пальцах, что значит "убрать в нитку" и "обслуживать запросы синхронно и асинхронно" ?
Это всё значит сделать один линейный код в одной задаче ? Но тогда непонятно во-первых как переходить в разные места этого кода так что бы не было путаного синтаксиса, а во-вторых придётся в одном коде смешивать и хардварную часть, и высокоуровневую аппаратно-независимую, а зачем это надо ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 25 2014, 18:08
Сообщение #57


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(MiklPolikov @ Apr 24 2014, 23:25) *
Объясните пожалуйста на пальцах, что значит "убрать в нитку" и "обслуживать запросы синхронно и асинхронно" ?
..один линейный код в одной задаче ?...


если юзаете ось, то во фриртосе есть понятие поток. вам ничего не мешает отдельно поток завести на ваши медленно играющие проблемы.
асинхронно (по отношению к этому потоку) вы сможете вызывать необходимые вам функции (рядом с потоком лежащие и реализующие
синхонизацию).
Вам никто не мешает порождать, посылать запрос, ждать, по возврату управления удалять объект синхронизации. это есть
синхронное обращение. как пример см. стэки изернет, синхроные натификэшены во всяких форточках и иже...

вам никто не мешает, завести объект синхронизации в вызывающем коде, передать его на вызове и продолжать работу
периодически проверяя обратный натификэшен. как пример реализации см. те же форточки раздел асинхронный доступ
к файлам, портам и т.д., либо в других осях - типа новела, льюникса, юникса и т.д...

про линейный код нифига не понял.
как пример разжовывания на пальцах(да и пользительно под форточками) - почитайте толковую книгу
"WINDOWS для профессионалов" автор Джеффри Рихтер

там есть и асинхронный пласт и синхронный...возможно не по теме но как консерватория - вполне...
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 26 2014, 04:18
Сообщение #58


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(kolobok0 @ Apr 25 2014, 00:54) *
в) всю работу с карточкой убрать в нитку. обслуживать запросы можно и синхронно и асинхронно - в зависимости от дальнейшей надобности.

на сколько я понял вопрос в другом. Какая разница что в какой нитке? Допустим есть отдельняя нитка в которой ведется работа с SD Картой. есть функция, инициализирующая SD карту, в ней в каких-то циклах ожидание чего-то.
Как теперь с этим поступить наиболее правильно?
Когда идет инициализация, то процессор простаивает. как правильно организовать работу, чтобы во время ожиданий процессор не простаивал?

если сделать так
while(waitForSdCard);

то процессор будет стоять в этом месте (ну если конечно более приоритетные задачи не прервыт эту задачу).

самое простое сделать ожидание через vTaskDelay();

Код
for(int i = 0; i<100; i++)
{
   if(waitForSdCard)
   {
   //дождались... дальше пишем код
   }
   vTaskDelay(10);
}
//сюда попадем, если недождались. исключение


Если то событие, которое ожидаем, может сегенрировать прерыванеи, то можно сделать двоичный симафор (или эвэнт). из прерывания выдавать симафор. тогда

Цитата
if(xSemaphoreTake(smSdCardReady, 1000) == pdPASS)//ждём симафор
{ //дождались... дальше пишем код

}
else
{
//сюда попадем, если недождались. исключение
}


Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 29 2014, 10:22
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Ещё один вопрос:

Требуется экономить потребляемый ток.
Раньше, без ОС, в тех местах кода, где надо чего-то ждать,я использовал какой-то из спящих режимов, а дождавшись вновь увеличивал частоту.
Сейчас всё ожидание, очевидно, будет в задаче Idle. В ней я могу снизить тактовую частоту. А вот как её обратно повысить ? Я ведь не знаю ни когда это потребуется, ни где программа окажется когда выйдет из IDLE . Как быть ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 29 2014, 20:36
Сообщение #60


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(juvf @ Apr 26 2014, 08:18) *
...Когда идет инициализация, то процессор простаивает. как правильно организовать работу...


Вы вот прочитали но не поняли скорее всего, что я написал выше.
Окейно. по другому..
откуда это у Вас?

"Когда идет инициализация, то процессор простаивает"

я бы сказал заблуждение... Или логику так построили? Ну а кто мешает по другому, религия если только???

вот у меня паралельно идёт инициализация(читай подъём или инициализация) железа...uSD, Ehernet, ADC, стэки, оси, MODBAUS,
запуск ниток, изернет клиенты-сервера, wifi (и прочий звериниц), всё это делается параллельно
(ну есть конечно же последовательные действия), но они не создают узких мест для общей картины а больше, как это лучше
сказать - по общей готовности все подождут самого отстающего...
ну и принимается решения для подключения или отключения функционала блоков или логики...
Go to the top of the page
 
+Quote Post

7 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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