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

 
 
> SysTick в STM32F4xx
Sidoroff
сообщение Sep 15 2014, 10:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 3-07-06
Пользователь №: 18 536



Здравствуйте!
Как настроить SysTick, чтобы можно было на время, значительно меньшее периода таймера,
в фоновой программе запрещать и потом разрешать прерывания SysTick, чтобы при этом они не терялись?
Т.е. если в данный момент прерывание запрещено а событие таймера приходит, то оно должно
обработаться сразу же в момент разрешения прерываний таймера.

Ну и соответственно как разрешать/запрещать прерывания SysTick?

Инициализация сейчас стандартная: SysTick_Config(SystemCoreClock / частота);

Для запрета/разрешения пробовал такие варианты:

//такой вариант не запрещает прерывания SysTick вообще
NVIC_DisableIRQ(SysTick_IRQn); // запрет
NVIC_EnableIRQ(SysTick_IRQn); // разрешение

//тоже не запрещает прерывания SysTick
int t = RCC->CIR; RCC->CIR = 0; // запрет
RCC->CIR = t; // разрешение

// запрещает и разрешает, но прерывания теряются
SysTick->CTRL &= (~SysTick_CTRL_TICKINT_Msk); // запрет
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; // разрешение
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Sep 15 2014, 10:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Sidoroff @ Sep 15 2014, 16:10) *
Ну и соответственно как разрешать/запрещать прерывания SysTick?

См. SysTick Control and Status Register [0xE000E010] бит 1.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 15 2014, 11:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Sep 15 2014, 14:57) *
См. SysTick Control and Status Register [0xE000E010] бит 1.

Будут теряться прерывания.

Правильнее сделать менеджер SPI. Завести для него очередь заданий. Из разных источников помещать задания в очередь с указанием calback-функции (когда задание выполнено и результат получен).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 16 2014, 15:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Sep 15 2014, 17:51) *
Будут теряться прерывания.
Правильнее сделать менеджер SPI. Завести для него очередь заданий. Из разных источников помещать задания в очередь с указанием calback-функции (когда задание выполнено и результат получен).

Если учесть, что как пишет ТС, период запрета много короче периода прерываний, и думать что и как делаешь, то не будут теряться.

Но правильней конечно пересмотреть структуру программы, чтобы обмен по SPI не вызывался изнутри обработчика прерывания и снаружи.
Сделать нормальный менеджер службы SPI и API доступа к нему.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 16 2014, 16:35
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Sep 16 2014, 19:55) *
Сделать нормальный менеджер службы SPI и API доступа к нему.

Предлагал. Но для доступа к очереди все равно придется городить критические секции (запрещать прерывания).
То, что было нужно ТС - это отложенные прерывания. Но я бы подумал над архитектурой. Cortex-M это не AVR))) Возможности богаче.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 18 2014, 11:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Sep 16 2014, 22:35) *
Предлагал. Но для доступа к очереди все равно придется городить критические секции (запрещать прерывания).

Во-первых: очереди возможно и не нужны. Если доступ к службе делать с блокировкой (задачи), до достаточно для каждой задачи иметь флаг и задаче ждать
на этом флаге снятия его ISR-ом. ISR знает все флаги.
Во-вторых: очереди легко строятся без всяких критических секций, если писатель (в очередь) только один (задача или ISR) и читатель - только один.
Так даже можно очереди синхронизации между ядрами CPU строить, где невозможно сделать критическую секцию другому ядру.

Цитата(adnega @ Sep 16 2014, 22:35) *
То, что было нужно ТС - это отложенные прерывания. Но я бы подумал над архитектурой. Cortex-M это не AVR))) Возможности богаче.

Да, у ТС естественно детский, АВР-ский подход. Думаю он ещё не скоро вырастет из детских штанишек wink.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 18 2014, 12:05
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Sep 18 2014, 15:26) *
Во-первых: очереди возможно и не нужны. Если доступ к службе делать с блокировкой (задачи), до достаточно для каждой задачи иметь флаг и задаче ждать
на этом флаге снятия его ISR-ом. ISR знает все флаги.

Deadlock: в фоне сделали блокировку, в Systick ждем освобождения.
Цитата(jcxz @ Sep 18 2014, 15:26) *
Во-вторых: очереди легко строятся без всяких критических секций, если писатель (в очередь) только один (задача или ISR) и читатель - только один.

Сам так пользуюсь. Но к сожалению, писателей у ТС два(
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:36
Рейтинг@Mail.ru


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