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

 
 
> xSemaphoreTake() первый раз не получать, Первый вызов на свежем семафоре всегда pdTRUE
Cosmojam
сообщение Feb 10 2012, 13:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Собственно вопрос. Создал семафор при вызове задачи, вошёл в цикл и должен упереться в него пока семафор не будет отдан из прерывания или ещё откуда. Но первый вызов xSemaphoreTake() всегда pdTRUE независимо от того был он дан или нет. Есть ли правильный способ бороться с этим кроме "холостого" взятия семафора сразу после создания до входа в цикл или установкой флагов "первый раз" ?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 8 2014, 05:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Так создайте семафор приведенным выше макросом. Не будет лишнего Give-Take.
Go to the top of the page
 
+Quote Post
Dele
сообщение Apr 8 2014, 10:39
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898



Цитата(aaarrr @ Apr 8 2014, 09:32) *
Так создайте семафор приведенным выше макросом. Не будет лишнего Give-Take.

Немного не понял, как создать таким образом семафор. В queue.h нету такого определения, Coocox выдает:
C:\CooCox\CoIDE\workspace\ledexitl/main.c:148: undefined reference to `SemaphoreCreateBinaryDisabled'
вы меня простите я учусь, ткните меня как это сделать пожалуйста)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 8 2014, 11:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Dele @ Apr 8 2014, 14:39) *
Немного не понял, как создать таким образом семафор. В queue.h нету такого определения

Совершенно верно, его там нет. Поэтому добавьте упомянутый #define в любом удобном месте:
Код
#define    xSemaphoreCreateBinaryDisabled()    xQueueCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH )

xSemaphoreHandle S;

int main(void)
{
    S = xSemaphoreCreateBinaryDisabled();
}

Лучше, конечно, в какой-нибудь заголовочный файл.

Сообщение отредактировал aaarrr - Apr 8 2014, 16:37
Go to the top of the page
 
+Quote Post
Dele
сообщение Apr 8 2014, 16:10
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898



Цитата(aaarrr @ Apr 8 2014, 15:16) *
Совершенно верно, его там нет. Поэтому добавьте упомянутый #define в любом удобном месте:
Код
#define    xSemaphoreCreateBinaryDisabled()    xQueueCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH )

xSemaphoreHandle S;

int main(void)
{
    xSemaphoreCreateBinaryDisabled(S)
}

Лучше, конечно, в какой-нибудь заголовочный файл.


Добавил строчку в queue.h
в итоге:
[cc] C:\CooCox\CoIDE\workspace\ledexitl\main.c:148:37: error: macro "xSemaphoreCreateBinaryDisabled" passed 1 arguments, but takes just 0
[cc] xSemaphoreCreateBinaryDisabled(xBS1);
[cc] ^
[cc] C:\CooCox\CoIDE\workspace\ledexitl\main.c:148:2: error: 'xSemaphoreCreateBinaryDisabled' undeclared (first use in this function)
Как то так...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Cosmojam   xSemaphoreTake() первый раз не получать   Feb 10 2012, 13:25
- - aaarrr   Цитата(Cosmojam @ Feb 10 2012, 17:25) Ест...   Feb 10 2012, 13:47
- - Cosmojam   И что он будет делать? Захватывать свежесозданный ...   Feb 10 2012, 17:36
|- - aaarrr   Цитата(Cosmojam @ Feb 10 2012, 21:36) И ч...   Feb 10 2012, 17:45
- - Cosmojam   Всё, теперь понял, ларчик просто открывался Спаси...   Feb 10 2012, 18:49
- - Bass   или просто сразу взять семафор после его создания   Feb 11 2012, 05:15
- - aaarrr   И получите в коде холостую последовательность xSem...   Feb 11 2012, 11:24
|- - Dele   Цитата(aaarrr @ Feb 11 2012, 15:24) И пол...   Apr 7 2014, 20:06
|- - Сергей Борщ   Цитата(Dele @ Apr 7 2014, 22:06) Я ничего...   Apr 8 2014, 02:44
|- - Dele   Цитата(Сергей Борщ @ Apr 8 2014, 06:44) 1...   Apr 8 2014, 04:40
- - aaarrr   Пардон, должно быть: КодS = xSemaphoreCreateBinary...   Apr 8 2014, 16:37
- - Dele   Цитата(aaarrr @ Apr 8 2014, 20:37) Пардон...   Apr 9 2014, 02:30
- - LightElf   QUOTE (Dele @ Apr 9 2014, 06:30) Но все р...   Apr 9 2014, 03:43


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

 


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


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