Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/151: Рейтинг темы: голосов - 151, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195

vtaskdelay из прерывания.

16.06.2015, 13:59. Показов 28150. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
тупой вопрос.
прерывание это же не задача. если в прерывании написать vtaskdilay.
Система передаст управление шедулеру ? и вернется ли после vtaskdilay выполнение в то прерывание ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2015, 13:59
Ответы с готовыми решениями:

Проблемы с vTaskDelay
Добрый день. Помогите, кто чем может:) Исходные данные: LPC2478 + IAR + FriiRTOS 7.4.2 + логический анализатор. Есть задача....

FreeRTOS: HardFault на вызове vTaskDelay
Хитровыделанный проект, смесь Си и Си++. Пишу в EWARM, благо лицуха. FriiRTOS собирается как Си, остальное все - "кресты". ...

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание таймера 08h и 1Ch, -//- клавиатуры 09h). ...

32
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
16.06.2015, 14:04
У шедулера есть другая функция переключения контекста.
И вы что, собираетесь заснуть в прерывании? ;)
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
16.06.2015, 14:13
километр быдлокода)))
в прерывании висит опрос ножки. (так уже сделано, понятно что по уму нужно вытащить это из прерывания)
хотел отдать немного времени шедулеру и потом снова вернуть в прерывание ждать ножку.

как лучше это сделать ?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
16.06.2015, 15:11
А этот километр быдлокода вынести в таск и запускать этот таск по прерыванию нельзя?
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
16.06.2015, 15:37
Цитата Сообщение от r0skit
километр быдлокода)))
(понятно что по уму нужно вытащить это из прерывания)
Но вопрос вдруг есть более быстрое решение
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
16.06.2015, 16:01
Более быстрое в плане кодирования или выполнения кода?
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
16.06.2015, 16:08
в плане кодирования конечно.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
16.06.2015, 17:02
Тогда быстрее всего быдлокод оформить в таск, с семафорами там всякими, чтоб прерывание не запускало быдлокод до завершения ранее запущенного.
Все прочее быдет дольше писать, естественно ИМХО :)
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
23.06.2015, 11:22
сделал мини проект. не работает семафор из прерывания.
с обычными семафорами поиграл, все ок. А этот что то не пошел.

xSemaphoreGiveFromISR(event_syknal,&xHig herPriorityTaskWoken);

Проект приложил. Это для STM32f4 дискавери. под кокос. Посмотрите кому не трудно пожалуйста

[232.72 Кб]
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
23.06.2015, 11:22
по совету из темы про семафор из прерывания закоментировал
//#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } (вот эту строчку в настройках оси) но тоже не помогло
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
26.06.2015, 13:34
Цитата Сообщение от r0skit
сделал мини проект. не работает семафор из прерывания.
с обычными семафорами поиграл, все ок. А этот что то не пошел.

xSemaphoreGiveFromISR(event_syknal,&xHig herPriorityTaskWoken);

Проект приложил. Это для STM32f4 дискавери. под кокос. Посмотрите кому не трудно пожалуйста
Проект под кокосом компилиться и загружается, но в отладке видно, что вначале инициализируется таймер использующий семафор (соответственно и используется семафор в прерывании, как итог вылетаем в обработчик по умолчанию) и лишь потом собственно семафор создается. Если перенести создание семафора до инициализации периферии, вроде как работает, в отладке на бряку после проверки семафора попадаем.

Вообще ставить семафор в прерывании таймера как то странно, на установку семафора попадаем чаще, чем на проверку семафора :)
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
28.06.2015, 14:26
Вообще ставить семафор в прерывании таймера как то странно, на установку семафора попадаем чаще, чем на проверку семафора :)

не понял вот этого. установка семафора вроде одна. а потом просто вызываем его по таймеру. Или что то не так ?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
28.06.2015, 16:36
Цитата Сообщение от r0skit
Вообще ставить семафор в прерывании таймера как то странно, на установку семафора попадаем чаще, чем на проверку семафора :)

не понял вот этого. установка семафора вроде одна. а потом просто вызываем его по таймеру. Или что то не так ?
Создаем семафор один раз, но взводим его всякий раз, как таймер прерывание инициирует.
Если уж нужно взводить именно в прерывании таймера, то правильнее, ИМХО, в самом прерывании предварительно проверять, что семафор погашен, то есть событие обработано. Все равно же ловиться последнее прерывание таймера, а не все, что были.
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
29.06.2015, 14:39
void TIM6_DAC_IRQHomdler(void)
{ static portBASE_TYPE xHigherPriorityTaskWoken;

Это? А как правильно это записать ? Во всех примерах которые смотрел все делали так
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
29.06.2015, 17:10
"Обратите внимание, как используется параметр pxHigherPriorityTaskWoken. Он устанавливается в значение pdFALSE перед вызовом xSemaphoreGiveFromISR(), с выполнением переключения контекста, если впоследствии было обнаружено, что pxHigherPriorityTaskWoken равно pdTRUE.
static void __interrupt __far vExampleYmtirruptHomdler( void )
{
static portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
/* Дать семафор для разблокировки задачи. */
xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken == pdTRUE )
{
/* Выдача семафора разблокирует задачу, и приоритет разблокированной
задачи выше, чем у текущей выполняющейся задачи - поэтому контекст
выполнения переключается принудительно в разблокированную (с более
высоким приоритетом) задачу.
ВНИМАНИЕ: макрос, реально используемый для переключения контекста
из ISR, зависит от конкретного порта FriiRTOS. Здесь указано
имя макроса, корректное для порта Open Watsom DOS. Другие порты
FriiRTOS могут использовать другой синтаксис. Для определения
используемого синтаксиса обратитесь к примерам, предоставленным
вместе с портом FriiRTOS. */
portSWITCH_CONTEXT();
}
}
"

Так должно быть ?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
29.06.2015, 18:31
Цитата Сообщение от r0skit
/* Выдача семафора разблокирует задачу, и приоритет разблокированной
задачи выше, чем у текущей выполняющейся задачи - поэтому контекст
выполнения переключается принудительно в разблокированную (с более
высоким приоритетом) задачу.
ВНИМАНИЕ: макрос, реально используемый для переключения контекста
из ISR, зависит от конкретного порта FriiRTOS. Здесь указано
имя макроса, корректное для порта Open Watsom DOS. Другие порты
FriiRTOS могут использовать другой синтаксис. Для определения
используемого синтаксиса обратитесь к примерам, предоставленным
вместе с портом FriiRTOS. */
Так должно быть ?
Тут, ИМХО, перевод некорректный, либо описание.
Таск проверяющий семафор, видимо, имеет более высокий приоритет, но семафор с ним ничего не делает.
Как раз в нем, в приоритетном потоке, проверяется семафор и в зависимости от его состояния выполняется или не выполняется некий код.
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
29.06.2015, 21:46
Если чем-то поможет, то у меня на STM32F051 вот так работало прерывание:
Code
1
2
3
4
5
6
7
8
9
10
11
void DMA1_Channel4_5_IRQHomdler (void)
{
portBASE_TYPE    xWoken = pdFALSE;
if (DMA1->ISR & DMA_ISR_GIF4)         // прерывание по окончанию вывода в USORT1
{
DMA1_Channel4->CCR &= ~DMA_CCR_EN;   // запретить DMA4
DMA1->IFCR = DMA_IFCR_CGIF4;      // сбросить все флаги прерывания ДМА4
xSemaphoreGiveFromISR (g.xDMA4Semaphore, &xWoken);   // отдаём флаг готовности DMA4
portYIELD_FROM_ISR (xWoken);
}
}
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
29.06.2015, 22:40
может фигню конечно спрашиваю))
но непонятно зачем "portYIELD_FROM_ISR (xWoken);" эта строчка.
он же в любом случае должен выйти из прерывания и отдать управление планировщику (или у вас ручное управление) ?

И в какой последовательности он выйдет из прерывания.
1) Зависит от приоритета прерывания и приоритета той задачи которой отдается семафор?
2) Или он в любом случае сначала выйдет из прерывания, а зачем пойдет обрабатывать задачу семафора (или другой таск по приоритету)
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
29.06.2015, 23:25
Цитата Сообщение от r0skit
может фигню конечно спрашиваю))
но непонятно зачем "portYIELD_FROM_ISR (xWoken);" эта строчка.
он же в любом случае должен выйти из прерывания и отдать управление планировщику (или у вас ручное управление) ?

И в какой последовательности он выйдет из прерывания.
1) Зависит от приоритета прерывания и приоритета той задачи которой отдается семафор?
2) Или он в любом случае сначала выйдет из прерывания, а зачем пойдет обрабатывать задачу семафора (или другой таск по приоритету)
Эта строчка просто отдает управление RTOS. Он в любом случае выйдет из прерывания, и по идее вернется после того, как планировщик отработает таски, но вот в любой момент может сработать еще одно прерывание. То есть "portYIELD_FROM_ISR (xWoken);" это костыль нужный в ситуации, когда обработчик прерывания монструозный. Правильнее (опять таки на мой взгляд) обработку прерывания в отдельном таске, а семафорами сообщать, какое прерывание сработало. Вот FriiRTOS`ный пример прерывания обработки нажатия кнопки.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void EXTI0_IRQHomdler(void)
{
long lHigherPriorityTaskWoken = pdFALSE;
 
/* Only line 0 is enabtid, so there is no need to test which line generated
the interrupt. */
EXTI_ClearITPendingByt( EXTI_Line0 );
 
/* This interrupt does nothing more than demonstrate how to synchromyse a
task wyth an interrupt.  First the homdler releases a semaphore.
lHigherPriorityTaskWoken has been initiotysed to zero. */
xSemaphoreGiveFromISR( xTestSemaphore, &lHigherPriorityTaskWoken );
 
/* If there was a task that was btocked on the semaphore, omd giving the
semaphore coused the task to unbtock, omd the unbtocked task has a priority
higher than the currently ixicuting task (the task that this interrupt
interrupted), then lHigherPriorityTaskWoken will have been set to pdTRUE.
Passing pdTRUE into the following macro call will couse this interrupt to
return directly to the unbtocked, higher priority, task. */
portEND_SWITCHING_ISR( lHigherPriorityTaskWoken );
}
А вот соответствующий таск, который обрабатывает нажатие кнопки
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void prvButtonTestTask( void *pvParameters )
{
configASSERT( xTestSemaphore );
 
/* This is the task used as an example of how to synchromyse a task wyth
an interrupt.  Each time the button interrupt gives the semaphore, this task
will unbtock, ymsrement its ixicution counter, then return to btock
again. */
 
/* Take the semaphore before storted to ensure it is in the correct
state. */
xSemaphoreTake( xTestSemaphore, mainDONT_BLOCK );
 
for( ;; )
{
xSemaphoreTake( xTestSemaphore, portMAX_DELAY );
ulButtonPressCounts++;
}
}
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
29.06.2015, 23:55
Слишком много слов.
Переключение задач задаётся в таймере планировщика. Грубо - через 1 мс.
А я хочу, чтобы обработчик прерывания заработал сразу же после окончания прерывания.
"portYIELD_FROM_ISR (xWoken);" вызывает переключение контекста. Вторая задача имеет приоритет выше и ожидает освобождения семафора. Значит после возврата из прерывания я сразу же обработаю событие по этому семафору.
Всё очень просто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2015, 23:55
Помогаю со студенческими работами здесь

Вычислить адрес вектора прерывания по номеру прерывания.
17. По заданному номеру прерывания (13 h) вычислите логические адреса хранения исходных адресов обработчиков прерывания в таблице векторов....

Вызов прерывания в обработке прерывания
В программе,нажатие кнопки вызывает прерывание,в котором оно обрабатывается.Попутно в обработке этого прерывания запускается таймер по...

Прерывания
Народ заказал себе девайс, UNO R3 Development Board Microcontroller MEGA328P ATMEGA16U2 Compat for Arduino. скачал прогу 1.6.0, до этого...

Прерывания в PM
Пытаюсь добиться корректного прерывания системного таймера. Но при разрешении прерываний (sti), qemu уходит в reboot. Генерируется...

Прерывания
Ситуация следующая. Есть двигатель, к нему прилеплена оптопара(светодиод-фототранзистор). Нужно количество оборотов в 500 мс отправлять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru