Страница 3 из 3

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

Добавлено: Сб ноя 05, 2016 11:17:17
Z_h_e
Jack_A писал(а): я инициализирую все используемые регистры .
Но в МК нет неиспользуемых регистров. По той же Вашей логике, где гарантия, что не включится некая маска прерывания сама, который Вы не используете, из-за бага?

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

Добавлено: Сб ноя 05, 2016 11:17:54
Reflector
Z_h_e писал(а):Если опасаться такого сбоя, который мог бы просто завесить МК, то проще определить причину выполнения начального кода и сделать соответствующие шаги. АВР это умеет.
Мк не завис, он просто прыгнул не туда, источник сброса от этого не меняется.

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

Добавлено: Сб ноя 05, 2016 11:27:34
Jack_A
В МК масса неиспользуемых регистров, если только его не юзают по максимуму. Что мне инициализировать порт D, к примеру, если он ни к чему не подключен? А насчет прерываний - все неиспользуемые векторы заткнуты reti. Ну а кто пишет

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

  .org  XXXX
<вектор>
  .org  YYYY
<вектор>
- в случае чего пусть на себя обижается и героически борется.
Это мое мнение, и я с ним полностью согласен :)

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

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

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

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

То что Вы инициализируете дополнительно это конечно Ваше дело, но не надо убеждать именно так надо делать.

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

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

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

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

Добавлено: Вс фев 05, 2017 20:22:17
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:

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

Добавлено: Чт фев 09, 2017 10:47:34
Ilyazh
В качестве генератора "случайных" чисел можно использовать АЦП на ножке висящей в воздухе. Наводки и шумы будут каждый раз давать какое-то непонятное значение

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

Добавлено: Чт фев 09, 2017 11:47:08
ARV
Ощущение, что у вас не включена оптимизация. Опция -Os имеется при запуске компилятора?

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

Добавлено: Чт фев 09, 2017 12:18:19
Starichok51
sTRog писал(а):Есть ли у кого возможность подсказать, как можно оптимизировать моего динозавра?
Весит аж 4кб. Вроде и следовал советам, что уже давали, а вылезла такая махина.
написать на ассемблере. получится в 5-7 раз короче.

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

Добавлено: Чт фев 09, 2017 12:41:27
scorpi_0n
Не получится, ну ни как. Он с ключами компилятора разобраться не может и поиском пользоваться не умеет, а вы ему АСМ предлагаете. Да он на третьей строчке АСМа утонет окончательно.

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

Добавлено: Вс фев 12, 2017 22:17:36
spongebob
А как это вообще может занимать 4кб?