Easyelectronics.ru

Электроника для всех
Текущее время: 08 мар 2021, 08:06

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Не понятные вещи после создания задач и запуска шедулера..
СообщениеДобавлено: 06 авг 2020, 13:19 
Заглядывает иногда

Зарегистрирован: 17 ноя 2014, 10:37
Сообщения: 54
Keil.. STM32f429... FreeRTOS 10.3.1
Создано 22 задачи .. очереди или семафоры для них...

После создания задач и запуска шедулера при останове при входе в задачу в call stack (в кейле) в некоторых задачах уже присутствует вот такая непонятка (в 8 задачах... )
Вложение:
2020-08-06_083442.jpg
2020-08-06_083442.jpg [ 29.8 Кб | Просмотров: 545 ]

внизу prvTaskExitError...

в остальных задачах этого нет
Вложение:
buzzer.jpg
buzzer.jpg [ 19.32 Кб | Просмотров: 545 ]


что это такое?
все задачи созданы одинаково... вход.. инициализация переменных .. while(1)...
размера стеков задач хватает ... это показывает uxTaskGetSystemState...(в задаче монитора FreeRTOS раз в секунду)
размер кучи FreeRTOS тоже с запасом... это показывает xPortGetMinimumEverFreeHeapSize()...
все задачи, очереди, семафоры и куча FreeRTOS с начало создавались динамически... создал их статически ... но это не изменяется..
freertos ведет себя не понятно... иногда попадает в хардфалт...
при падение в HF pc=0...
подтолкните в нужное направление где искать .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не понятные вещи после создания задач и запуска шедулера..
СообщениеДобавлено: 06 авг 2020, 13:47 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2644
В прерываниях используются функции FreeRTOS?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не понятные вещи после создания задач и запуска шедулера..
СообщениеДобавлено: 06 авг 2020, 13:55 
Заглядывает иногда

Зарегистрирован: 17 ноя 2014, 10:37
Сообщения: 54
Pingvin писал(а):
В прерываниях используются функции FreeRTOS?

да...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не понятные вещи после создания задач и запуска шедулера..
СообщениеДобавлено: 06 авг 2020, 14:08 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2644
dvi писал(а):
Pingvin писал(а):
В прерываниях используются функции FreeRTOS?

да...

Приоритет этих прерываний должен быть ниже, чем приоритет прерывания шулдера - это в конфиге настраивается.
Это выполнено?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не понятные вещи после создания задач и запуска шедулера..
СообщениеДобавлено: 06 авг 2020, 15:16 
Заглядывает иногда

Зарегистрирован: 17 ноя 2014, 10:37
Сообщения: 54
Pingvin писал(а):
dvi писал(а):
Pingvin писал(а):
В прерываниях используются функции FreeRTOS?

да...

Приоритет этих прерываний должен быть ниже, чем приоритет прерывания шулдера - это в конфиге настраивается.
Это выполнено?


вот конфиг FreeRTOS...
Код:
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
   /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
   #define configPRIO_BITS             __NVIC_PRIO_BITS
#else
   #define configPRIO_BITS             4        /* 15 priority levels */
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0xf

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY   5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY       ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )


я правильно понимаю самый низкий приоритет для прерывания для STM32F4 это configLIBRARY_LOWEST_INTERRUPT_PRIORITY...
HAL_NVIC_SetPriority((IRQn_Type)(BUTTON_Select_EXTIx_IRQn), configLIBRARY_LOWEST_INTERRUPT_PRIORITY, 0x00);
поднять приоритет configLIBRARY_LOWEST_INTERRUPT_PRIORITY-1...
а максимальный для прерываний configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ?
или configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY+1 ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не понятные вещи после создания задач и запуска шедулера..
СообщениеДобавлено: 07 авг 2020, 07:03 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2644
Читайте тут http://easyelectronics.ru/ustanovka-i-k ... ertos.html
и тут http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html



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


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


Но есть нюанс. Допустим диспетчер что-то делает с очередью, смотрит кого там можно разблокировать по ее состоянию, пишет туда что-то свое, а тут опа прерывание и в нем некая [****]FromISR записала в ту самую очередь. Что у нас будет? У нас будет лажа. Т.к. на выходе из прерывания диспетчер похерит все что предыдущее прерывание туда писало — он то запись до конца не провел. Т.е. налицо классическое нарушение атомарности.
Чтобы этого не было, диспетчер на время критических записей запрещает прерывания. Чтобы ему никто не мог помешать делать свое дело. Но запрещает он не все прерывания, а только определенную группу. Скажем все прерывания с приоритетом (меньше число, старше приоритет) 15 по 11, а 1 по 10 нет. В результате на 1 по 10 мы можем вешать что то ну очень сильно важное и никакой диспетчер это не перебьет. Но пользоваться API RTOS в этих (1-10) прерываниях ни в коем случае уже нельзя — они могут диспетчер скукожить. Для настройки этих групп есть конфиг специальный. Для STM32 он выглядит так:


1
2
3
4
5
6
7
8
9



/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255 (lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY 255

/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */

/* This is the value being used as per the ST library which permits 16 priority values, 0 to 15. This must correspond to the configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest NVIC value of 255.
Шняга для SPL, короче. Эти утырки там приоритеты по другому обозначают*/
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15



Мы указываем приоритет ядра KERNEL = 255. И задаем планку максимального приоритета для прерываний которые имеют право юзать [****]FromISR API функции = 191. В статье о NVIC я писал, что у STM32 в байте с приоритетом играет роль только старшая тетрада, т.е. у нас есть 16 уровней приоритетов от старшего к младшему: 0х00, 0х10, 0х20, 0х30…0xF0


Т.е. 255 это уровень 0xF0 — самый младший, а 191 уровень 0xB0 и, таким образом, все прерывания в которых мы можем использовать API фукнции должны быть сконфигурированы с приоритетом от 0xF0 до 0xB0, не старше. Иначе будет трудноуловимый глюк. Прерывания же не использующие API могут быть с каким угодно приоритетом от самого низкого до самого старшего.


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


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


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

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


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

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

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