Добавлено after 12 minutes 32 seconds:
CCSTEP показывает 256701 тактов.AVI-crak писал(а):300к тактов на строку текста
CCSTEP показывает 256701 тактов.AVI-crak писал(а):300к тактов на строку текста
Код: Выделить всё
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;Если мысленно умножить это значение на 2, то можно предположить, что у него скорость в 2 раза меньше. Т.е. = 9600VladislavS писал(а):Физически передаётся 17500 тактов. Где остальное, Зин?
Код: Выделить всё
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Код: Выделить всё
Hello, world!
start-end = 192565Учитывая что тип auto в С нету, и по чему sprintf, а не printf?VladislavS писал(а):На Cortex-M4 от start до end2 выполняется:
Код: Выделить всё
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Это неверно, ждем когда уйдет предыдущая строка.Eddy_Em писал(а):что запилил себе блокирующий printf. И пока все данные в USART не уйдут, оно тупит...
Код: Выделить всё
SystemCoreClockUpdate();
USART1->BRR = SystemCoreClock / 19200;это если есть куча оперативной памяти, а если нет?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);Если тебе очень важна производительность операций ввода-вывода, а памяти нет, то отслеживай, сколько DMA отправил. Тогда тебе нужно будет дождаться отправки хотя бы одного байта из буфера, чтобы записать 65-ый, то есть, фактически, ты будешь заполнять буфер со скоростью отправки, причём писать новый байт на место уже отправленного. Только это безсмысленно, поскольку верно замечено, что если информация для передачи создаётся быстрее, чем отправляется, то либо ожидай освобождения передатчика (бездарно жги такты процессора), или буферируй (трать память как плату за свободу процессора). Других вариантов в природе не существует.Dimon456 писал(а):В вашем буфере 64 байта, не хватит место всего на 1 байт (строка 65 символов) и будет тупое ожидание пока dma не отработает половинку или полный. И ни какого выигрыша не будет.
Код: Выделить всё
Hello, world!
start-end = 100Код: Выделить всё
Hello, world!
start-end = 169Код: Выделить всё
CMD >
PRINT= 0
start-end = 1929
CMD > start-end = 3208
CMD >
PRINT= 25478
start-end = 1763
Код: Выделить всё
CMD >
PRINT= 0
start-end = 1374
CMD > start-end = 1813
CMD >
PRINT= 25478
start-end = 1491
Код: Выделить всё
7'222 bytes of readonly code memory
282 bytes of readonly data memory
2'361 bytes of readwrite data memoryКод: Выделить всё
Program Size:
text data bss dec hex filename
7278 148 1356 8782 224e uart_f100_test.elfАга, только стояло у меня printf и sscanf в SMALL. printf был убран из кода.GARMIN писал(а):у IAR и библиотека printf наверняка с поддержкой флоат
Хотите посмотреть сколько весит без printf sprintf strcmp и sscanf?No specifier a, A, no specifier n, no float nor long long, without multibyte support.
Код: Выделить всё
3'022 bytes of readonly code memory
166 bytes of readonly data memory
2'353 bytes of readwrite data memoryКод: Выделить всё
Program Size:
text data bss dec hex filename
2072 44 1340 3456 d80 uart_f100_test.elf