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

 
 
> STM32L151 инструкции dsb isb и т.п., Хочу понять, зачем нужны.
MiklPolikov
сообщение May 4 2014, 04:50
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Посматривал код операционки freeRTOS , и обнаружил там
__dsb( portSY_FULL_READ_WRITE );
__wfi();
__isb( portSY_FULL_READ_WRITE );
как я понимаю, перед остановкой процессора команда dsb дожидается завершения всех текущих команд в конвеере.
что делает isb после выхода из сна понимаю совсем смутно.
Не понимаю, почему именно эти две команды, ведь в описании ядра есть и другие подобные команды-барьеры.
Очень хотелось бы понять эту премудрость.

И вот ещё:
При переключении тактовой частоты с 1MHz на 16MHz и обратно процессор иногда зависает. А если между 1 и 16 МГц включать "промежуточную" 4МГц, то проблемы нет.
Может как раз при переключении частоты и нужно применить какую-то барьерную команду ?

Заранее спасибо за ответы !


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Golikov A.
сообщение May 4 2014, 06:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



переключение частот как? просто меняете делитель и все что ли?

правильно частоты менять так
переходите на внутреннее тактирование
настраиваете новую частоту
ждете стабилизации ПЛЛ
переходите на тактирование от него

в момент перестройки может быть что угодно, клоки любой длинны, и все сработает как попало, наличие другой частоты ИМХО просто делает скачки более плавными, и в конкретно ваших условиях это помогло. Но в температуре, диапазоне питаний может быть косяк...
Go to the top of the page
 
+Quote Post
SII
сообщение May 4 2014, 08:22
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



В STM32Lxxx надо ещё следить за напряжением питания процессорного ядра и настройками флэш-памяти -- к ним разные требования на разных частотах. В документации всё описано, включая последовательность действий, необходимых для изменения частоты.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 4 2014, 11:24
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(SII @ May 4 2014, 12:22) *
В STM32Lxxx надо ещё следить за напряжением питания процессорного ядра и настройками флэш-памяти -- к ним разные требования на разных частотах. В документации всё описано, включая последовательность действий, необходимых для изменения частоты.

Пока генератор стабилизируется жду. А voltage range 1 для того что бы настройки FLASH можно было не трогать.
И всё равно при переключении 1-16-1 МГц виснет. А при переключении 1-4-16-4-1 МГц не виснет даже при Voltage Range 2 и 3 .
Уже обсуждал тут тему частот и всех сопутствующих настроек. http://electronix.ru/forum/index.php?showt...likov&st=15
Пока получается, что единственная защита от глюка это "постепенное" переключение с промежуточной частотой.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
SII
сообщение May 7 2014, 07:13
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Пока PLL не "устаканилась" на новой частоте, на её выходе может твориться любое безобразие. Соответственно, на время перенастройки PLL необходимо переходить на тактирование процессора от другого источника. 4 МГц, если память не изменяет, выдаёт MSI, но можно использовать и внешний кварц/осциллятор (HSE), если он уже был запущен: переключение же режимов PLL не влияет на собственно генератор синхронизации. Так что в общем случае с одной частоты на другую действительно не перейдёшь без промежуточной частоты, получаемой без PLL.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2014, 07:56
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



есть мнение что PLL при резкой смене частоты с 1 на 16 и на 1, выдает сигнал что оно устаканилось а потом срывается.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 7 2014, 08:58
Сообщение #7


Гуру
******

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



Цитата(Golikov A. @ May 7 2014, 13:56) *
есть мнение что PLL при резкой смене частоты с 1 на 16 и на 1, выдает сигнал что оно устаканилось а потом срывается.

В STM32??? biggrin.gif
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 7 2014, 12:21
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(SII @ May 7 2014, 11:13) *
Пока PLL не "устаканилась" на новой частоте, на её выходе может твориться любое безобразие. Соответственно, на время перенастройки PLL необходимо переходить на тактирование процессора от другого источника. 4 МГц, если память не изменяет, выдаёт MSI, но можно использовать и внешний кварц/осциллятор (HSE), если он уже был запущен: переключение же режимов PLL не влияет на собственно генератор синхронизации. Так что в общем случае с одной частоты на другую действительно не перейдёшь без промежуточной частоты, получаемой без PLL.


Разумеется я это понимаю, и в точности так и обращаюсь с PLL
В данном случае наблюдаю глюк при переключении c давно работающих HSI 16 МГц на MSI 1 МГц и обратно.
Возможно, дело в "состыковке" фронтов двух несинхронизированных геренаторов. В момент переключения появляется очень короткий такт, он и вызывает сбой.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 7 2014, 15:33
Сообщение #9


Гуру
******

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



Цитата(MiklPolikov @ May 7 2014, 18:21) *
Возможно, дело в "состыковке" фронтов двух несинхронизированных геренаторов. В момент переключения появляется очень короткий такт, он и вызывает сбой.

Если Вы "в точности так и обращаетесь", то в момент такой состыковки если даже это есть, ядро у вас будет работать от
дефолтного источника (не от PLL), и на него этот такт никак не должен повлиять.

А почему бы Вам переключение частоты не делать с предварительной перезагрузкой всего МК (аппаратным ресетом)?
Я в своём проекте, где тоже нужно переключать частоту PLL, не стал усложнять, и просто делаю аппаратный ресет,
а старт ПО и инициализация PLL идёт уже на новой clk.
Всё работает прекрасно с какой-бы на какую-бы частоту не пробовал переключаться. LPC1758
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2014, 19:36
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
В данном случае наблюдаю глюк при переключении c давно работающих HSI 16 МГц на MSI 1 МГц и обратно.


Ё-МОЁ! Вы так описали, я подумал что когда вы частоту PLL меняете с 16 на 1 и возвращаетесь на него все падает... Потому и выссказал предположение о срыве... А в инструкции не описано спец последовательности переключения между HSI, MSI?

Цитата
Всё работает прекрасно с какой-бы на какую-бы частоту не пробовал переключаться. LPC1758

ну так на то он и LPC а не STM sm.gif...
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 7 2014, 21:47
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(Golikov A. @ May 7 2014, 23:36) *
Ё-МОЁ! Вы так описали, я подумал что когда вы частоту PLL меняете с 16 на 1 и возвращаетесь на него все падает... Потому и выссказал предположение о срыве... А в инструкции не описано спец последовательности переключения между HSI, MSI?


В документе "PM0062 Flash and EEPROM Programming"
Но не до конца понимаю порядок переключения LATENCY и ACC64. Как понимаю я, при Voltage Range 1 о них заботится не нужно. Т.е. при высоком напряжении питания ядра и/или низкой частоте работает при любой настройке этих бит. В другом случае невозможно было бы сделать переключение, не пройдя через запрещённое сочетание настроек.


Increasing the CPU frequency (in the same voltage range).
● Program the 64-bit access by setting the ACC64 bit in FLASH_ACR
● Check that 64-bit access is taken into account by reading FLASH_ACR
● Program 1 WS to the LATENCY bit in FLASH_ACR
● Check that the new number of WS is taken into account by reading FLASH_ACR
● Modify the CPU clock source by writing to the SW bits in the RCC_CFGR register
● If needed, modify the CPU clock prescaler by writing to the HPRE bits in RCC_CFGR
● Check that the new CPU clock source or/and the new CPU clock prescaler value is/are
taken into account by reading the clock source status (SWS bits) or/and the AHB
prescaler value (HPRE bits), respectively, in the RCC_CFGR register
Decreasing the CPU frequency (in the same voltage range).
● Modify the CPU clock source by writing to the SW bits in the RCC_CFGR register
● If needed, modify the CPU clock prescaler by writing to the HPRE bits in RCC_CFGR
● Check that the new CPU clock source or/and the new CPU clock prescaler value is/are
taken into account by reading the clock source status (SWS bits) or/and the AHB
prescaler value (HPRE bits), respectively, in the RCC_CFGR register
● Program the new number of WS to the LATENCY bit in FLASH_ACR
● Check that the new number of WS is taken into account by reading FLASH_ACR
● Program the 32-bit access by clearing ACC64 in FLASH_ACR
● Check that 32-bit access is taken into account by reading FLASH_ACR


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Feb 24 2015, 20:01
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Коллеги, добрый день.

Сейчас вопрос исключительно про барьерные команды.
Хочу понять, в каких случаях они нужны.
Что они делают примерно понимаю, но общей ясной нет.
Кто разобрался в этом вопросе, просветите пожалуйста.


Сейчас понимаю так:
1) Если производится 1-включение тактирования периферии 2-запись чего-то в регистр периферии, то между этими командами нужна __isb(15), потому что если ещё не была выполнена 1, то 2 не пройдёт.

2) Аналогично п 1) нужно делать всё работу с аппаратной частью в местах, где выполнение предыдущей команды критически важно для последующей.

3) Несколько любых инструкций, например пустой цикл for ( i = 0 ; i < 5 ; i + + ) { } являются аналогом __isb(15); __dsb(15);

4) Между командами x=1; if( x == 1) {} барьерная команда не нужна, потому что компилятор сам знает, что их критически важно выполнить по очереди.

5) Если пример 4) реализовать каким-то хитрым образом через указатели, то быть может, для его гарантированной работы потребуется барьерная команда.

5)Предполагаю, что __dsb(15); оказывает действие в случаях, когда обращения к памяти происходят не по команде процессора, например в память что-то пишет периферия, или работает DMA .

Заранее спасибо за ответ !


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 24 2015, 20:55
Сообщение #13


Гуру
******

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



Цитата(MiklPolikov @ Feb 24 2015, 23:01) *
Сейчас вопрос исключительно про барьерные команды.

Думаю, рояля играет в первую очередь в многопроцессорных системах.

Хотелось бы начать с более-менее внятного и повторяемого примера, где замена барьерной инструкции на NOP будет отличаться поведением.
Кто-нить писал самомодифицирующийся код для Cortex-M ? Может, без ISB не заработает?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 24 2015, 21:04
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



1. Здесь нужна DSB, а не ISB. ISB может понадобиться, например, при выполнении действий типа remap, работе с MPU и т.п.

2. Опять-таки DSB, а не ISB в большинстве случаев.

3. На ARM7, например, так и делалось.

4. Не нужна, если x не является периферийным регистром.

5. Нет, если x не является периферийным регистром.

6. Нет.

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

Цитата(adnega @ Feb 24 2015, 23:55) *
Хотелось бы начать с более-менее внятного и повторяемого примера, где замена барьерной инструкции на NOP будет отличаться поведением.
Кто-нить писал самомодифицирующийся код для Cortex-M ? Может, без ISB не заработает?

Одного NOP'а мало - конвейер длиннее. Самомодифицирующияся код без ISB работать не должен (хотя, если честно, не приходило в голову писать его для CM).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 25 2015, 05:45
Сообщение #15


Гуру
******

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



Цитата(aaarrr @ Feb 25 2015, 03:04) *
Одного NOP'а мало - конвейер длиннее. Самомодифицирующияся код без ISB работать не должен (хотя, если честно, не приходило в голову писать его для CM).

Для создания такого кода, достаточно указать функции модификатор __ramfunc в IAR wink.gif

Цитата(aaarrr @ Feb 25 2015, 03:04) *
ISB сбрасывает конвейер. Ставится после инструкции, выполнение которой может повлечь нарушение нормальной работы конвейера.
DSB заставляет ядро закончить все текущие операции с памятью до выполнения следующей инструкции.
DMB позволяет определить последовательность обращений к памяти, т.е. обращения, стоящие до барьера, будут гарантированно выполнены перед теми, что стоят после.

Тогда для случая N.1 логичнее использовать DMB.
Go to the top of the page
 
+Quote Post

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

 


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


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