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

 
 
> 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
 
Start new topic
Ответов
Golikov A.
сообщение May 7 2014, 19:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- MiklPolikov   STM32L151 инструкции dsb isb и т.п.   May 4 2014, 04:50
- - Golikov A.   переключение частот как? просто меняете делитель и...   May 4 2014, 06:26
- - SII   В STM32Lxxx надо ещё следить за напряжением питани...   May 4 2014, 08:22
|- - MiklPolikov   Цитата(SII @ May 4 2014, 12:22) В STM32Lx...   May 4 2014, 11:24
- - SII   Пока PLL не "устаканилась" на новой част...   May 7 2014, 07:13
|- - MiklPolikov   Цитата(SII @ May 7 2014, 11:13) Пока PLL ...   May 7 2014, 12:21
|- - jcxz   Цитата(MiklPolikov @ May 7 2014, 18:21) В...   May 7 2014, 15:33
- - Golikov A.   есть мнение что PLL при резкой смене частоты с 1 н...   May 7 2014, 07:56
|- - jcxz   Цитата(Golikov A. @ May 7 2014, 13:56) ес...   May 7 2014, 08:58
|- - adnega   Цитата(MiklPolikov @ Feb 24 2015, 23:01) ...   Feb 24 2015, 20:55
|- - demiurg_spb   Цитата(MiklPolikov @ Feb 24 2015, 23:01) ...   Feb 25 2015, 10:08
|- - MiklPolikov   Цитата(demiurg_spb @ Feb 25 2015, 13:08) ...   Feb 25 2015, 10:25
|- - demiurg_spb   Цитата(MiklPolikov @ Feb 25 2015, 13:25) ...   Feb 25 2015, 15:00
- - aaarrr   1. Здесь нужна DSB, а не ISB. ISB может понадобить...   Feb 24 2015, 21:04
- - jcxz   Цитата(aaarrr @ Feb 25 2015, 03:04) Одног...   Feb 25 2015, 05:45
- - aaarrr   Цитата(jcxz @ Feb 25 2015, 08:45) Для соз...   Feb 25 2015, 10:34
- - jcxz   Цитата(aaarrr @ Feb 25 2015, 16:34) Однок...   Feb 26 2015, 03:52
- - aaarrr   Цитата(jcxz @ Feb 26 2015, 06:52) Однокра...   Feb 26 2015, 06:41


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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 07:29
Рейтинг@Mail.ru


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