блокировка межзадачного общения в RTOS - PullRequest
0 голосов
/ 27 апреля 2019

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

Моя проблема Я хочу, чтобы задание, которое отправляет сигнал вышестоящему заданию, возвращает сообщение в режиме блокировки

Вот мой вопрос

Должен ли я отправлять сообщения через почтовый ящик 1, а затем получать сообщения из почтового ящика 2 или есть лучшее решение?

Я использую "FreeRTOS", если это помогает

EDIT

Мне кажется, я очень плохо описал проблему

Я имею в виду, мне нужны 2 почтовых ящика для связи между задачей или ISR для задачи, или я могу использовать только один почтовый ящик с другой реализацией !! ??

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Для вашего отредактированного вопроса:

Вы должны использовать две очереди сообщений. Один для каждой задачи, иначе вы не сможете ждать правильно. Таким образом, для вашей блокирующей передачи сообщения код выглядит так:

Задача с высоким приоритетом:

 while(-1){ 
  xQueueReceive(high_prio_queue, &msg, portMAX_DELAY);
  [your complex code]
  xQueueSend(low_prio_queue, &return_msg, timeout);
 }

Задача с низким приоритетом:

 xQueueSend(high_prio_queue, &msg, timeout);
 //will only wait if your high priority task gets blocked before sending
 xQueueReceive(low_prio_queue, &return_msg, portMAX_DELAY);

От ISR:

 xQueueSendFromISR(high_prio_queue, &msg, &unblocked);
0 голосов
/ 27 апреля 2019

Это очень просто. Например используются очереди и freeRTOS.

Задача ожидает очереди. Находится в заблокированном состоянии

 while(1)
 {  
     xQueueReceive(queue, &object, portMAX_DELAY);
     ....

другая задача отправить данные в очередь.

  xQueueSend(queue, &object, timeout);

Когда данные получены, заданию передается управление. Затем он проверяет, есть ли что-нибудь в очереди. Если нет, он ждет в заблокированном состоянии.

...