0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 27
|
||||||
1 | ||||||
Как оптимизировать код СИ? atmega823.05.2023, 18:14. Показов 478. Ответов 15
Здравствуйте, проблема такая. Пишу код для микроконтроллера для блока вынужденных колебаний. Столкнулся с проблемой переполнение памяти, причину не могу найти. Значит в функции control_outlet2, если заменить переменную value_frequency на любое целое число, то выходной hex файл разгружается аж на 5кб, и загружается естественно если эту переменную оставить, что критично в ситуации прошивки данного микроконтроллера. Вот кусок кода, проблемная функция и главный обработчик событий.
![]()
0
|
|
23.05.2023, 18:14 | |
Ответы с готовыми решениями:
15
Как можно оптимизировать код? Код считывает кол-во скобок Как можно максимально оптимизировать данный код через логическое индексирование? Код полностью работает Как оптимизировать код Как оптимизировать код? |
429 / 307 / 125
Регистрация: 18.07.2017
Сообщений: 1,407
|
|
23.05.2023, 19:26 | 2 |
На сколько я помню, в avr нет аппаратной поддержки чисел с плавающей точкой. Поэтому приходится считать все это софтварно. Собственно, эти 4 кб, скорее всего? как раз и есть код для работы с double.
1
|
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 27
|
|
24.05.2023, 16:47 [ТС] | 4 |
Так и сделал, перевел все вычисления к миллисекундам. Пока не написал на форум додуматься не смог до этого
![]() Вот это интересно конечно, не знал. И что интересно (как начинающему) ему просто не нравится что ты пишешь ему с точками, но кода он сам вычисляет ведь в его вычислениях тоже эти точки присутствуют, но памяти меньше при этом схавал.
0
|
assemberist
|
24.05.2023, 17:03
#6
|
0
|
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 27
|
|
24.05.2023, 17:14 [ТС] | 7 |
Неа, у меня функции управления дисплеем, кнопки, таймеры, прерывания, работа с еепром, и вот основное вычисление, до него hex файл 4 кб весил.
Добавлено через 8 минут Надо покурить эту информацию в инете, раз микроконтроллерами занялся. Мне просто на данный момент понадобилось заделать проектик для производства (чисто в своих интересах), там платка блок вынужденных колебаний, раскорячена на каких то микрухах, здоровая, старая, и уже не поставляется, думаю какая нить микруха выйдет погулять и не найдешь. А на атмеге все компактно и заменить можно все компоненты, ну и современно как то ![]()
0
|
429 / 307 / 125
Регистрация: 18.07.2017
Сообщений: 1,407
|
|
24.05.2023, 18:50 | 8 |
1
|
73 / 24 / 6
Регистрация: 26.11.2022
Сообщений: 178
|
|||||||||||
25.05.2023, 00:23 | 10 | ||||||||||
судя по тому что в коде присутствует
нельзя так писать систему управления чем - либо
0
|
3575 / 2243 / 406
Регистрация: 09.09.2017
Сообщений: 9,392
|
|
25.05.2023, 02:20 | 11 |
Это элементарно проверяется просмотром дизассемблерного листинга. Если включена отладочная информация (а она по умолчанию включена), то строчку Си-шного кода можно найти просто поиском. А дальше смотрите много ли ассемблерных инструкций она занимает. Особое внимание, естественно, всяким call, rcall и т.п.
А на счет "внутри с точкой" тоже будьте осторожны. Если в формуле вы не задали ни одного дробного числа, то и расчет будет целочисленным: 1/2 == 0 . Плюс те расчеты, которые компилятор может провести на этапе компиляции, он сразу и проведет, а в код подставит только число-результат.Направление правильное, но "недожали". В том смысле что AVR тоже устарели, лучше уже осваивать ARM или RISC-V. stm32, gd32, ch32 и т.п. Но с ними свои проблемы. Во-первых, довольно неприятные корпуса с шагом 0.5 мм. Гораздо труднее изготовить плату и потом запаять. Есть, конечно, костыль в виде готовых плат-переходников вроде blue-pill, black-pill, longan nano и подобных. Во-вторых, гораздо более сложная начинка. Там, где в AVR достаточно выставить пяток битов в трех регистрах, тут придется изучать пару десятков регистров. Из них нужно те же три, но поначалу решительно непонятно какие именно. В общем, документации изучать придется на порядок больше. Опять же есть костыль в виде ST-cube, но и на нем без знаний далеко не уедешь. А если знания есть - сам Куб начинает мешать. Уж больно поганый код он генерирует.
1
|
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 27
|
|
25.05.2023, 11:27 [ТС] | 12 |
Вы имеете ввиду как то таймерами это организовать? Но у меня проблема не с постоянными ожиданиями (пока что по крайней мере), даже если убрать этот код и просто оставить где присваивается переменная с вычислениями, то память так же остается загруженной.
Действительно есть такое теперь. А я опять сидел думал что опять не так работает почему то. Вы меня заинтересовали сильно что есть еще и arm какой-то. Ну после 20 минутного гугления, в голову пришла мысль что я ведь не адронный коллайдер программирую, мне бы просто помигать парочкой транзисторов грамотно. Я с avr то элементарные вещи пока не могу понять. То есть круто бы было разбираться в в технологиях помощнее, но кажется что для моих задач это лишнее. А задача у меня такая: Есть 6 параметров - впуск1, выпуск1, пауза, впуск2, выпуск2, цикл. Первые 5 параметров задаются значениями от 1 до 99, это процент от всего времени на котором они заканчиваются. Цикл задается тоже от 1 до 99, но здесь это уже шкала, где 1 это 0,4 гц, а где 99 это 4 гц.. то есть это и есть то самое "все время". Вот и всё, не думаю что для этой задачи нужны мощные вычислительные процессы.
0
|
73 / 24 / 6
Регистрация: 26.11.2022
Сообщений: 178
|
|
25.05.2023, 12:32 | 13 |
Если программа не влезает в память контроллера - делайте дизассемблерный листинг и смотрите что больше всего занимает места. При этом не надо знать ассемблер так как при наличии отладочной информации вы увидите просто сколько строк занимает какая функция. так же не забывайте что у вас может быть мёртвый код из библиотек, или какие-нибудь ненужные данные типа шрифтов для ЖК
Судя по вашему описанию вам арифметика с плавающей точкой вообще не нужна и можно обойтись целочисленной. Для начала аккуратно аналитически упростите математичесие выражения - как показал assemberist но для применяемого результата, которые вы будете вставлять в условие проверки или в таймер использование delay в главном цикле идея прохая поскольку в этом же цикле вы проверяете вышло ли время для подачи сигнала. Главный цикл не должен содержать никаких задержек.
0
|
3575 / 2243 / 406
Регистрация: 09.09.2017
Сообщений: 9,392
|
|
25.05.2023, 12:35 | 14 |
Скорее, конечным автоматом или вообще RTOS. Если не сталкивались с подобным, лучше с конечного автомата начать.
ARM это общее название кучи ядер. На нем основаны упомянутые stm32, gd32f и прочие. А еще, например, RaspberryPi. А еще, к примеру, Apple M1, но это уже совсем другой уровень. И RISC-V это тоже ядро, и на нем тоже делают как контроллеры (gd32vf, ch32), так и процессоры. Не сомневаюсь. Наверняка современные 32-битные контроллеры для вас избыточны. Но именно эта область сейчас развивается, так что если хотите продолжать заниматься контроллерами, так или иначе придется их изучать. Плюс они бывают даже дешевле 8-биток. Впрочем, если задача разовая, и сама эта тема вам не слишком интересна, никто не запрещает и на AVR оставаться.
0
|
429 / 307 / 125
Регистрация: 18.07.2017
Сообщений: 1,407
|
|
25.05.2023, 12:52 | 15 |
Да, не считать подошло ли время, а просто таймер завести, а
void control_outlet2(); оформить как прерывание таймера.Ну и плюсом можно высчитать задержки _delay_ms(10); и также организовать их через использование таймера (в atmega8 их 3).Это поможет косвенно, потому что прямая работа с таймерами экономит больше памяти: Что там нужно? 1) Включить прерывание таймера по достижению значения. По сути запись 1-го байта в регистр. 2) Настроить режим работы таймера и предделитель Тоже самое. Чтобы отмерять время. 3) Выставить текущее значение таймера 4) Загрузить время, которое должен отмерять таймер, 5) Включить сам таймер 6) забыть про него и идти заниматься другими делами. Когда таймер досчитает до загруженного значения он дернет прерывание. 7) Выполняем нужные действия 8) Если таймер больше не нужен останавливаем. А можно и не делать, тогда он будет отрабатывать с заданной частотой. 9) выходим из прерывания Возможно что-то забыл, последний раз году в 18-м занимался, а даташит листать лень, но не суть. За исключением 6-7 шагов Каждая операция занимает 2-8 байт ибо это обычное выставление значений в 1-2 регистрах. Но придется посидеть над даташитом. Ососбенно если раньше подобным не занимался.
0
|
429 / 307 / 125
Регистрация: 18.07.2017
Сообщений: 1,407
|
|
25.05.2023, 23:44 | 16 |
Кстати, есть програмка avr wizard. Она генерит оптимальный инициализирующий код и функции прерываний. Мало того, так еще и комментарии пишет. С ней таймер тактование и вся остальная переферия настраиваются за 5 минут. Но даташит все-равно почитать придется чтобы понять что включаешь-выключаешь.
0
|
25.05.2023, 23:44 | |
Помогаю со студенческими работами здесь
16
Как оптимизировать код? Как оптимизировать код? как оптимизировать код? Как оптимизировать код Как оптимизировать код? Как оптимизировать код ?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |