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

 
 
> А она всё равно виснет!, Помогите разобраться с прерываниями
Dmitrich
сообщение Dec 12 2011, 07:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663



Имеем:

- Процессор STM32F103RCT6
- Тактовая - 72Мгц.
- FreeRTOS v7.02
- Небольшой проект с 7 задачами.

Проект сделан на основе "Demo" из дистрибутива FreeRTOS.
Все опции проекта и основные настройки взяты оттуда.
Все задачи созданы с одинаковым приоритетом, равным 1.

Используются 3 UARTa, для них разрешены прерывания.

Программа в целом работает, все функции выполняет. Есть тольк одно "но":
- Через произвольный промежуток времени, от минут до часов, ОСь виснет!

Использование стека ежесекундно контролируется функцией uxTaskGetStackHighWaterMark во всех задачах.
Размер кучи ежесекундно контролируется функцией xPortGetFreeHeapSize.
Включен механизм контроля переполнения стека vApplicationStackOverflowHook.

Всего хватает с большим запасом, и увеличение всех размеров ситуацию не изменяет.

Все ресурсы (семафоры, очереди) - созданы до создания задач.
В процессе работы никакие ресурсы не удаляются и не создаются.
Из прерываний вызываются ТОЛЬКО xQueueSendFromISR().

Так что наиболее вероятная причина - неправильная настройка приоритетов прерываний.
И тут я уже окончательно запутался, прошу помощи.

Сейчас настройки у меня такие (взяты из демо):

Определения:

#define configKERNEL_INTERRUPT_PRIORITY 255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15

Настройки:

Один раз:
NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

Для UART-ов:

NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4);
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );

NVIC_InitStructure.NVIC_IRQChannel = UART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4);
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );

NVIC_InitStructure.NVIC_IRQChannel = UART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4);
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );

Люди добрые, помогите, кто может!
Мне пока не нужны разные приоритеты, вполне достаточно, если все прерывания будут иметь одинаковый приоритет.









Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
juvf
сообщение Dec 12 2011, 16:08
Сообщение #2


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Пробуйте трассировку. Как минимум трассировку в буфер, или сразу с помощью макросов трассировки. Подробно процесс трассировки описан в КиТ №11 2011
Можно определить макросы по входу и выходу задачи, на тик, на изменение приоритета, а также если запись по xQueueSendFromISR провалилась.
Go to the top of the page
 
+Quote Post
Dmitrich
сообщение Dec 13 2011, 01:22
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663



Большое спасибо всем, кто откликнулся.
Коллективный разум победил!
Проект пере - собран с библиотекой STM32F10x_StdPeriph_Lib_V3.5.0
Сейчас ОСь стабильно работает с такими настройками:

Определения в "FreeRTOSConfig.h":
#define configKERNEL_INTERRUPT_PRIORITY 255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15

Один раз при настройке процессора:

NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

Прерывания всех USART-ов настроены одинаково:

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 14;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );

Естественно, в настройках других USART подставлены соотв. USART1_IRQn

Ещё раз спасибо всем!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 02:30
Рейтинг@Mail.ru


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