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

 
 
> STM32F10x, не перестаёт удивлять
pr0m
сообщение Feb 6 2011, 20:02
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Полдня чесал репу и разлохматил бубен на казалоь бы ровном месте... А именно: имеем некий код в основном цикле, с временем исполнения, определяемым периодом таймера. Таймер запускается перед контролируемым кодом, тот в цикле делает свои дела, а выходит по флагу, к-й устанавливается в обработчике прерывания (Update Event) этого таймера. Таймер запускается перед этим блоком. По так и невыясненным причинам, всё работало после ресета до того момента, пока не происходило некое внешнее прерывание (с приоритетом ниже таймера), делающее быстро другие примитивные дела, не относящиеся к интересующему участку кода. После этого начинались чудеса - на очередном внешнем цикле после запуска таймера код лихо проскакивал проверку while(!bStopDSS), даже не заглянув внутрь, и происходило 2! прерывания от таймера, одно из которых видимо и устанавливало bStopDSS=1 до входа во внутренний цикл. Вылечил проверкой флага прерывания перед включением таймера. Перекорячивается конвейер команд? При включении таймера (строка TIM3->CR1 |= TIM_CR1_CEN) ещё не сброшен бит прерывания?
Код
volatile uint8_t bStopDSS;
while(1) // внешний цикл
{
bStopDSS = 0;
TIM3->CNT = 0;
TIM3->SR = ~TIM_IT_Update;
while(TIM3->SR & TIM_IT_Update); // без этой проверки - чудеса
TIM3->CR1 |= TIM_CR1_CEN;

while(bStopDSS == 0)
{
// Внутренний цикл, выходим по таймеру.    
}
//
...готовимся к следующему циклу
//
}

void TIM3_IRQHandler (void)
{
    // Сбрасываем флаг прерывания
    TIM3->SR = ~TIM_IT_Update;
    // Останавливаем таймер
       TIM3->CR1 &= ~TIM_CR1_CEN;
    // Флаг окончания внутреннего цикла
    bStopDSS = 1;
}


Такие дела. В голове смятение.

Сообщение отредактировал pr0m - Feb 6 2011, 20:05


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pr0m
сообщение Feb 7 2011, 14:18
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Победил. Не была задана группировка с вытеснением в NVIC, т.е. 0 preemption групп, 16 приоритетов. Задал приоритет 0 для таймера (типа выше всех остальных в системе), и думал ни одна собака его не прервёт, зато он у всех будет проц вырывать, как приспичит, и гарантированно не пропустит ни одного сэмпла. Ан нет - почитал про preemption, прозрел, разделил на группы, таймер определил в гордом одиночестве в 0-ю группу, 0-й приоритет - и теперь всё в норме.
Что взять с начинающего?


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 7 2011, 15:21
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(pr0m @ Feb 7 2011, 17:18) *
Задал приоритет 0 для таймера (типа выше всех остальных в системе), и думал ни одна собака его не прервёт, зато он у всех будет проц вырывать, как приспичит, и гарантированно не пропустит ни одного сэмпла.

Так и есть. Без групп, нулевой приоритет - высший.
Разве нет?
Go to the top of the page
 
+Quote Post
pr0m
сообщение Feb 7 2011, 15:39
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Цитата(sonycman @ Feb 7 2011, 18:21) *
Так и есть. Без групп, нулевой приоритет - высший.
Разве нет?

Высший-то высший, но тут речь о возможности вытеснения текущего прерывания, и предаче управления другому. Например, если сейчас исполняется прерывание 0-й группы и, скажем, приоритет 2, то пришедший запрос на прерывание из той-же 0-й группы с более высоким приоритетом=1 НЕ прервёт исполнение текущего обработчика, т.к. они оба относятся к одной (0-й) группе, а станет в очередь (pending). А вот если мы разделим приоритеты по группам, подгруппам, обработчик прерывания 1-й группы, любой приоритет будет вытеснен запросом на прерывание из 0-й группы, любой приоритет. Такая вот иерархия. Описание NVIC контроллера и регистра SCB_AIRCR к прочтению.
В одной группе приоритетом определяется только очерёдность передачи управления тому или иному вектора, а если они ещё и с одинаковым приоритетом, то аппаратным порядковым номером вектора.

Сообщение отредактировал pr0m - Feb 7 2011, 15:43


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 7 2011, 16:04
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(pr0m @ Feb 7 2011, 18:39) *
Высший-то высший, но тут речь о возможности вытеснения текущего прерывания, и предаче управления другому.

По умолчанию, после аппаратного сброса, NVIC в STM32 работает в режиме одной единственной группы, без подгрупп.
То есть любому прерыванию можно присвоить лишь простой приоритет 0, 1, 2 и т.д.

Ноль будет высшим и будет прерывать выполнение любого другого прерывания (кроме системных).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 7 2011, 16:17
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Feb 7 2011, 21:04) *
По умолчанию, после аппаратного сброса, NVIC в STM32 работает в режиме одной единственной группы, без подгрупп.
То есть любому прерыванию можно присвоить лишь простой приоритет 0, 1, 2 и т.д.

Ноль будет высшим и будет прерывать выполнение любого другого прерывания (кроме системных).

Ненене! Внутри одной группы прерывания друг друга не вытесняют:-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 7 2011, 16:25
Сообщение #7


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AHTOXA @ Feb 7 2011, 19:17) *
Ненене! Внутри одной группы прерывания друг друга не вытесняют:-)

Так ведь группы-то разные!
Приоритет 0 - нулевая группа.
Приоритет 1 - первая группа и т.д.

Это если PRIGROUP = 0.

Или нет?
Go to the top of the page
 
+Quote Post
pr0m
сообщение Feb 7 2011, 16:57
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Цитата(sonycman @ Feb 7 2011, 19:25) *
Так ведь группы-то разные!
Приоритет 0 - нулевая группа.
Приоритет 1 - первая группа и т.д.

Это если PRIGROUP = 0.

Или нет?


Нет, одна группа - 0-я, и в ней 15 ПОДприоритетов, к-е друг друга не вытесняют.
Прикрепленное изображение

Кстати, не совсем понял один момент: после сброса поле групп = 000, если верить описанию регистра SCB_AIRCR:
Прикрепленное изображение

Такого сочетания этих конфигурационных бит нет. И какая схема приоритетов имеет место после ресета?


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 7 2011, 17:15
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(pr0m @ Feb 7 2011, 21:57) *
Нет, одна группа - 0-я, и в ней 15 ПОДприоритетов, к-е друг друга не вытесняют.

Всё же нет, 16 групп, в каждой по одному уровню приоритета.
Цитата(pr0m @ Feb 7 2011, 21:57) *
Кстати, не совсем понял один момент: после сброса поле групп = 000, если верить описанию регистра SCB_AIRCR:
Такого сочетания этих конфигурационных бит нет. И какая схема приоритетов имеет место после ресета?

0b011. Ибо все значения, меньше либо равные этому (вплоть до нуля) дают одинаковый результат при имеющихся битах приоритета.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 7 2011, 17:22
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AHTOXA @ Feb 7 2011, 20:15) *
Всё же нет, 16 групп, в каждой по одному уровню приоритета.

Вот именно, подприоритет одинаковый, а вот вытесняющий приоритет (pre-emption priority) разный!
Поэтому получается 16 групп (с одной подгруппой внутри), каждая группа будет вытеснять более младшую.

То есть получается максимум 16 уровней вложенности.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pr0m   STM32F10x   Feb 6 2011, 20:02
- - akimych   Интересно то, что после while(TIM3->SR & TI...   Feb 6 2011, 21:29
- - AHTOXA   Цитата(pr0m @ Feb 7 2011, 01:02) Такие де...   Feb 7 2011, 06:06
|- - pr0m   Цитата(AHTOXA @ Feb 7 2011, 09:06) Попроб...   Feb 7 2011, 08:42
|- - AHTOXA   Цитата(pr0m @ Feb 7 2011, 13:42) Флаг UEV...   Feb 7 2011, 09:16
|- - pr0m   Цитата(AHTOXA @ Feb 7 2011, 12:16) Однако...   Feb 7 2011, 12:20
||- - sonycman   Цитата(pr0m @ Feb 7 2011, 19:57) Нет, одн...   Feb 7 2011, 17:11
|||- - pr0m   Цитата(sonycman @ Feb 7 2011, 20:11) Хм, ...   Feb 7 2011, 17:17
||- - pr0m   Цитата(AHTOXA @ Feb 7 2011, 20:15) Всё же...   Feb 7 2011, 17:31
||- - AHTOXA   Цитата(pr0m @ Feb 7 2011, 22:22) А моя пр...   Feb 7 2011, 17:32
||- - KnightIgor   Цитата(pr0m @ Feb 7 2011, 18:31) А моя пр...   Feb 7 2011, 17:58
||- - pr0m   Цитата(KnightIgor @ Feb 7 2011, 20:58) По...   Feb 7 2011, 18:05
|- - AHTOXA   Цитата(sonycman @ Feb 7 2011, 21:04) По у...   Feb 7 2011, 17:06
- - pr0m   Разобрался. sonycman прав. 15 подгрупп после ресет...   Feb 7 2011, 17:53
|- - sonycman   Цитата(pr0m @ Feb 7 2011, 20:53) И что ж ...   Feb 7 2011, 18:05
|- - pr0m   Цитата(sonycman @ Feb 7 2011, 21:05) В эт...   Feb 7 2011, 18:11
- - akimych   Цитата1) Для детерминированности времени исполнени...   Feb 7 2011, 19:06
|- - pr0m   Цитата(akimych @ Feb 7 2011, 22:06) Стран...   Feb 7 2011, 19:31
- - akimych   ЦитатаВ этой ветке переплелись мои вопросы по двум...   Feb 7 2011, 21:24
|- - pr0m   Цитата(akimych @ Feb 8 2011, 00:24) На сч...   Feb 8 2011, 07:03
|- - ReAl   Цитата(pr0m @ Feb 8 2011, 09:03) Там долж...   Feb 8 2011, 23:27
- - akimych   ЦитатаВы наверное имеете ввиду доступ к bit-bandin...   Feb 8 2011, 22:00
|- - pr0m   Цитата(akimych @ Feb 9 2011, 01:00) А что...   Feb 9 2011, 16:48
|- - ReAl   Цитата(pr0m @ Feb 9 2011, 18:48) Не знаю....   Feb 9 2011, 21:08
|- - pr0m   Цитата(ReAl @ Feb 10 2011, 00:08) Значени...   Feb 10 2011, 06:06
|- - vmp   Цитата(pr0m @ Feb 10 2011, 09:06) Спасибо...   Feb 10 2011, 07:39
||- - pr0m   Цитата(vmp @ Feb 10 2011, 10:39) Преимуще...   Feb 10 2011, 12:19
|- - ReAl   Цитата(pr0m @ Feb 10 2011, 08:06) Спасибо...   Feb 10 2011, 14:07
|- - pr0m   Цитата(ReAl @ Feb 10 2011, 17:07) Проблем...   Feb 10 2011, 21:48
- - pr0m   Красиво, получается, но основной недостаток - чуть...   Feb 11 2011, 14:31
- - akimych   В принципе, запись в буфер и запись в регистр ЦАП-...   Feb 13 2011, 02:17
- - pr0m   Цитата(akimych @ Feb 13 2011, 05:17) Изме...   Feb 13 2011, 07:03


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

 


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


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