stm32 cubeide два инкремента не совместимы.

Кто любит RISC в жизни, заходим, не стесняемся.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Eddy_Em, код в студию.

Добавлено after 12 minutes 32 seconds:
AVI-crak писал(а):300к тактов на строку текста
CCSTEP показывает 256701 тактов.
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

Например: 2 буфера для получения, два буфера для отправки. Отправляю обычно через DMA, а вот получаю по прерыванию, т.к. нужно мониторить '\n', а прерывания по получению символа, как у F0, у F1 нет. Писать же разные сниппеты для разных семейств мне откровенно лень, да и USART — очень медленная штука, хай прерывает.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: stm32 cubeide два инкремента не совместимы.

Сообщение VladislavS »

Может мне кто-нибудь рассказать что он там измеряет?

Код: Выделить всё

auto start = DWT->CYCCNT;
sprintf(buf,"Hello, Wrold!\r\n"); 
auto end1 = DWT->CYCCNT;
sprintf(buf,"end1-start = %d\r\n",end1-start); 
auto end2 = DWT->CYCCNT;
На Cortex-M4 от start до end2 выполняется:
- IAR (оптимизация speed) за 1264 такта,
- GCC 10.3 (-O3) за 1427 тактов,
- Keil ARM v6.16 (-O3) 1235 тактов.
Откуда у него там десятки и сотни тысяч тактов???
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4178626#p4178626"]Откуда у него там десятки и сотни тысяч тактов???[/uquote]
Так он же писал, что запилил себе блокирующий printf. И пока все данные в USART не уйдут, оно тупит...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: stm32 cubeide два инкремента не совместимы.

Сообщение VladislavS »

Я бы охотно поверил, но! У него контроллер f100 с максимальной частотой 24 МГц. UART 19200. Строка "'Hello World!\r\n" это 14 символов. Физически передаётся 175000 тактов. Как-то ни туда, ни сюда.
Последний раз редактировалось VladislavS Пт фев 11, 2022 02:49:42, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Аlex »

VladislavS писал(а):Физически передаётся 17500 тактов. Где остальное, Зин?
Если мысленно умножить это значение на 2, то можно предположить, что у него скорость в 2 раза меньше. Т.е. = 9600 :roll:

Добавлено after 2 minutes 4 seconds:
Но, в любом случае, блокировать программу на десятки килотактов - это кощунство :cry:
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: stm32 cubeide два инкремента не совместимы.

Сообщение VladislavS »

Я там нолик в потьмах посеял. 24'000'000/19'200*10*14 = 175'000
Так что, там хоть умножай, хоть дели - ни с чем не вяжется.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Все там вяжется, 32МГц, по чему 24Мгц? И максимум, вроде, этот чип тянет 56МГц.
И по чему 14 символов, там 15 символов. Скорость UART 19200.

Я забыл, что перед этим измерением у меня строки отправляются, и ввел задержку перед измерением
Спойлер

Код: Выделить всё

	SEND("\r\n STM32F100RB USART DMA-tx !!! 31");
	SEND("\r\n STM32F100RB USART DMA-tx !!! 32");
	SEND("\r\n STM32F100RB USART DMA-tx !!! 33");

	SEND("\r\n");
	printu(ms_tick);
	SEND("\r\n");
        
    delay_ms(2000);

	uint32_t start = DWT->CYCCNT; 
	printf("Hello, world!\r\n");
    uint32_t end = DWT->CYCCNT;
    
    //printf("start-end = %d\r\n", (end - start));
    sprintf(buf,"start-end = %u\r\n", (end - start));
    SEND(buf);
Вот точное измерение

Код: Выделить всё

Hello, world!
start-end = 255819
CCSTEP показывает 255817 тактов.

На частоте 24Мгц

Код: Выделить всё

Hello, world!
start-end = 192565
CCSTEP показывает 192563 тактов.
Все сходится +2 такта на команду uint32_t end = DWT->CYCCNT; и будет ровное количество.
Оптимизация balanced.

Оптимизация speed 32МГц 19200 выдает start-end = 255846.
VladislavS писал(а):На Cortex-M4 от start до end2 выполняется:
Учитывая что тип auto в С нету, и по чему sprintf, а не printf?
Измеряли printf. Компилятор IAR.
Спойлер

Код: Выделить всё

	uint32_t start = DWT->CYCCNT; 

	//printf("Hello, world!\r\n");
    SEND("Hello, world!\r\n");
    uint32_t end = DWT->CYCCNT;
    
    //printf("start-end = %d\r\n", (end - start));
    sprintf(buf,"start-end = %u\r\n", (end - start));
    SEND(buf);

Код: Выделить всё

Hello, world!
start-end = 100
Добавлено after 30 minutes 31 second:
Eddy_Em писал(а):что запилил себе блокирующий printf. И пока все данные в USART не уйдут, оно тупит...
Это неверно, ждем когда уйдет предыдущая строка.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: stm32 cubeide два инкремента не совместимы.

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4178724#p4178724"]32МГц, по чему 24Мгц? И максимум, вроде, этот чип тянет 56МГц.[/uquote]Хоть 200, только я больше документации доверяю.
СпойлерИзображение
f100rb.png
(68.64 КБ) 74 скачивания
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4178724#p4178724"]Это неверно, ждем когда уйдет предыдущая строка.[/uquote]
Ну и зачем? Буфер заполнил — и адью, пусть оно там само дальше как-нибудь…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

VladislavS, не важно
Спойлер

Код: Выделить всё

  SystemCoreClockUpdate();
  
  USART1->BRR = SystemCoreClock / 19200;
и переменную SystemCoreClock можно и вывести в терминал и в отладчике посмотреть
Eddy_Em писал(а):Ну и зачем? Буфер заполнил
это если есть куча оперативной памяти, а если нет?
Как выяснилось в другой теме, на мой экспериментальный код потребовался буфер в 3 кило, а рекомендовали 4 кило.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

Dimon456, что ты там с STM32 делаешь, что тебе оперативки не хватает?
Тебе нужно-то пару буферов отправки и пару буферов приема. Где-то по 64 байта вполне хватит.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Eddy_Em, вот код
Спойлер

Код: Выделить всё

void Send_str_USART1_DMA(const char *adr)
{
	while ((USART1->SR & USART_SR_TC) == 0) {};

  DMA1_Channel4->CCR &= ~DMA_CCR1_EN;

  DMA1_Channel4->CMAR = (uint32_t)adr;
  char *p = (char *)adr;
  while(*p) p++;
  DMA1_Channel4->CNDTR = p-adr;
  DMA1_Channel4->CCR |= DMA_CCR1_EN;
}

#define SEND(str) Send_str_USART1_DMA(str)
не имеет значения что мы будем отправлять
Спойлер

Код: Выделить всё

	SEND("\r\n STM32F100RB USART DMA-tx !!! 31");
	SEND("\r\n STM32F100RB USART DMA-tx !!! 32");
	SEND("\r\n STM32F100RB USART DMA-tx !!! 33");

Код: Выделить всё

    sprintf(buf,"start-end = %u\r\n", (end - start));
    SEND(buf);
пока эти чипы не умеют сдвигать буфер, только умеют обрабатывать половинку и полный.
В вашем буфере 64 байта, не хватит место всего на 1 байт (строка 65 символов) и будет тупое ожидание пока dma не отработает половинку или полный. И ни какого выигрыша не будет.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

Dimon456, пока DMA отправляет один буфер, ты заполняешь другой. Т.е. чтобы отправить второй буфер, тебе не придется ждать слишком долго.
Понятно, что если ты там "войну и мир" по USART гоняешь, будет медленно, но если у тебя нормальный протокол с короткими сообщениями, то отправка будет происходить прозрачно: забил буфер - отправил, забиваешь второй.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32 cubeide два инкремента не совместимы.

Сообщение tonyk »

Dimon456 писал(а):В вашем буфере 64 байта, не хватит место всего на 1 байт (строка 65 символов) и будет тупое ожидание пока dma не отработает половинку или полный. И ни какого выигрыша не будет.
Если тебе очень важна производительность операций ввода-вывода, а памяти нет, то отслеживай, сколько DMA отправил. Тогда тебе нужно будет дождаться отправки хотя бы одного байта из буфера, чтобы записать 65-ый, то есть, фактически, ты будешь заполнять буфер со скоростью отправки, причём писать новый байт на место уже отправленного. Только это безсмысленно, поскольку верно замечено, что если информация для передачи создаётся быстрее, чем отправляется, то либо ожидай освобождения передатчика (бездарно жги такты процессора), или буферируй (трать память как плату за свободу процессора). Других вариантов в природе не существует.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Буфера и такты процессора мы в другой теме считали, сегодня будем другое считать.

Добавлено after 2 hours 3 minutes 56 seconds:
Разочаровался я в iarе, сначала все так хорошо было
Спойлерiar

Код: Выделить всё

Hello, world!
start-end = 100
arm-gcc

Код: Выделить всё

Hello, world!
start-end = 169
а потом так паршиво
Спойлерiar

Код: Выделить всё

CMD >
PRINT=    0
start-end = 1929

CMD > start-end = 3208

CMD >
PRINT= 25478
start-end = 1763
arm-gcc

Код: Выделить всё

CMD >
PRINT=    0
start-end = 1374

CMD > start-end = 1813

CMD >
PRINT= 25478
start-end = 1491
Ну и размер кода
Спойлерiar

Код: Выделить всё

  7'222 bytes of readonly  code memory
    282 bytes of readonly  data memory
  2'361 bytes of readwrite data memory
arm-gcc

Код: Выделить всё

Program Size:
      text	   data	    bss	    dec	    hex	filename
      7278	    148	   1356	   8782	   224e	uart_f100_test.elf
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение GARMIN »

Ага, у IAR и библиотека printf наверняка с поддержкой флоат :)
Сравниваете тёплое и мягкое.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

GARMIN писал(а):у IAR и библиотека printf наверняка с поддержкой флоат
Ага, только стояло у меня printf и sscanf в SMALL. printf был убран из кода.
No specifier a, A, no specifier n, no float nor long long, without multibyte support.
Хотите посмотреть сколько весит без printf sprintf strcmp и sscanf?
Спойлерiar

Код: Выделить всё

  3'022 bytes of readonly  code memory
    166 bytes of readonly  data memory
  2'353 bytes of readwrite data memory
arm-gcc

Код: Выделить всё

Program Size:
      text	   data	    bss	    dec	    hex	filename
      2072	     44	   1340	   3456	    d80	uart_f100_test.elf
jcxz
Мудрый кот
Сообщения: 1725
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32 cubeide два инкремента не совместимы.

Сообщение jcxz »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4178895#p4178895"]Разочаровался я в iarе[/uquote]Думаю IAR этот как-нибудь переживёт. :)))
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32 cubeide два инкремента не совместимы.

Сообщение ivan dimir »

У меня вопрос коль не по теме.Можно ли использовать выводы порта которые не задействованные в ацп.В других целях.Как выход или вход.Или другую переферию включить .В Кубе наверное нельзя.А на регистрах?
Ответить

Вернуться в «ARM»