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

 
 
> 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

Сообщений в этой теме
- 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
||- - AHTOXA   Цитата(pr0m @ Feb 7 2011, 21:57) Нет, одн...   Feb 7 2011, 17:15
||- - sonycman   Цитата(AHTOXA @ Feb 7 2011, 20:15) Всё же...   Feb 7 2011, 17:22
||- - 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 Текстовая версия Сейчас: 18th July 2025 - 18:49
Рейтинг@Mail.ru


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