Заголовок сообщения: Помогите ужать програаму, немного не влезает в ATTiny13
Добавлено: Вт окт 07, 2014 20:26:40
Друг Кота
Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26 Сообщений: 4732 Откуда: Санкт-Петербург
Рейтинг сообщения:0
Мяяяяу Помогите ужать программу АмперВольтметра на ATTiny13. Буквально немного нехватает памяти. Индикация динамическая в прерывании таймера. В прерывании АЦП преобразования условных единиц в цифры на дисплее. Дисплей 4х2 семисегментный. До этого проект был только для вольтметра, памяти соответственно хватало.
кажется я вам уже советовал избавиться от формирования символов из чисел в обработчиках прерываний... тем более при помощи обращения к функциям. хотите помощи - слушайте советы.
P.S. возможно, я советовал и не вам - наредкость однотипные проблемы постоянно светятся... если что - заранее извините.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Можно еще без всяких переделок попробовать изменить уровень оптимизации на больший в настройках проекта. Правда, после этого программа бывает работает не так, как при стандартном уровне оптимизации. )
_________________ Fucking static initialization order fiasco
Заголовок сообщения: Re: Помогите ужать програаму, немного не влезает в ATTiny13
Добавлено: Ср окт 08, 2014 08:18:13
Друг Кота
Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26 Сообщений: 4732 Откуда: Санкт-Петербург
Рейтинг сообщения:0
AVR, вы советовали мне. Но я не понимаю чем это поможет? Ну перенесу я код из одного места в другое. Памяти от этого прибавится?
vdavid, спасибо попробую. adc массив только потому что это сгенерировал генератор кода. По этому поводу прошу не бить, понимаю что генератором пользоваться неприлично и все такое. Что бы вы еще оптимизировали? (это мне для общего развития)
ks0, компилятор говорит что РАМ, но увеличиваю рам чтобы все глобальные переменные влезли. Потом появляется окно в котором говорится что мы вылезли за пределы 512слов... что то порядка 546слов получалось. (В общем более одного килобайта)
Pink-Pank. Пишу в CVAVR, там и так по умолчанию максимум стоит.
На чистый асм переходить не хочется.
Вообще у меня приличный опыт программирования под комп. Микроконтроллеры конечно имеют свою специфику. Пока плохо ее понимаю. Можете что нибудь рекомендовать на эту тему? Книжечку, статью, советы... В комповых прогах массив по объему ничем не отличается от такого же количества переменных. В МК есть разница?
Последний раз редактировалось Gisteresis Ср окт 08, 2014 08:29:55, всего редактировалось 1 раз.
Заголовок сообщения: Re: Помогите ужать програаму, немного не влезает в ATTiny13
Добавлено: Ср окт 08, 2014 08:31:23
Друг Кота
Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26 Сообщений: 4732 Откуда: Санкт-Петербург
Рейтинг сообщения:0
Могу. Вечером сделаю. Цель проекта. Обычный ампер вольтметр. Но я как то проектов под Си не нашел, поэтому написал сам. Уже и плата готова. Тем более хотелось написать самому, чтобы получить опыт.
Вообще у меня приличный опыт программирования под комп.
Вот в этом и проблема. На микроконтроллере важно не что-бы код был красивый, а занимал мало памяти и быстро выполнялся.
Например temp = temp << 1; можно заменить на temp<<=1; или вот cDec += 1; ---> cDec++;
а лучше wr_reg(cDigit[cDec][1]); wr_reg(cDigit[cDec][0]); //wr_reg(~cSeg[cDec]); latch_reg(); cDec += 1; if( cDec > 7 ) cDec = 0; написать так (но это под сомнением) wr_reg(cDigit[cDec&0b111][1]); wr_reg(cDigit[cDec&0b111][0]); //wr_reg(~cSeg[cDec]); latch_reg();
cDigit[0][0] = ~cSeg[((ulVoltsSum/sCounterVSum/1000)%10)]; Я думаю эти строки и заняли всю память, к тому-же они дублируются, а не сделанны подпрограммой
_________________ Раз reset, два reset - полyчи на диске bad ! Тpанзистоp p-n-p. Plug-n-Play ? У кого что сбоит, тот о том и говорит.
Ещё бы не хватало памяти!!! Это деление всё и сжирает. Не интереснее ли вместо /10 написать *2560 и /256. Умножение разложить на степени двойки, а деление - отсечкой младшего байта? Кстати, сам компилятор это сделает, без потуг со стороны писателя.
Заголовок сообщения: Re: Помогите ужать програаму, немного не влезает в ATTiny13
Добавлено: Ср окт 08, 2014 09:25:55
Друг Кота
Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26 Сообщений: 4732 Откуда: Санкт-Петербург
Рейтинг сообщения:0
Функция wr_reg используется для записи в регистр 74HC595. Их на плате 2 штуки и используются для динамической индикации на семисегментниках. Первый выводит число, второй активирует декаду. Чтобы проще было декады активировать я создал структуру
cData не повредится - она локальная. Функции передается значение, а не ссылка на переменную.
latch_reg() - проще от этой функции вообще избавиться и кинуть ее код сразу в прерывание - больше нигде она не используется.
unsigned long ulVoltsSum = 0; char sCounterVSum = 0;
unsigned long ulAmpersSum = 0; char sCounterASum = 0;
adc_data[]
аналогично, volatile, либо засовываете их в само прерывание с модификатором static
Вывод на дисплей можно организовать несколько иначе. Можно цифры для вывода хранить в BCD формате (в два раза меньше места займут в ОЗУ), а преобразование их в нужный код индикатора делать непосредственно перед выводом. Получится довольно быстро и экономно.
Обнуление регистров периферии при инициализации также можно выкинуть - там и так нули будут при сбросе.
Pink-Pank Почему увеличило, вопрос понятный, но для меньшего "разуточнения" результата здесь важно соблюсти последовательность операций, т.е. сначала таки нужно умножить. Ведь толковый компилятор что должен сделать? Правильно, на этапе компиляции посчитать, что 5000/1024 = 4. Но мы ведь хотим умножить не на 4, а на 4.88. Не знаю, так ли поступил CV. (GCC так не делает, но ведь в дальнейшем могут допилить). Уменьшение же размера кода произошло главным образом не из-за цикла. Важнее переход к 16-ти битным операциям.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения