2 Dimon456. Сразу определимся. Цель? Потому что я тебя ловил на том, что я выкладывал свои примеры, и ты нелицеприятно отзывался. Тема топика оптимизация. И я следую этой теме. Как бы мне параллельно, что ты скажешь. Это дело целесообразности, какую реализацию делать.
я никогда не пользовался библиотечным print. Ты этого ответа ждал? Да, не пользовался. Потому что они жрут ресурсы МК. Один раз попробовал, мне не понравился выхлоп. На этом мои эксперименты закончились. И так как я программирую только AVR, дальше что?
Вообще с часами я мало работал. Не нужно было. Я проекты делал практически всегда на продажу. Для себя мало что делал. Потому с часами так и получилось. Глянул один свой проект с часами. Хм, дело было так. Так как с часами практически не работал, часть с часами писал, чтобы заработало. Не оптимизировал. Нужно посидеть, урезать проект, оставить только часы. Жди. Несколько дней. Сильно занят.
Добавлено after 2 minutes 9 seconds: Даю что есть, как есть.
Ну, для часов то printf как бы и не нужен Три-пять чисел можно и "вручную" вывести. Разложить число на разряды можно либо самописно, либо через библиотечную ф-цию itoa()
По оптимизации: надо было быстро простенький проект составить (чтение из ацп, небольшая обработка измерения и реакция на него. и так 2 абсолютно одинаковых независимых процесса, каждый берёт со своего входа и выводит в свой вывод) логично написать функцию, но т.к. при обработке использьвались накопительные буфера - понадобилось использовать указатели, чтоб каждая задача работала со своим буфером... чтото у меня не пошло = компилятор выдал ошибку, разбираться было некогда, да и место позволяло... запихнул тело функции в дефайн и вызвал его 2 раза, для каждого процесса по разу... Потом, когда позволило время, решил разобраться и написать как хотел (причиной ошибки оказалось отсутствие скобок) обнаружил, что прошивка с дефайнами оказалась короче, чем с функциями... П.С.: среда кодевижен, оптимизация по размеру. думаю, что в варианте с дефайнами компилятор понял, что код повторяется и сам оптимально вынес его в функцию.
У меня в том проекте было сделано так: даты были не нужны, только время. При включении устройства считывается rtc. Дальше я опрашивал секундный вывод rtc. Чтобы не возиться, я сделал так: значения часов минут и секунд было в hex. Отсюда преобразование. Деталей, если честно не помню. Может быть, позже сяду, проанализирую. Но print точно не буду использовать. Время print наступит позднее. Когда будут более жирные проекты и МК. А может уже и не наступит, учитывая текущие политические обстоятельства. Я уже два или три года не занимаюсь проектами на МК.
Что то кучеряво как то в твоём примере... Это как бы не критика, пока. Я уже очень давно не садился за проекты. Попробую вечерами посидеть, вспомнить что да как.
Функция преобразует число в диапазоне 0..99 в 2 символа в строке. leadingSpace - выбор - впереди пробел или ноль для чисел меньше 10.
И да, если вычисление остатка нигде больше не используется - value % 10 даст большой оврхед, поэтому остаток считаем как указано выше. На мегах с аппаратным умножителем даёт экономию кода.
Dimon456, ну тут вопрос - шашечки или ехать. Вынести весь вывод на дисплей в отдельный файл - а там всё рядышком. Редактировать же, насколько я понял - уже нечего. Надо затолкать 9.5 кб кода в 8 кб МК. тут уже все средства хороши. И жертвовать придется и красотой кода.
(я вот сейчас глянул в папку с проектами и понял, что в своих поделиях на МК я ни разу не пользовался библиотечным форматным выводом. Только ручками, только хардкор. И форматный вывод тоже ручками. И свой вариант itoa, заточенный на размерности данных в каждом случае)
Ну если это так принципиально - сколько строк исходника... Редактировать ничего не надо: отлаженная и оттестированная процедура будет "вечной" . А вот если в результате вместо нескольких байт применение itoa даст "кучу кода" - это, по-моему, существенней.
Ребят, вы чего, часы никогда не делали, штоль? Ну либо на Сях комбинации /10 и %10, либо на асме процедура bin-to-BCD с поразрядным распаковыванием, коль уж не нравится библиотечные itoa. А когда sprintf используете, просто закидываете в параметры переменные часов, минут, секунд, даты, месяца, года, как они есть, а перед ними пишите форматирующую строку. Названия дней недели или месяц текстом можно вывести отдельно через табличку (массив текстовых строк), когда номер дня недели или месяца является индексом в табличке, а в массиве строк прописаны текстом названия).
Давайте все посмотрим на задачу с точки зрения целесообразности. Конечно, и тут могут быть варианты, типа, что мы понимаем под целесообразностью.
Начнем с того, что мы имеем на руках МК AVR. Опять же. Какой, точнее, что у него на борту. Либо у нас на руках, скажем ATMEGA8. Это один разговор. Если от, скажем, ATMEGA32 и выше. Это уже другой разговор.
Если у нас на руках МК типа ATMEGA128 или 256. Тут уже целесообразнее писать "красиво". И можно уже вовсю использовать библиотеки. Здесь работает скорость написания проекта. Пусть неоптимально по выхлопу, но быстрее "писать".
Если же у нас поджимает объем SRAM либо FLASH, тут уже начинается оптимизация. И отказ от библиотек. И утаптывание кода по выхлопу. Красивость кода тут не работает. От слова совсем.
Работа со временем, то бишь, чтобы МК обеспечивал нужный функционал это уже совсем другой разговор.
Тут просили пример кода. Здесь нужно смотреть "сверху". Хотим оптимально? Забудем о красивости кода. И начнем дербанить "красивые", в одну строку, куски кода.
К примеру. Нам нужно вывести время. Пусть формат типа: 12:03:43 03/07/2022.
Делаем во Flash строку-шаблон. Пробел, пробел, двоеточие, пробел, пробел, двоеточие, пробел, пробел, пробел, пробел, пробел, слеш, пробел, пробел, слеш, пробел, пробел. Что мы этим получили. Вывели шаблон. Быстро. Потом выводим время и дату в соответствии со знакоместами. Быстро. Кратко. Это простой пример. Да, некрасиво, не "в одну строку". Но оптимально. И по скорости и по выхлопу.
Последний раз редактировалось Demiurg Пн апр 11, 2022 18:31:29, всего редактировалось 1 раз.
Эммм... я тут чето потерял нить темы. Если не ошибасю, вначале у топикстартера была проблема с тем, что нужна была единая функция ввода чисел, так? Так вот, это реализуется одной единственной функцией, в которую передается указатель на изменяемую переменную, а кнопки просто инкрементируют или декрементируют эту переменную по указателю. Назначения функций кнопок выбираются через таблицу указателей на функции в соответствии с текущим режимом менюшки.
Я в топике привел пример. В том примере у меня секунды, минуты, часы и так далее это отдельные участки памяти в соответствии с размерностью. То есть, до годов это байты. Год это уже два байта. При включении устройства считывается rtc и данные распаковывается по участкам памяти. Дальше я работаю с ними как с обычными шестнадцатеричными числами. Вот годы посложнее. Заманаешься инкремент и декремент производить. Тут уже поразрядно. Опять же. Можно и все поразрядно. Но, все равно перевод в шестнадцатеричные числа. У меня сейчас график жёсткий. Попробую в ближайшие дни урезать проект, оставить только часы и выложить свой пример.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения