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

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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

Сообщение Reflector »

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

Сообщение Jack_A »

В МК масса неиспользуемых регистров, если только его не юзают по максимуму. Что мне инициализировать порт D, к примеру, если он ни к чему не подключен? А насчет прерываний - все неиспользуемые векторы заткнуты reti. Ну а кто пишет

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

  .org  XXXX
<вектор>
  .org  YYYY
<вектор>
- в случае чего пусть на себя обижается и героически борется.
Это мое мнение, и я с ним полностью согласен :)
Изображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Reflector писал(а):Мк не завис, он просто прыгнул не туда, источник сброса от этого не меняется.
Я имел ввиду, что МК может не только начать код выполнять сначала, но может где-нибудь с таким же успехом зависнуть и выполнять что попало (я имею ввиду при сбое). Но это не объясняет зачем делать программную переинициализацию регистров, и почему ее надо делать выборочно.

Повторюсь, выполнение кода с "нуля" нештатно, в АВР легко идентифицировать. Однако сбой, на то и сбой, он может просто изменить значение одного регистра (при скачке питания допустим). Будет Ваш МК работать в два раза быстрее или медленнее или еще что-то и как спасет в таком случае переинициализация выборочных регистров?
Мк не завис, он просто прыгнул не туда, источник сброса от этого не меняется.
Источника сброса вообще не будет.

Добавлено after 8 minutes 57 seconds:
Jack_A писал(а):В МК масса неиспользуемых регистров,
Неиспользуемых программистом, но не самим МК.
Jack_A писал(а):Что мне инициализировать порт D, к примеру, если он ни к чему не подключен?
Ну не только у портов есть регистры, которые Вы не используете. А вдруг OSCCAL неправильно инициализируется? А вдруг внешние прерывания разрешены на том же порте по уровню, будете сидеть в прерывании через команду? Вы очень не предусмотрительны.

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

Сообщение Reflector »

Z_h_e писал(а):Я имел ввиду, что МК может не только начать код выполнять сначала, но может где-нибудь с таким же успехом зависнуть и выполнять что попало (я имею ввиду при сбое). Но это не объясняет зачем делать программную переинициализацию регистров, и почему ее надо делать выборочно.

Повторюсь, выполнение кода с "нуля" нештатно, в АВР легко идентифицировать. Однако сбой, на то и сбой, он может просто изменить значение одного регистра (при скачке питания допустим). Будет Ваш МК работать в два раза быстрее или медленнее или еще что-то и как спасет в таком случае переинициализация выборочных регистров?
Это вопрос вероятностей. При сбое мк может наменять что угодно и вернуться к "нормальной" работе с ненормальными значениями регистров. Но он может и зациклиться, тогда поможет watchdog. Или выполнение кода провалится в неиспользуемую область флеша, что весьма вероятно, особенно если во флеше много незанятого места, тогда более полная инициализация будет весьма кстати.
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Друзья. Есть ли у кого возможность подсказать, как можно оптимизировать моего динозавра?
Спойлер

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

#define F_CPU 1200000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>

#define T_POLL 136
#define TRANSON   _BV(2)
#define TRANSOFF   _BV(4)
#define LED_R   _BV(3)
#define BTN      _BV(1)

char mod = 0;
volatile uint8_t amount; //êîëè÷åñòâî ïîâòîðåíèé äëÿ âêëþ÷åíèÿ íóæíîãî ðåæèìà.
volatile uint8_t i;
volatile uint16_t Sec;
volatile uint16_t SecF=0;// ïåðåìåííàÿ äëÿ êîíòðîëÿ ïðîøåäøåãî âðåìåíè ñíà÷àëî âêëþ÷àåò îäíó ïðîâåðêó, çàòåì äðóãóþ
int rantime;

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

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


static void pulcesDREAMon(void){
	for ( amount = 0; amount < 12; amount++ ) //ïîâòîðÿåì 11 ðàç âêëþ÷åíèå âûêëþ÷åíèå òðàíçèñòîðà äëÿ âêëþ÷åíèÿ ðåæèìà.
	 {
      PORTB |= TRANSON;
      _delay_ms(500);
      PORTB &= ~TRANSON;
	  _delay_ms(1000);
	}
}

static void pulcesDREAMoff(void){
	for ( amount = 0; amount < 12; amount++ ) //ïîâòîðÿåì 11 ðàç âêëþ÷åíèå âûêëþ÷åíèå òðàíçèñòîðà äëÿ âêëþ÷åíèÿ ðåæèìà.
	 {
      PORTB |= TRANSOFF;
      _delay_ms(500);
      PORTB &= ~TRANSOFF;
	  _delay_ms(1000);
	}
}

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

static void povtor_per(void){
   	SecF=5;
	Sec = 0;
}

static void povtor_per2(void){
   	SecF=3000;
	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 = TRANSON | TRANSOFF | LED_R; //òðàíçèñòîðîí òðíàçèñòîðîô è ñâåòîäèîä ðàáîòàþò íà âûõîä.

   rantime = 1800 + random() % 5400;

   while (1){
      if (mod==0){
         if (Sec>=1800){
            pulcesDREAMon(); //âêëþ÷àåì ðåæèì íî÷üþ è äàåì 5 ñåê ïîðàáîòàòü.
			povtor_per();
         }

		 if (Sec>=SecF){
            pulcesDREAMoff(); //âûêëþ÷àåì ðåæèì íî÷üþ.
			povtor_per2();
         }
			
      }

      if (mod==1){
         if (Sec>=rantime){
            pulcesDREAMon(); //âêëþ÷àåì ðåæèì äíåì è äàåì 5 ñåê ïîðàáîòàòü.
			povtor_per();
			rantime = 1800 + random() % 5400;
         }

		 if (Sec>=SecF){
            pulcesDREAMoff(); //âûêëþ÷àåì ðåæèì íî÷üþ.
			povtor_per2();
         }
            
         }
		
      

      if (PINB & BTN){
         cli();
         Sec = 0;
         if (mod==0){
            mod = 1;
            pulce_led();
        } else {
           mod = 0;
           pulce_led();
           _delay_ms(100);
           pulce_led();
		   SecF=5400;
        }
         _delay_ms(1000);
         sei();
      }
   }
}

Весит аж 4кб. Вроде и следовал советам, что уже давали, а вылезла такая махина.
:oops: :oops: :oops:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Ср май 21, 2014 13:18:07
Откуда: Санкт-Петербург

Сообщение Ilyazh »

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

Сообщение ARV »

Ощущение, что у вас не включена оптимизация. Опция -Os имеется при запуске компилятора?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 19077
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

sTRog писал(а):Есть ли у кого возможность подсказать, как можно оптимизировать моего динозавра?
Весит аж 4кб. Вроде и следовал советам, что уже давали, а вылезла такая махина.
написать на ассемблере. получится в 5-7 раз короче.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

Не получится, ну ни как. Он с ключами компилятора разобраться не может и поиском пользоваться не умеет, а вы ему АСМ предлагаете. Да он на третьей строчке АСМа утонет окончательно.
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo

Сообщение spongebob »

А как это вообще может занимать 4кб?
Контактная информация:
Ответить

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