Easyelectronics.ru

Электроника для всех
Текущее время: 23 май 2018, 17:56

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 12 июн 2017, 18:53 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 53
Всем привет.

Столкнулся вот с проблемой. Мне нужно делать кое какую длительную (0.5с) инициализацию периферии перед запуском планировщика. Я использую STM32 HAL и первое что у меня просходит в main() это вызов HAL_Init(), которая внутри запускает SysTick таймер. Так вот пока я делаю свою длинную инициализацию успевает сработать этот самый SysTick, вызов передается в xPortSysTickHandler где все и виснет.

Почему я думаю, что проблема с xPortSysTickHandler()? Вот несколько мыслей
1) с самой инициализацией все хорошо. Она прекрасно работает если отключить FreeRTOS. Она так же хорошо работает в одном из потоков после запуска планировщика, но это несколько ломает архитектуру
2) если выкинуть все долгоиграющие штуки и успеть запустить планировщих в пределах первой милисекунды - дальше все работает нормально.
3) инициализация это не обязательно что нибудь большое и толстое. Обычный HAL_Delay(500) так же виснет, если его запускать до планировщика (HAL_Delay ждет обновления счетчика по SysTick прерыванию)
4) HAL_Delay() перестает зависать, если из SysTick обработчика убрать вызов xPortSysTickHandler(). Разумеется FreeRTOS при этом перестает работать
5) Если после вызова HAL_Init() запретить прерывание SysTick и включать его непосредственно перед вызовом vTaskStartScheduler() то зависание чинится, но (ожидаемо) отваливается HAL_Delay()

Я использую FreeRTOS 9.0.0

Вопросы:
- Насколько это ожидаемое поведение?
- Может нужно отключать xPortSysTickHandler до запуска vTaskStartScheduler()?
- Может есть какие православные способоы решения проблемы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 12 июн 2017, 20:28 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1517
Откуда: Харьков
А что, куб уже не ругается что freeRTOS висит на SysTick?
Повесьте FreeRTOS на таймер и запускайте его когда нужно. Это будет правильно для ХАЛа
А по православному - не использовать ХАЛ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 12 июн 2017, 22:52 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 53
alexsam писал(а):
А что, куб уже не ругается что freeRTOS висит на SysTick?
Повесьте FreeRTOS на таймер и запускайте его когда нужно. Это будет правильно для ХАЛа

ФриРТОС прикручивал без куба, ибо куб генерирует много лишнего кода.
Про таймер - это мысль. Но то еще таймер тратить на фриртос. А СисТик он уже есть и тикает исправно (AFAIK он вообще-то для этого и был придуман)

alexsam писал(а):
А по православному - не использовать ХАЛ.

А что принято использовать вместо?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 12 июн 2017, 23:39 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4708
grafalex писал(а):
А что принято использовать вместо?

Обычно мозги ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 12 июн 2017, 23:44 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 53
dosikus_2 писал(а):
grafalex писал(а):
А что принято использовать вместо?

Обычно мозги ...

Одно другому не мешает. Мне, что ли, регистры в ручную выставлять?
Библиотеки для того и пишут, что бы их реюзили (хотя конкретно HAL мне не нравится)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 12 июн 2017, 23:55 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1517
Откуда: Харьков
grafalex писал(а):
Про таймер - это мысль. Но то еще таймер тратить на фриртос. А СисТик он уже есть и тикает исправно (AFAIK он вообще-то для этого и был придуман)

Ну я вам озвучил политику ST на счет куба, хала и FreeRTOS.
У вас там что, таймеры закончились что вы их жалеете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 13 июн 2017, 00:05 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 53
Люкстричество экономлю, а СисТик все равно тикает...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 13 июн 2017, 14:10 
Заглядывает иногда

Зарегистрирован: 10 июн 2017, 14:46
Сообщения: 53
дискуссия уходит в каком-то не правильном направлении. Тем временем я, похоже, нашел ответ на свой вопрос.

Есть такая функция xTaskGetSchedulerState(). Если в обработчике xPortSysTickHandler() добавить проверку запущен ли планировщик (и не делать лишних вызовов, если он не запущен), то все работает - и длинная инициализация, и HAL_Delay()


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 14 июн 2017, 16:05 
Только пришел

Зарегистрирован: 09 фев 2012, 21:29
Сообщения: 15
И дальше всю "жизнь" программы в прерывании SysTick будет происходить никому уже не нужная проверка состояния шедуллера. Я в таком случае первым делом создавал configTask и запускал шедуллер. В этом таске происходила инициализация и создание остальных тасков. После всего она сама себя убивала.

upd: я тоже против HAL. использую или StdPeriphLib или libopencm3


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 15 июн 2017, 01:27 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1517
Откуда: Харьков
Как только народ не извращается только бы по нормальному не сделать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32: инициализация перед запуском планировщика
СообщениеДобавлено: 15 июн 2017, 10:00 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2578
Как уже выше озвучили - запускать планировщик сразу, первой задачей ставить ваш долгий конфиг, после его выполнения запускать все остальные задачи и убивать эту первую задачу. Куда проще.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB