Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367

Оптимизация кода по скорости (K1986BE92QI Keil)

27.03.2023, 21:34. Показов 2131. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для тех кому лениво читать: посоветуйте что почитать по оптимизации кода в плане скорости.
Для тех кому не лениво читать:
Есть К1986ВЕ92QI и Keil. Вывожу информацию на экран по SPI. Экран имеет более 2 миллионов точек. 2бита на пиксель, итого около 650килобайт данных. Сначала я формирую картинку в памяти (в масштабе 1/4), потом, непосредственно перед отправкой увеличиваю ее и отправляю в экран. Так как пиксели у меня имеют координаты физические на экране, а данные хранятся в ввиде массива, то мне приходится очень много преобразовывать абсолютные координаты пикселей в номер байта и номер бита в байте, то есть постоянные деления на 8 и определение остатка отделения на восемь.

И захотелось мне максимально ускорить весь этот процесс. Уменьшил частоту процессора (что б было более заметен результат оптимизации) и погнал оптимизировать.

Вот такая замена кода очень сильно уменьшила время работы:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void SendWord(uint8_t b){
    uint16_t _b=0;
 
    for (int i=0;i<8;i++) {
        _b=_b<<2;
        if (b&0x01) _b|=0x03;
        b=b>>1;
    }
 
    SPI_Send_Word(_b);
}
 
void SendWord(uint8_t b){
    uint16_t _b=0;
 
    if(b&0x80) _b=0x0003;
    if(b&0x40) _b|=0x000C;
    if(b&0x20) _b|=0x0030;
    if(b&0x10) _b|=0x00C0;
    if(b&0x08) _b|=0x0300;
    if(b&0x04) _b|=0x0C00;
    if(b&0x02) _b|=0x3000;
    if(b&0x01) _b|=0xC000;
 
    SPI_Send_Word(_b);
}
А вот замена деления на 8 на сдвиг вообще ничего не дало. Остаток от деления на восемь так же оказался равен по времени работы битовому сложению с 0x07. Замена всех возможных переменных на int так же не уменьшала время работы. Почему? Оптимизация отключена (-O0). Причем размер прошивки меняется, размер используемого стека так же меняется. Почему время работы остается таким же? Или там такая незначительная разница? Или компилятор без всякой оптимизации умеет заменять деление на 8 на сдвиг? Вроде операция деления это очень тяжелая операция, проворачивается она в цикле более двухмиллионов раз, столько же вычисление остатка отделения....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2023, 21:34
Ответы с готовыми решениями:

Оптимизация скорости кода
a=2 b=3 c=5 d=50 your=int(input(&quot;Введите ваш баланс:&quot;)) def proga(x): for i in range(0,x+1): for w in range(0,x+1): ...

Оптимизация кода по скорости
Всем добрый день. Помогите ускорить выполнения кода. using System; using System.ComponentModel.DataAnnotations; using static...

Оптимизация скорости кода
Необходимо(дать совет по оптимизации) оптимизировать код, чтоб меньше времени занимало на обработку данных. Подробнее о задаче можно...

25
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
07.04.2023, 00:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А как же флаги TNF / TFE (что-то сомнительно чтобы они буди просто инверсией друг друга)?
это не совсем инверсия. TNF говорит что буфер не заполнен. То есть там что то может быть, но туда можно положить еще. А TFE говорит что буфер пуст. Но дело в том что то что буфер пуст это не означает что байт отправлен. Буфер становится пустым когда последний байт копируется в сдвиговый регистр для отправки, то есть буфер пуст, но байт не отправлен еще, или отправляется... а может и отправлен
0
 Аватар для COKPOWEHEU
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,055
07.04.2023, 07:15
Что там в K1986BE92QI не знаю. Но, скажем, в stm32f103 есть флаги TBE и BSY. Первый означает, что буфер пуст, и можно класть следующий байт, а вот второй как раз что байт окончательно передан, и SPI можно выключать.
Вариант с двумя флагами пуст - не пуст мне кажется странным. Но извращения разные бывают.
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 885
07.04.2023, 11:23
А можно поподробнее в чём затык по скорости?
Вот например - вы хотите быстрее передавать, а что мешает ? что формирует паузы при передаче?
Или у вас уже непрерывный поток данных от МК к дисплею? и дальше только частоты повышать ?
или у вас именно софт не поспевает подготавливать данные?
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
07.04.2023, 18:25  [ТС]
там нет как такового затыка по скорости Уже нет. Экран полностью обновляется за 1.239сек (это вместе с передачей данных). просто там много математики при отправке данных и я это все хотел по максимуму соптимизировать.
0
 Аватар для COKPOWEHEU
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,055
07.04.2023, 20:58
Главный вопрос устраивает ли вас то, чего вы достигли.
Если устраивает, то дальнейшими оптимизациями стоит заниматься разве что из любопытства, если нет более срочных или интересных задач. Ну а если нет, то искать узкие места.
Цитата Сообщение от Alex1126 Посмотреть сообщение
просто там много математики при отправке данных
Это в смысле раскукоживание 8-битного значения на 16-битное? Вам подсказали максимально быстрый способ - табличный, он за пару тактов работать должен. Этот способ помог?
Цитата Сообщение от Alex1126 Посмотреть сообщение
Экран полностью обновляется за 1.239сек
А предельную скорость, без пересчета, не проверили?
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
07.04.2023, 21:16  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Главный вопрос устраивает ли вас то, чего вы достигли.
Если устраивает, то дальнейшими оптимизациями стоит заниматься разве что из любопытства, если нет более срочных или интересных задач. Ну а если нет, то искать узкие места.
это понятно. Я почти уже все перелопатил. Теперь иногда на перекуре поглядываю фоном.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это в смысле раскукоживание 8-битного значения на 16-битное?
да не только
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вам подсказали максимально быстрый способ - табличный, он за пару тактов работать должен. Этот способ помог?
да, бесусловно.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А предельную скорость, без пересчета, не проверили?
ну я не то что бы не проверял Она у меня и так показывается, когда идет первая очистка экрана - там без всякой математики льются единицы. Скорость не намного меньше. Хотя в процентах наверно все же ощутимо, надо будет посчитать завтра, так на вскидку не помню.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2023, 21:16

Оптимизация кода по скорости работы
Условия задачи: Набор в армию (тема: Дерево отрезков). Роберт Баратеон понимает, что войны с Таргариенами не избежать. Но сейчас зима,...

Оптимизация кода для повышения скорости выполнения?
Есть ли какая возможность в VBA замера производительности как в 1С с указанием относительного времени исполнения отдельных строк кода, что...

Поиск Пифагоровых троек: оптимизация кода по скорости
Помогите усовершенствовать код, чтобы он выполнялся быстрее. Если вкратце, то тут идёт поиск Пифагоровых троек. #include...

Оптимизация кода проверки скорости загрузки страниц
Всем привет. Написал программу, и возникли проблемы со скоростью ее работы. Основная суть программы мы получаем массив ссылок и...

Нужен совет: оптимизация кода, увеличение скорости работы скрипта
Всем привет. Имеется код выводящий из массива названия регионов РФ с указанием буквы. Получается что-то вроде такого: А ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru