Уменьшение веса кода с 4kb до 1kb

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Прошу помочь урезать код, чтобы он влез в attiny13a.
Спойлер

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

#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; // vatiable for 0 to 1
volatile uint8_t amount; //vatiable for 0 to 12 need for 12 reps ot one side and back
volatile uint8_t i; //vatiable for 0 to 10 need fo timer
volatile uint16_t Sec; //variable for count the number of second
volatile uint16_t SecF=0;// variable for make 5 second delay working mode, and than off.
int rantime; // variable for make random number.

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

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


static void pulcesDREAMon(void){
	for ( amount = 0; amount < 12; amount++ ) //this function make 11 times on/off ransistor of number 1
	 {
      PORTB |= TRANSON;
      _delay_ms(500);
      PORTB &= ~TRANSON;
	  _delay_ms(1000);
	}
}

static void pulcesDREAMoff(void){
	for ( amount = 0; amount < 12; amount++ ) //this function make 11 times on/off ransistor of number 2
	 {
      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){ //repeating a piece of text repeat
   	SecF=5; //this variable need for check how much time passed
	Sec = 0;
}

static void povtor_per2(void){ //repeating a piece of text repeat
   	SecF=3000; //this variable need for disable funtion which off the mode
	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; //work for the exit

   rantime = 1800 + random() % 5400; //make random number between 30 min and 2 hours.

while (1){
  if (mod==0){
     if (Sec>=1800){
        pulcesDREAMon(); //on the need mode and give them to work 5 sek.
		povtor_per();
     }

	 if (Sec>=SecF){ //check how much time passed
        pulcesDREAMoff(); 
		povtor_per2();
     }
	
  }

  if (mod==1){
     if (Sec>=rantime){
        pulcesDREAMon(); //on the need mode and give them to work 5 sek.
		povtor_per();
		rantime = 1800 + random() % 5400;
     }

	 if (Sec>=SecF){
        pulcesDREAMoff(); //check how much time passed
		povtor_per2();
     }
    
     }



  if (PINB & BTN){ //just a function button processing
     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();
  }
}
}

СпойлерАдминам и пользователям, прошу извинения за дубликат темы. Сделано это по той причине, что в предыдущей теме оставлено уже множество сообщений и, возможно, это отпугивает тех, кто мог бы помочь. Ту тему, если это возможно, просьба отправить в архив.
Реклама
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

Чем собираешь?
gcc-4.8.2 с опцией -Os твой код в 574 байт скомпилировал. +надо добавить startup + вектора + внешние функции (беглый просмотр, что это _delay_ms())
Как _delay_ms() у тебя реализован, я не знаю. А что возможности посмотреть карту памяти в твоей среде нет? Если есть - посмотри, что так жрет и решай как решить.
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Собираю в avr sudio 4. Как память отследить - гуглил, но чет не понял. Знаю только что выше 6 там в отчете пишется, но у меня не тянет такой софт.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

sTRog писал(а):Прошу помочь урезать код, чтобы он влез в attiny13a
Урезал :
Спойлер

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

int main(void){

}
В attiny13a точно влезет.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

sTRog, вроде в AVR студии gcc и используется. Как там из среды запускать - не знаю, не ставил студию. Если там gcc - ищи в своей установке студии консольные приложения, с именами что-то типа avr-gcc*.exe, avr-objdump*.exe... Есть такие? Если есть, то любо сам можешь посмотреть их использование, либо сюда их название - может сможем пмочь.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

реализовать stdlib.h (random() % 5400) на свободном таймере (сабака)
либо так:

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

while (1){
unsigned int rnd++;
if(rnd>5400) rnd=0;
.....
rantime = 1800 + rnd; // random() % 5400;
.....
пол тиньки останется свободной....
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

1. Включить оптимизацию для начала.
2. Использовать режим CTC таймера.
3. Использовать 8ми битные переменные, зачем считать 1800, когда можно до 18?
4. Оптимизировать алгоритм, использовать поменьше сравнений.
5. Не использовать volotile переменные без необходимости.
6. Взять МК с 32кБ флеша ;)
7. Понять что случайностей не бывает и все предопределено :) , особенно в ПСЕВДОслучайной последовательности и убедится что при старте МК rantime всегда инициализируется одним и тем же совершенно случайным числом.
8. Написать ТЗ и дать денежку тому кто сделает. Хотите сделаю? Но сначала ТЗ почитаю конечно (это если что в личку).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

viiv писал(а):sTRog, вроде в AVR студии gcc и используется. Как там из среды запускать - не знаю, не ставил студию. Если там gcc - ищи в своей установке студии консольные приложения, с именами что-то типа avr-gcc*.exe, avr-objdump*.exe... Есть такие? Если есть, то любо сам можешь посмотреть их использование, либо сюда их название - может сможем пмочь.
По адрессу C:\avr\avr8-gnu-toolchain\bin есть .exe avr-gcc.exe но я не понял, как ее запускать, если тупо два раза кликнуть то на мгновений открывается консольное окно, а затем сразу же закрывается.
Mishany писал(а):реализовать stdlib.h (random() % 5400) на свободном таймере (сабака)
либо так:
Спасибо. А не подскажите, где можно почитать о функциях рандом на си для микроконтролеров? Читал о генерации псевдослучайных чисел на регистре сдвига, но так и не нашел примеров под attiny 13 или принципов написание, которые уже можно было бы подстроить
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Инкремент переменной в цикле с произвольным во времени обращением к ней и есть рандомное значение, да банальный шум на ацп....
Как часто нужно рандомное значение?
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Mishany писал(а):Инкремент переменной в цикле с произвольным во времени обращением к ней и есть рандомное значение, да банальный шум на ацп....
Как часто нужно рандомное значение?
Максимальная частота запроса - раз в пол часа.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Тема закрыта, вопрос решен.
Ответить

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