Перейти к содержанию
    

прерывания с CMSIS-RTOS

Добрый день.

 

У меня произошла неудачная попытка подружиться с CMSIS-RTOS.

 

Что было сделано:

Запустил Cube, указал использование cmsis-rtos v1, сделал инициализацию пинов и одного таймера. В программе 2 треда и один семафор.

Проверил корректность переключения между задачами — работает. Запустил таймер и прерывание таймера, указав приоритет — работает.

/* USER CODE BEGIN TIM3_Init 2 */

HAL_NVIC_SetPriority(TIM3_IRQn, (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1), 0);

HAL_TIM_Base_Start_IT(&htim3);

/* USER CODE END TIM3_Init 2 */

В таймере лампочки моргают.

Но как только в обработчике прерывания появляется строчка //osSemaphoreRelease(myBinarySemHandle), (согласно документации эта функция имеет право вызываться из прерывания) все намертво встает. Вроде делаю все правильно. В чем может быть причина?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, zemlemer said:

В чем может быть причина?

А какая оська реально-то крутится? Запуститесь под отладчиком, посмотрите, что вызывается вместо osSemaphoreRelease. А семафор вы удачно создаёте перед тем, как его использовать? Есть какие-либо средства верификации?

16 minutes ago, zemlemer said:

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

Очень похоже, что это FreeRTOS. Тогда для того, чтобы взывать API из прерывания, имя функции должно оканчиваться на FromISR.

Перед этим должна быть вызвана xSemaphroeCreateBinary, и на выходе вернуть ненулевой хэндл.

Рекомендую также включить configASSERTы, и сконфигурировать аварийный вывод куда-нить, например в консоль.

Вообще с отдачей семафоров из прерываний у это оси нет. Я это регулярно делаю. Ну, конечно, при соблюдении всех вышесказанных моментов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, haker_fox said:

А какая оська реально-то крутится? Запуститесь под отладчиком, посмотрите, что вызывается вместо osSemaphoreRelease. А семафор вы удачно создаёте перед тем, как его использовать? Есть какие-либо средства верификации?

CMSIS-RTOS. - Это STM-овская надстройка над FreeRTOS.

7 minutes ago, haker_fox said:

Очень похоже, что это FreeRTOS. Тогда для того, чтобы взывать API из прерывания, имя функции должно оканчиваться на FromISR.

Перед этим должна быть вызвана xSemaphroeCreateBinary, и на выходе вернуть ненулевой хэндл.

Рекомендую также включить configASSERTы, и сконфигурировать аварийный вывод куда-нить, например в консоль.

Вообще с отдачей семафоров из прерываний у это оси нет. Я это регулярно делаю. Ну, конечно, при соблюдении всех вышесказанных моментов.

Согласно CMSIS

osStatus osSemaphoreRelease
	(	osSemaphoreId 	semaphore_id
	)	

Parameters
    [in]	semaphore_id	semaphore object referenced with osSemaphoreCreate.

Returns
    status code that indicates the execution status of the function.

Release a Semaphore token. This increments the count of available semaphore tokens.

Note
    Interrupt Service Routines can call this function.

Что интересно - комментирование configASSERT помогло.

           
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, zemlemer said:

Что интересно - комментирование configASSERT помогло

Это ещё ничего не значит. Посмотрите содержимое макроса. Может быть он вам хочется сказать о проблеме, но из-за не настроенного вывода вы этого не видите. configASSERT очень удобный инструмент отладки FreeRTOS, и принебрегать им совершенно недопустимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, zemlemer said:

все намертво встает

Конкретно - где намертво встаёт ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, haker_fox said:

Это ещё ничего не значит. Посмотрите содержимое макроса. Может быть он вам хочется сказать о проблеме, но из-за не настроенного вывода вы этого не видите. configASSERT очень удобный инструмент отладки FreeRTOS, и принебрегать им совершенно недопустимо.

Понятно что так оставлять нельзя....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/30/2019 at 6:51 PM, x893 said:

Конкретно - где намертво встаёт ?

На исполнении osSemaphoreRelease

   

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще конкретнее ?

Или тут телепаты собрались ?

Хоть бы проект полностью загрузили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, x893 said:

А еще конкретнее ?

Мне вот это тоже нравится: придут, зададут вопрос. А потом начинают по капле выдавать информацию. Уже людям укажешь и конкретику, и что посмотреть, и что покрутить. Что-то заработает у них, и они исчезают, не разобравшись в вопросе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...