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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F103, Очень медленно переключает портом!
Firer
сообщение Apr 16 2012, 18:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



Компилятор Keil.
Код в вечном цикле меняет состояние выходного бита порта.
Кварц 8МГц. SYSCLK=8*9=72МГц
APB1=72/2, APB2=72
порт настроен на макс.частоту 50МГц.
прерывания все запрещены.
Ядро работает на 72МГц - MCO включал убедился осциллографом вижу 72МГц.

Реально порт дергается с частотой около 3МГц. В чем дело?
Как минимум должно быть около 36МГц меандр.
Go to the top of the page
 
+Quote Post
-SANYCH-
сообщение Apr 16 2012, 18:34
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864



Для начала не плохо было бы посмотреть во что скомпилировался Ваш вечный цикл (посмотреть что там в асме). А вообще такие вещи нужно писать на асме или делать асмовские вставки. Думаю после этого часть вопросов отпадет сама по себе.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 16 2012, 19:17
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Firer @ Apr 16 2012, 22:00) *
Как минимум должно быть около 36МГц меандр.

Ну-ну, мечтайте дальше.
Как сказано выше, код цикла может скомпилироваться неоптимально.
Кроме того, скорость GPIO в серии STM32F1xx точно меньше скорости процессора. На сколько именно - в документации не написано, надо экспериментировать. Встречал упоминания о том, что мост AHB-APB добавляет 2 цикла задержки. И вот эти "50 МГц" - это всего лишь крутизна фронтов, то есть на частоту переключения не влияет.
Кстати, в серии STM32F2xx совсем другая история.
Go to the top of the page
 
+Quote Post
Firer
сообщение Apr 16 2012, 19:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



Коллеги спасибо за подсказки!
Код я посмотрел ассемблерный. Так что имею права на мечту, ну не 36МГц, ну 10 хотя бы. А то выходит 3.

while (1)
XLED0_TGL;

На асме это:
metka: ldr r1,[r0,0x80c]
eor r1,r1,#0x200
str r1,[r0,#0x80c]
b metka

т.е. 4 такта? Или я не прав?
Ну если еще мост добавит 2 раза по 2 цикла задержки, то выходит около 10 тактов?
А это 7.2МГц а не 3.6.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 16 2012, 20:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Firer @ Apr 16 2012, 23:35) *
т.е. 4 такта? Или я не прав?

Очень часто инструкция выполняется не за 1 такт. В документе "Cortex-M3 Technical Reference Manual" описывается время выполнения инструкций. Дополнительные задержки могут возникать при обращении процессора к внешним шинам (APB, флэш и прочее).
Кроме того, более оптимальный код такой:
Код
int pdata1 = 0x0000, pdata2 = 0x0200;
while (1)
{
    PORT = pdata1;
    PORT = pdata2;
}

Ну и компилировать с максимальной оптимизацией по скорости.
А на ассемблере можно сделать оптимально без оглядки на компилятор.

Update:
Да, забыл.
Цитата(Firer @ Apr 16 2012, 23:35) *
Ну если еще мост добавит 2 раза по 2 цикла задержки, то выходит около 10 тактов?
А это 7.2МГц а не 3.6.

Нет, это не 10, а 20 тактов. Одна итерация цикла в таком виде - это половина периода ("0" - 10 циклов, "1" - 10 циклов, ...).
Go to the top of the page
 
+Quote Post
SBE
сообщение Apr 17 2012, 18:10
Сообщение #6


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

Группа: Участник
Сообщений: 108
Регистрация: 8-09-05
Пользователь №: 8 384



Разбирался когда-то с этим.

STR в порт на STM32 действительно занимает 2 такта (ну не совсем так, но упростим для вашего случая), но вы не забывайте еще и про переход. А вот его влияние на время исполнение приведенного кода уже замысловатее из-за тактов ожидания флеши и буфера предвыборки. Там будет зависимость от того на какой адрес идет переход, и от размера и времени выполнения команд, на которые идет переход.
Попробуйте, не будет ли приведенный вами код по времени исполнения зависеть от адреса метки rolleyes.gif

Линейный код, состоящий из STR, будет как и должно выполняться за 2 такта на каждое обращение, и обеспечивать обещанную частоту переключения 18МГц.


Go to the top of the page
 
+Quote Post
zöner
сообщение Apr 17 2012, 19:12
Сообщение #7


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

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



а LDR ?
Go to the top of the page
 
+Quote Post
a1ien
сообщение Apr 17 2012, 19:29
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 2-02-11
Пользователь №: 62 660



Переход тоже гдето в 2 така выливается. Тоесть цикл записи в порт самый оптимизированный(а не тот что приведен выше) занимает около 6 тактов,соответственно 12 тактов запись патерна. Тоесть теоретически 6-7 мгц это максимум что можно получить при генерации меандра.
Go to the top of the page
 
+Quote Post
SBE
сообщение Apr 17 2012, 21:35
Сообщение #9


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

Группа: Участник
Сообщений: 108
Регистрация: 8-09-05
Пользователь №: 8 384



Цитата(a1ien @ Apr 17 2012, 23:29) *
Переход тоже гдето в 2 така выливается. Тоесть цикл записи в порт самый оптимизированный(а не тот что приведен выше) занимает около 6 тактов,соответственно 12 тактов запись патерна. Тоесть теоретически 6-7 мгц это максимум что можно получить при генерации меандра.

Это вы оптимист насчет перехода, 2 в идеальном случае.
Цитата
Branches take one cycle for instruction and then pipeline reload for target instruction. Non-taken branches are 1 cycle total.
Taken branches with an immediate are normally 1 cycle of pipeline reload (2 cycles total). Taken branches with register
operand are normally 2 cycles of pipeline reload (3 cycles total). Pipeline reload is longer when branching to unaligned 32-bit
instructions in addition to accesses to slower memory. A branch hint is emitted to the code bus that permits a slower system
to pre-load. This can reduce the branch target penalty for slower memory, but never less than shown here.

А если вспомнить про 2 такта ожидания при обращении к флеш на 72МГц для STM32F103, и небольшую глубину буфера предвыборки, то если память мне не изменяет, то и 5 тактов можно получить.
С оптимизацией тож не все так очевидно, какой код там самый оптимизированный. Из-за нюансов внутренней архитектуры легко получаются чудеса.

Цикл из двух записей в порт и перехода на 72МГц действительно по минимуму 6 тактов, т.е. генерация меандра 12МГц. Но можно получить и в 1.5 раза медленее на том же исходном коде.
Go to the top of the page
 
+Quote Post
koyodza
сообщение Apr 22 2012, 16:22
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(scifi @ Apr 16 2012, 22:17) *
Встречал упоминания

Вот там посмотрите http://caxapa.ru/182481.html
Реально 2-3 такта на каждую команду, если в коротком цикле только две записи в порт
Go to the top of the page
 
+Quote Post
nicks80
сообщение Oct 1 2012, 13:47
Сообщение #11


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

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



Цитата(Firer @ Apr 16 2012, 22:00) *
Компилятор Keil.
Код в вечном цикле меняет состояние выходного бита порта.
Кварц 8МГц. SYSCLK=8*9=72МГц
APB1=72/2, APB2=72
порт настроен на макс.частоту 50МГц.
прерывания все запрещены.
Ядро работает на 72МГц - MCO включал убедился осциллографом вижу 72МГц.

Реально порт дергается с частотой около 3МГц. В чем дело?
Как минимум должно быть около 36МГц меандр.


Когда с STM32F4 игрался то дергал ногу с частотой проца. те 2 раза ниже.
А параметры отвечающие за частоту работы порта отвечали за фронт сигнала на пине (т.е. управляли током работы PIO).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 1 2012, 13:53
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В Keil есть симулятор, в котором прекрасно видно, за сколько тактов выполняется команда, а также можно запустить "секундомер" - в строке состояния Keil.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2012, 14:07
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Oct 1 2012, 17:53) *
В Keil есть симулятор, в котором прекрасно видно, за сколько тактов выполняется команда, а также можно запустить "секундомер" - в строке состояния Keil.

Вопрос в том, насколько точен этот симулятор. Насколько я понимаю, они стараются делать его приближенным к реальному кремнию, но гарантий не дают.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 1 2012, 15:56
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Oct 1 2012, 17:07) *
Вопрос в том, насколько точен этот симулятор. Насколько я понимаю, они стараются делать его приближенным к реальному кремнию, но гарантий не дают.

Я не уверен, что симулятор учитывает чтение и использование команд в буфере. Но в остальном, понять, сколько тактов занимает последовательность команд, можно. Keil показывает количество тактов и время, а мы гордо пройдем мимо? Давайте сначала посмотрим на числа, что он показывает, а потом будем отвергать. Уж 36 MHz меандр он точно не покажет. sm.gif
Go to the top of the page
 
+Quote Post
Lukdut
сообщение Oct 1 2012, 20:53
Сообщение #15





Группа: Новичок
Сообщений: 2
Регистрация: 3-03-11
Пользователь №: 63 378



Для быстрого дрыга пинами очень актуальным будет использование BitBand-a. Что за зверь и как юзать может доступно поведать Insider's Guide на русском даже языке.
Однако ж даже с ним 32Мгц не ждите.
PS прошу прощения за "вражий сайт", но файл больше чем 2мб и посему не прикреплябелен(

Сообщение отредактировал Lukdut - Oct 1 2012, 20:56
Go to the top of the page
 
+Quote Post

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

 


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


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