Как они у Вас описаны?
Если как "const char a=5;" - память под них все-равно выделяется - замените на "#define a 5" - сэкономите ОЗУ и флеш.
Если избавитесь от всех инициализированных не нулем переменных - сэкономите ~11 команд (~22 байт флеш) - тот самый цикл копирования инициализированных переменных из флеш в ОЗУ.
Если избавитесь от неинициализированных переменных - сэкономите на цикле обнуления - ~8 команд (16 байт флеш).
p.s. Естественно, речь о глобальных переменных.
Про чтение из флеш - если команда LPM, то как обычная команда - 2 байта, правда 3 такта. Что имеет смысл хранить во флеш, кроме строк?
Ага обычная команда, а загрузка адреса это еще пара команд на один байт. Либо прибавление к паре Z тоже пара команд.
Вас что то не поймешь, получается по вашим словам, что все таки меньше места занимает чтение из флеш одна команда против 11. Я так полагаю там не одна команда.
Загрузка адреса - само собой. Я - не сторонник чего-то определенного из вышесказанного, просто дал мысли - что иногда можно соптимизировать. Экономим ОЗУ - не создаем констант-переменных (дико звучит), используем локальные переменные, и т.д... есть много способов.
Предлагая убрать все константы-переменные и инициализированные переменные (не нулем) - и тем самым сэкономить память программ флеш (на 11 команд) - я вовсе не предлагал читать их из флеш.
p.s.
____Eugene____ писал(а):почему условие выполняется при pack=-100 и др отрицательных
volatile char pack=-100 ;
потому что в другом месте программы его что-то меняет на положительное или, Вы, например, приказали компилятору char считать беззнаковым.
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
#define _SFR_IO16(io_addr) ((io_addr) + __SFR_OFFSET)
макросы одинаковые но я полагаю выполняются по разному ?
если изминить макрос вот так
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
В
#define _SFR_IO128(io_addr) ((io_addr) + __SFR_OFFSET)
он перестает работать?
a_skr писал(а):я вовсе не предлагал читать их из флеш.
Хе а откуда же тогда вы их прочитаете из космоса? Все равно из флешь, только в виде команды загрузки константы. Далее если таких констант много неужели это будет занимать меньше места, чем упомянутые вами 11 команд?
Кстати использование глобальных переменных как раз немного сокращает размер кода в ущерб оперативке. Утверждение проверено насчет размера.
макросы одинаковые но я полагаю выполняются по разному ?
Один для доступа к 8 битной ячейке, второй для 16. А изменять не имеет смысла.
a_skr писал(а):я вовсе не предлагал читать их из флеш.
Хе а откуда же тогда вы их прочитаете из космоса? Все равно из флешь, только в виде команды загрузки константы. Далее если таких констант много неужели это будет занимать меньше места, чем упомянутые вами 11 команд?
1. Да, из флеш в виде команд загрузки констант, что занимает меньше места и выполняется быстрее загрузки значений из переменных-констант в ОЗУ. 2. Нет, не меньше 11 команд. Про 11 команд смысл такой "избавьтесь от всех инициализированных не нулем глобальных переменных - и выиграйте хоть 22 байта в памяти программ".
vitalik_1984 писал(а):Кстати использование глобальных переменных как раз немного сокращает размер кода в ущерб оперативке. Утверждение проверено насчет размера.
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
^^^^^^^^ ^^^^^^^^^^^^
это тоже макрос это тоже define
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Я не про константы-переменные говорил, а про переменные.Хотя сейчас еще раз попробовал произвольный код вроде наоборот.
Видать от ситуации зависит я еще помню удивился - все советуют избавляться от глобальных переменных, а код меньше вышел.
Прошу прощения за ошибку.
Вот такой есть пример: ничем вроде от вашего способа не отличается по размеру:
Спойлер
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
^^^^^^^^ ^^^^^^^^^^^^
это тоже макрос это тоже define
Это не макрос, а объявление макроса
Я как то раз пробовал - по сути получается оба эти макроса указывают на одну и ту же ячейку памяти.
Как например для мега 8 прописано
vitalik_1984 писал(а):Это не макрос, а объявление макроса
Ой, ну да, да. И на старуху бывает проруха.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
alex1126 писал(а):Потом выяснилось что второй вариант занимает больше кода чем первый
На сколько? Каким компилятором пользовались? Версия компилятора? Опции оптимизации?
На своём простеньком примере погонял - при одинаковых опциях оптимизации всё одинаково для
do {} while(1);
while(1) {};
for(;;) {};
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
А чем продиктован выбор опции -O3 ? Или места во флэше пока хватает?
Обычно -Os применяют.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Доброй ночи!
Сломал когти о EEPROM... В файле Port.c пытаюсь "завести" переменную в EEPROM, и чтой то не получается (компилятором выдается ошибка, но что конкретно, почему то не пишет...). Подобная ситуация в основном файле делается успешно.... Голова уже не соображает... Вот кусочек из Port.c: