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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как из обработчика прерывания(вынесен в отдельный файл) вызвать xTaskResumeFromISR
Neo_Matrix
сообщение Feb 25 2016, 15:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Такая проблема:
Есть файл main.c в нем имеется задача РТОС, которая объявлена как void vDeleteSTR(void const * argument); сама функция такая
Код
void vDeleteUart(void const * argument)
{
//Здесь удаляем строку
vTaskSuspend(NULL); // Здесь засыпаем, пока прерывание не разбудит...
}

Сам обработчик прерывания вынесен в отдельный файл допустим irq.c
Код
void USART3_IRQHandler(void)
{
xTaskResumeFromISR(vDeleteUart);// Пробовал писать так
}

Но чего и следовало ожидать, vDeleteUart не объявлена в irq.c, соответственно при компиляции ошибка. Как правильно сделать?
extern void vDeleteSTR(void const * argument); - пробовал - не работает.
Спасибо всем.
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 25 2016, 17:39
Сообщение #2


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



void vDeleteUart(void const * argument);
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 25 2016, 19:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Neo_Matrix @ Feb 25 2016, 17:58) *
Такая проблема:

Как бы помягче.... Вы хоть в документацию одним глазом загляните ЧТО нужно указывать xTaskResumeFromISR(). И это СОВЕРШЕННО не адрес функции, а Handle.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Feb 25 2016, 20:50
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



В первом сообщении закралась ошибка, vDeleteUart необходимо заменить на vDeleteSTR. Немного промахнулся с копи-пастом.
zltigo
Хорошо, как тогда его использовать? С "мейна" все работает хорошо, как хэндл использовать в "библиотечном" файле?
Просто написать в начале irq.c
Код
BaseType_t vDeleteSTR;
или
TaskHandle_t vDeleteSTR;
Както так?

Сообщение отредактировал Neo_Matrix - Feb 25 2016, 20:54
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 25 2016, 20:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Neo_Matrix @ Feb 25 2016, 22:50) *
как хэндл использовать в "библиотечном" файле?

Как и любую переменую. Что за проблема?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Feb 25 2016, 21:44
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Хорошо допустим есть main.c c с содержимым:
Код
#include "irq.h"
void vDeleteSTR(void const * argument);

int main(void)
osThreadDef(DeleteSTR, vDeleteSTR, osPriorityIdle, 0, 1024);
DeleteSTRHandle = osThreadCreate(osThread(DeleteSTR), NULL);
osKernelStart();
while(1){}

void vDeleteSTR(void const * argument)
{
//Здесь удаляем строку
vTaskSuspend(NULL); // Здесь засыпаем, пока прерывание не разбудит...
}


Есть файл irq.c c содержимым:

Код
void USART3_IRQHandler(void)
{
xTaskResumeFromISR(vDeleteSTR);// Пробовал писать так
}


Как правильно разбудить задачу vDeleteSTR с прерывания, обработчик которого вынесен в отдельный .с файл ?
Если можно примером кода.

Сообщение отредактировал Neo_Matrix - Feb 25 2016, 21:46
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 25 2016, 21:52
Сообщение #7


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



И описание и пример кода
http://www.freertos.org/taskresumefromisr.html
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Feb 25 2016, 22:19
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



x893
Спасибо, но если бы все было в одном main.c все сработало бы.Я не могу понять как в данном случае объявить ХЭНДЛ в стороннем файле, если extern применить не ясно как(для меня). В моем случае получается multiply defined vDeleteSTR.

Сообщение отредактировал Neo_Matrix - Feb 25 2016, 22:19
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 25 2016, 23:01
Сообщение #9


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



В другом файле написать

extern TaskHandle_t xHandle;
Код
void vAnExampleISR( void )
{
BaseType_t xYieldRequired;

     // Resume the suspended task.
     xYieldRequired = xTaskResumeFromISR( xHandle );

     if( xYieldRequired == pdTRUE )
     {
         // We should switch context so the ISR returns to a different task.
         // NOTE:  How this is done depends on the port you are using.  Check
         // the documentation and examples for your port.
         portYIELD_FROM_ISR();
     }
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 26 2016, 05:51
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Neo_Matrix @ Feb 26 2016, 00:19) *
Спасибо, но если бы все было в одном main.c все сработало бы.

Разумется нет. Совсем нет. Сам вызов принципиально неправилен и не рабоспособен. Документация!


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Feb 26 2016, 07:25
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(zltigo @ Feb 26 2016, 08:51) *
Разумется нет. Совсем нет. Сам вызов принципиально неправилен и не рабоспособен. Документация!

Угу. И нехотение читать что там за "ошибка при компиляции". А многие еще и варнинги отключают и не понимают что с ними вообще делать, типа "скомпилировалось- значит в исходнике все нормально"
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Feb 26 2016, 08:18
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Цитата
В другом файле написатьextern TaskHandle_t xHandle;

Все теперь понял. Это и был основной вопрос, спасибо!

Относительно гневных комментариев: Сам вызов буду осуществлять через cmsis_os, Весь код приведен только как пример(кстати если его записать только в мейне, то все будет работать(возможно не долго)).
Между прочим код компилится без варнингов и без ошибок, если все сгрузить в мейн.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 26 2016, 08:38
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Neo_Matrix @ Feb 26 2016, 14:18) *
Относительно гневных комментариев: Сам вызов буду осуществлять через cmsis_os, Весь код приведен только как пример(кстати если его записать только в мейне, то все будет работать(возможно не долго)).
Между прочим код компилится без варнингов и без ошибок, если все сгрузить в мейн.

Чтобы сообщить задаче ОС о некоем событии в ISR, используются средства синхронизации ОС. Как то: мэйлбоксы, семафоры, мьютексы и т.п. Читайте описание на свою ОС.
Например: задача ждёт в функции ожидания мэйлбокса -> ISR отправляет сообщение в сей мэйлбокс -> задача просыпается, выполняет работу, опять выходит на функцию ожидания мэйлбокса. И так в цикле.
Так стандартно строятся все задачи - обработчики неких событий от периферии (от ISR).
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Feb 26 2016, 08:55
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Цитата(jcxz @ Feb 26 2016, 10:38) *
Чтобы сообщить задаче ОС о некоем событии в ISR, используются средства синхронизации ОС. Как то: мэйлбоксы, семафоры, мьютексы и т.п. Читайте описание на свою ОС.
Например: задача ждёт в функции ожидания мэйлбокса -> ISR отправляет сообщение в сей мэйлбокс -> задача просыпается, выполняет работу, опять выходит на функцию ожидания мэйлбокса. И так в цикле.
Так стандартно строятся все задачи - обработчики неких событий от периферии (от ISR).

Не понял к чему это сказано, вопрос был несколько иным...
Какое отличие между тем, что задача ожидает очередь или семафор от применения засыпания в конце задачи и дальнейшим пробуждением из прерывания. То что очередь может передать данные - не в счет.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 26 2016, 09:04
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Neo_Matrix @ Feb 26 2016, 14:55) *
Не понял к чему это сказано, вопрос был несколько иным...
Какое отличие между тем, что задача ожидает очередь или семафор от применения засыпания в конце задачи и дальнейшим пробуждением из прерывания. То что очередь может передать данные - не в счет.

Вопрос вроде был "Как правильно разбудить задачу vDeleteSTR с прерывания" если я не ошибаюсь.
Обычно простое засыпание (без привязки к средствам синхронизации ОС) задачи ОС - это засыпание на N тактов сис.таймера. Задача конечно проснётся и обнаружит событие, но не сразу после его его возникновения, как если бы ждала мэйлбокса. Данные не обязательно передавать через мэйлбокс - достаточно факта вызова функции MailboxPost() в ISR.
Go to the top of the page
 
+Quote Post

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

 


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


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