Оптимизация Кода

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

smacorp писал(а): Как и Энштейн с его теорией вероятностей. :)
Ну да, а Блез Паскаль занимался теорией относительности. Думаю, оба они удивились бы, что их пере-специализировали. Особенно Энштейн :)
Изображение
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3492
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Сообщение smacorp »

Jack_A писал(а):Особенно Энштейн
Это да, это я в спешке сильно оговорился. :oops: Но сути заблуждений товарища ozonn это не меняет. :)
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Действительно - убираешь функции random -памяти сразу хватает. Вывод, нужно найти генератор ПСЧ на асе. Ни у кого случаем такого не завалялось? :oops: :roll:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sTRog писал(а):Действительно - убираешь функции random -памяти сразу хватает. Вывод, нужно найти генератор ПСЧ на асе. Ни у кого случаем такого не завалялось? :oops: :roll:
вывод только один: думать 7 раз, а потом делать 1 раз. вот смотрите, что из вашего кода сделал я:
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>

#define T_POLL 136
#define TRANS	_BV(2)
#define LED_G	_BV(3)
#define LED_R	_BV(4)
#define BTN		_BV(1)

char mod = 0;
volatile uint8_t i;
volatile uint16_t Sec;
int rantime;

ISR(TIM0_OVF_vect){
   TCNT0 = T_POLL;
   i++;

   if (i>=10) //period 1s
   {
      Sec++;
     i=0;
   }
}

static void pulce(void){
	   PORTB |= TRANS;
	   _delay_ms(1);
	   PORTB &= ~TRANS;
}

static void pulce_led(void){
	 PORTB |= LED_G;
	 _delay_ms(10);
	 PORTB &= ~LED_G;
}

static void sequence(void){
   pulce();
   _delay_ms(10);
   pulce();
   _delay_ms(500);
   pulce();
   _delay_ms(10);
   pulce();
   Sec = 0;
}

int main(void){

   PRR = (1<<PRADC); // shut down ADC

   TIMSK0 = (1<<TOIE0);  // timer0 overflow interrupt enable
   TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024

   sei();


   DDRB = TRANS | LED_G | LED_R; //транзистор

   rantime = 3600 + random() % 3600;

	while (1){
	   if (mod==0){
		   if (Sec>=5400){
			   sequence();
		   }
	   }

	   if (mod==1){
		   if (Sec>=rantime){
			   sequence();
			   rantime = 3600 + random()%3600;
		   }
	   }

	   if (PINB & BTN){
		   cli();
		   Sec = 0;
		   if (mod==0){
			   mod = 1;
			   pulce_led();
		  } else {
			  mod = 0;
			  pulce_led();
			  _delay_ms(100);
			  pulce_led();
		  }
		   _delay_ms(1000);
		   sei();
	   }
	}
}
по-моему, функционал сохранен на 100%, но объем памяти код при этом всего 930 байт занимает против вашего варианта в 1060 байт или сколько там было... при этом не потребовалось заменять random()

всех делов-то - подумать над ОПТИМИЗАЦИЕЙ кода. кстати, все, что я сделал, вам советовали ранее, просто я не поленился этим советам последовать...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Спасибо дядя AVR. Буду разбираться, что и как можно было сделать лучше.
Реклама
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

ARV писал(а):
ozonn писал(а):именно в непредсказуемые моменты
для работающей программы в МК непредсказуемые моменты могут возникать ТОЛЬКО по внешним событиям - я писал про прерывания. любые ВНУТРЕННИЕ события будут однозначно предсказуемыми.

то есть ваш подход сработает для "электронного кубика" или "однорукого бандита". но устройство, генерирующее текст, выбирая слова из массива по "случайному" индексу, будет генерировать всегда одинаковую последовательность фраз, т.е. однозначно предсказуемо.
разумеется событие внешнее. это само собой разумеется

Добавлено after 4 minutes 28 seconds:
smacorp писал(а):
Jack_A писал(а):Особенно Энштейн
Это да, это я в спешке сильно оговорился. :oops: Но сути заблуждений товарища ozonn это не меняет. :)
товарищь smacorp, я не могу понять, в чем вы меня пытаетесь убедить? В том, что выборка чисел из монотонного ряда чисел, основанная на случайном событии будет не случайной? :))

ну так докажите обратное, размажте меня по стене :))
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):разумеется событие внешнее. это само собой разумеется
это не разумеется само собой, т.к. речь в теме идет о программной генерации случайных чисел, а у вас фактически используется внешний генератор случайных чисел, а не внутренний.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

ARV писал(а):
ozonn писал(а):разумеется событие внешнее. это само собой разумеется
это не разумеется само собой, т.к. речь в теме идет о программной генерации случайных чисел, а у вас фактически используется внешний генератор случайных чисел, а не внутренний.
внутренних генераторов случайных чисел в природе не существует. Вы в этой теме ведете речь о том чего нет. За сим откланиваюсь :)
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Возник вроде только один вопрос, AVR

Как одной и той же командой ножки присваиваются значения - работать на выход и на вход?
#define LED_R _BV(4)
#define BTN _BV(1)
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Никак. Это только макроомрпделение номера ножки, само по себе оно ничего не далает.
Запишете DDRB |= LED_R; будет выход, запишете DDRB &=~ BTN; будет вход
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):внутренних генераторов случайных чисел в природе не существует.
существуют. но раз вы уже откланялись - с тем и оставайтесь :)
да и речь шла о другом, а именно о генераторе псевдослучайной последовательности... но где вам снисходить до реалий...
COKPOWEHEU писал(а):запишете DDRB &=~ BTN; будет вход
только в случае, если вывод всегда сохраняет свою функцию входа, делать вот этого DDRB &=~ BTN; вообще не надо (как я и поступил в своем варианте кода) - DDRВ и так обнулен полностью после сброса.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

На состояние после сброса по умолчанию я бы не стал полагаться, имею печальный опыт. Но если состояние пинов в процессе работы не собирается меняться, то DDRB можно прописать прямым присваиванием, как в моем варианте кода.
Изображение
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Jack_A писал(а):На состояние после сброса по умолчанию я бы не стал полагаться, имею печальный опыт.
да вы что? а как же вы, например, на аппаратный таймер полагаетесь, а на аппаратный сброс - нет? если не верить в аппаратную часть, надо идти в дворники...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

ARV писал(а):только в случае, если вывод всегда сохраняет свою функцию входа, делать вот этого DDRB &=~ BTN; вообще не надо (как я и поступил в своем варианте кода) - DDRВ и так обнулен полностью после сброса.
Я это приводил в качестве иллюстрации перевода вывода из произвольного состояния в состояние входа. Для абстрактного куска кода. Например, если этот вывод используется иногда для входа, иногда для выхода.
Jack_A писал(а):если состояние пинов в процессе работы не собирается меняться, то DDRB можно прописать прямым присваиванием, как в моем варианте кода.
Вот это ИМХО самое простое и правильное решение. Одной командой за 2-3 такта настроить все выводы порта вместо побитной настройки. В редких случаях, правда, это может ухудшить читаемость кода
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Jack_A писал(а):На состояние после сброса по умолчанию я бы не стал полагаться, имею печальный опыт.
Я тоже не понимаю. Вы предлагаете все регистры инициализировать или какие-то выборочно? И почему следует, например, верить что некая команда выполнит заявленное в ДШ , но не следует верить, что регистр будет инициализирован указанным значением? Что за печальный опыт?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

ARV писал(а): если не верить в аппаратную часть, надо идти в дворники...
Верить - это к церковникам. А единожды упершись в МК, который работал через опу, в то время как полсотни остальных с той же прогой работали как надо, анализом установил, что один бит в регистре ( подробности не помню за давностью) становится не в ту позицию по умолчанию. Разбирать что с ним случилось - на эксперименты времени не было - заказчики, график поставки . Прописал ему что надо в регистр - песня! С тех пор взял себе за правило - всю инициализацию прописывать. Речь шла о потоке в солидной фирме, и мое "верю - не верю" шеф просто не понял бы. Конечно, если речь идет о кухонном таймере любимой теще - можно и "по вере" написать, но на произваодстве главное - надежность, а не твое "верю - не верю".
В дворники не собираюсь, в своем ремесле достиг достаточно приличных результатов. Сейчас, увы, на пенсии :(
А насчет почему - можно, перелистывая бесчисленные Errata Sheet, доискиваться, что "в партиях с XXXX по YYYY имеется вот такая за$бень, потому будьте бдительны", я предпочел решение в лоб.
СпойлерНесмотря на разногласия в вопросах веры :) , Вас из friend-list'а не убираю :))
Изображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Правильно ли я понял, что Вы из-за неисправного МК инициализируете ВСЕ регистры?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

Z_h_e писал(а):Я тоже не понимаю. Вы предлагаете все регистры инициализировать или какие-то выборочно? И почему следует, например, верить что некая команда выполнит заявленное в ДШ , но не следует верить, что регистр будет инициализирован указанным значением? Что за печальный опыт?
Произошел сбой, некая команда не выполнила заявленной в ДШ, прыгнула на свободное место, мк дошагал до конца и запустился с нулевого адреса, но со значениями регистров которые были на момент сбоя...

ps. Давно авр-ми не занимался, сейчас ради интереса скомпилировал вариант от ARV(gcc -Os), получил 804 байта.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Reflector писал(а):Произошел сбой, некая команда не выполнила заявленной в ДШ, прыгнула на свободное место, мк дошагал до конца и запустился с нулевого адреса, но со значениями регистров которые были на момент сбоя...
Если опасаться такого сбоя, который мог бы просто завесить МК, то проще определить причину выполнения начального кода и сделать соответствующие шаги. АВР это умеет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Z_h_e писал(а):Правильно ли я понял, что Вы из-за неисправного МК инициализируете ВСЕ регистры?
Нет, неправильно поняли. В исправном МК ( но с каким-то bug, позднее описанном в errata list и исправленном ) и во всех остальных я инициализирую все используемые регистры . Поверьте, памяти на пол десятка дополнительных команд хватало, а если не хватало - криво написан неоптимальный код или МК неправильно выбран, вот тогда действительно - в дворники.
Впрочем, свое видение я не навязываю. Вольному - воля, пьяному - рай . ©
Последний раз редактировалось Jack_A Сб ноя 05, 2016 11:18:48, всего редактировалось 1 раз.
Изображение
Ответить

Вернуться в «AVR»