Форум РадиоКот https://radiokot.ru/forum/ |
|
Оптимизация Кода https://radiokot.ru/forum/viewtopic.php?f=57&t=137554 |
Страница 1 из 3 |
Автор: | sTRog [ Ср ноя 02, 2016 19:47:53 ] |
Заголовок сообщения: | Оптимизация Кода |
Помогите оптимизировать код. Сейчас он не влазит в attiny13A, а хочу, чтобы взлазил. Переменные вроде и так все по минимуму обьявил. СпойлерКод: #define F_CPU 1200000UL #include <util/delay.h> #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #define T_POLL 136 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; } } int main(void) { PRR = (1<<PRADC); // shut down ADC TIMSK0 = (1<<TOIE0); // timer0 overflow interrupt enable TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024 i=0; Sec=0; sei(); DDRB |=(1<<2); //транзистор DDRB |=(1<<3); //cветодиод З DDRB |=(1<<4); //cветодиод К DDRB &=~(1<<1); //кнопка rantime = 3600 + random()%3600; while (1) { if (mod==0) { if (Sec>=5400) { PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); _delay_ms(10); PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); _delay_ms(500); PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); _delay_ms(10); PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); Sec = 0; } } if (mod==1) { if (Sec>=rantime) { PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); _delay_ms(10); PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); _delay_ms(500); PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); _delay_ms(10); PORTB |= (1<<2); _delay_ms(1); PORTB &=~(1<<2); Sec = 0; rantime = 3600 + random()%3600; } } if (PINB & (1<<1)) // { cli(); if (mod==0) // { mod = 1; Sec = 0; PORTB |= (1<<3); _delay_ms(10); PORTB &=~(1<<3); _delay_ms(1000); } else // { mod = 0; Sec = 0; PORTB |= (1<<3); _delay_ms(10); PORTB &=~(1<<3); _delay_ms(100); PORTB |= (1<<3); _delay_ms(10); PORTB &=~(1<<3); _delay_ms(1000); } sei(); } } } |
Автор: | Z_h_e [ Ср ноя 02, 2016 20:19:39 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
может просто включить оптимизацию? |
Автор: | COKPOWEHEU [ Ср ноя 02, 2016 20:37:35 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Половину места занимает random(). Попробуйте поискать реализацию полегче. |
Автор: | sTRog [ Ср ноя 02, 2016 20:42:06 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
COKPOWEHEU писал(а): Половину места занимает random(). Попробуйте поискать реализацию полегче. У меня все это ради этой функции, без нее никуда |
Автор: | kappz [ Ср ноя 02, 2016 21:29:43 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
А так влазит ? СпойлерКод: #define F_CPU 1200000UL #include <util/delay.h> #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #define T_POLL 136 volatile uint8_t i; // если регистр OCR0B использоваться не будет то закомментируйте эту строку //#define i OCR0B // и раскомментируйте эту volatile uint16_t Sec; ISR(TIM0_OVF_vect) { TCNT0 = T_POLL; uint8_t li = i; li++; if (li>=10) //period 1s { Sec++; li=0; } i = li; } static void delay_ms(uint16_t dl) { while(dl) { _delay_ms(1); dl--; } } int main(void) { char mod = 0; int rantime; //PRR = (1<<PRADC); // shut down ADC .. зачем ? TIMSK0 = (1<<TOIE0); // timer0 overflow interrupt enable TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024 //i=0; Sec=0; // глобальные переменные и так содержат нули sei(); DDRB |=(1<<2); //транзистор DDRB |=(1<<3); //cветодиод З DDRB |=(1<<4); //cветодиод К DDRB &=~(1<<1); //кнопка rantime = 3600 + random()%3600; while (1) { if (mod==0) { if (Sec>=5400) { PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); delay_ms(10); PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); delay_ms(500); PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); delay_ms(10); PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); Sec = 0; } } if (mod==1) { if (Sec>=rantime) { PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); delay_ms(10); PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); delay_ms(500); PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); delay_ms(10); PORTB |= (1<<2); delay_ms(1); PORTB &=~(1<<2); Sec = 0; rantime = 3600 + random()%3600; } } if (PINB & (1<<1)) // { cli(); if (mod==0) // { mod = 1; Sec = 0; PORTB |= (1<<3); delay_ms(10); PORTB &=~(1<<3); delay_ms(1000); } else // { mod = 0; Sec = 0; PORTB |= (1<<3); delay_ms(10); PORTB &=~(1<<3); delay_ms(100); PORTB |= (1<<3); delay_ms(10); PORTB &=~(1<<3); delay_ms(1000); } sei(); } } } |
Автор: | oleg110592 [ Ср ноя 02, 2016 21:35:40 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Надо пробовать - библиотечный делей заменил ассемблерным, си файл немного покурочил : СпойлерКод: #define F_CPU 1200000UL //#include <util/delay.h> #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #define T_POLL 136 char mod = 0; volatile uint8_t i; volatile uint16_t Sec; int rantime; void delay_ms(unsigned short ms); /* Defined in asmfunc.S */ ISR(TIM0_OVF_vect) { TCNT0 = T_POLL; i++; if (i >= 10) //period 1s { Sec++; i = 0; } } void delay1ms() { delay_ms(1); } void delay10ms() { delay_ms(10); } int main(void) { PRR = (1 << PRADC); // shut down ADC TIMSK0 = (1 << TOIE0); // timer0 overflow interrupt enable TCCR0B = (1 << CS02) | (1 << CS00); // prescaler 1/1024 i = 0; Sec = 0; sei(); DDRB |= (1 << 2); //транзистор DDRB |= (1 << 3); //cветодиод З DDRB |= (1 << 4); //cветодиод К DDRB &= ~(1 << 1); //кнопка rantime = 3600 + random() % 3600; while (1) { if (mod == 0) { if (Sec >= 5400) { PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); delay10ms(); PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); delay_ms(500); PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); delay10ms(); PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); Sec = 0; } } if (mod == 1) { if (Sec >= rantime) { PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); delay10ms(); PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); delay_ms(500); PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); delay10ms(); PORTB |= (1 << 2); delay1ms(); PORTB &= ~(1 << 2); Sec = 0; rantime = 3600 + random() % 3600; } } if (PINB & (1 << 1)) // { cli(); if (mod == 0) // { mod = 1; Sec = 0; PORTB |= (1 << 3); delay10ms(); PORTB &= ~(1 << 3); delay_ms(1000); } else // { mod = 0; Sec = 0; PORTB |= (1 << 3); delay10ms(); PORTB &= ~(1 << 3); delay_ms(100); PORTB |= (1 << 3); delay10ms(); PORTB &= ~(1 << 3); delay_ms(1000); } sei(); } } } ассемблерный файл назвать например "asmfunc.S" (S большая) и подключить к проекту: СпойлерКод: #define F_CPU 1200000 ;----------; ; Simple Delay ;----------; ; void delay_ms(WORD ms); ; void delay_us(WORD us); .global delay_ms .func delay_ms delay_ms: wdr ; Reset WDT sbiw r24, 1 ; if (ms-- == 0) return; brcs 9f ; / ldi ZL, lo8(F_CPU/4000) ; 1ms delay ldi ZH, hi8(F_CPU/4000) ; 1: sbiw ZL, 1 ; brne 1b ; / rjmp delay_ms 9: ret .endfunc .global delay_us .func delay_us delay_us: ldi r23, 2 1: dec r23 brne 1b sbiw r24, 1 brne delay_us wdr ret .endfunc GCC для авр 5.2.1 вроде: Код: text data bss dec hex filename
1012 4 6 1022 3fe TestT13.elf |
Автор: | Jack_A [ Чт ноя 03, 2016 10:37:17 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Впечатление, что код писался по принципу: занять как можно больше памяти. Навскидку: вместо гаргары Код: DDRB |=(1<<2); //транзистор DDRB |=(1<<3); //cветодиод З DDRB |=(1<<4); //cветодиод К DDRB &=~(1<<1); //кнопка не написать ли Код: DDRB =(1<<2) + (1<<3) + (1<<4) Далее. Все телодвижения при mod==0 и mod==1 на первый взгляд одинаковы, отличаются только условием if (Sec>=5400) или if (Sec>=rantime), так почему бы их не собрать в подпрограмму и вызвать 2 раза ? А еще проще : Код: if ( ( ( mod==0 ) && (Sec>=5400) ) || ( ( mod==1 ) && (Sec>=rantime) ) ) Насчет включить оптимизатор - кто же спорит, только лучший оптимизатор - это то, что находится между ушами ![]() Переписать на асме - даже и не предлагаю, тапками закидають. ![]() |
Автор: | Z_h_e [ Чт ноя 03, 2016 10:57:52 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Запас тапок помешает что ли? ![]() Для вычисления псеводослучайного числа существуют простые алгоритмы. Смутно помнится делал простой алгоритм много лет назад. Точно его не помню. Каждое последующее число получалось путем какой-то простой математической операцией с предыдущим. Но полезные данные брались из середины числа. Например, нужно 8 битное случайно число. Математика производилась над 16 битными числами, но результатом было 8 битное число, отбросив у 16 битного 4 старших и 4 младших бита. Само собой 16 битное число запоминалось, для следующего вычисления. Я точно разрядности не помню. Математику к сожалению тоже, но она была простая. Визуально ряд чисел был хаотичен, и период повторения вроде тоже был приличный. |
Автор: | ARV [ Чт ноя 03, 2016 11:04:20 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
что касается random... наивно полагать, что это на самом деле будет генератор случайных чисел. нет, каждое следующее будет "непердсказуемым" по предыдущему, но при каждом включении питания всегда будет повторяться одна и та же последовательность... в связи с этим не вижу никакого смысла в использовании этой функции... например, я в некоторых своих проектах в качестве "псевдослучайной последовательности" использовал последовательное считывание flash микроконтроллера с накладыванием на полученные байты какой-то XOR-маски. можно сгенерировать псевдослучайную последовательность на основе какого-то циклического алгоритма, отказавшись от библиотечной функции с гарантированно большим периодом повторения... то есть я предлагаю пойти по пути упрощения требований к решению задачи. |
Автор: | BOB51 [ Чт ноя 03, 2016 11:33:33 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Да весьма хорошая реализация алгоритма ГСЧ на ассемблере имеется... ![]() |
Автор: | Z_h_e [ Чт ноя 03, 2016 12:21:43 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Тоже абсолютно не к чему получать большое случайное число, чтобы потом разделить опять на большое. Надо сразу определить предел рандома, СпойлерЦитата: /** \ingroup avr_stdlib Highest number that can be generated by random(). */ #define RANDOM_MAX 0x7FFFFFFF /** \ingroup avr_stdlib The random() function computes a sequence of pseudo-random integers in the range of 0 to \c RANDOM_MAX (as defined by the header file <stdlib.h>). The srandom() function sets its argument \c seed as the seed for a new sequence of pseudo-random numbers to be returned by rand(). These sequences are repeatable by calling srandom() with the same seed value. If no seed value is provided, the functions are automatically seeded with a value of 1. */ extern long random(void); /** \ingroup avr_stdlib Pseudo-random number generator seeding; see random(). */ extern void srandom(unsigned long __seed); |
Автор: | ozonn [ Чт ноя 03, 2016 13:13:59 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
sTRog писал(а): COKPOWEHEU писал(а): Половину места занимает random(). Попробуйте поискать реализацию полегче. У меня все это ради этой функции, без нее никуда я использую счетный регистр какого-либо таймера. Хотя, это не всегда возможно. Зато число получается по-настоящему случайное |
Автор: | ARV [ Чт ноя 03, 2016 14:52:35 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
ozonn писал(а): Зато число получается по-настоящему случайное с чего это вдруг? в однообразной программе, опрашивающей периодически таймер, тактируемый от того же источника, что и ядро МК, получаемые результаты будут строго детерминированы. при наличии внешних прерываний, поступающих НА САМОМ ДЕЛЕ в непредсказуемые моменты, ваш подход еще как-то может быть оправдан, хотя получаемые числа и в этом случае будут ОЧЕНЬ далеки от случайных и даже от псевдослучайных... и только тактирование таймера от внешнего нестабилизированного генератора как-то может улучшить ситуацию... |
Автор: | ozonn [ Чт ноя 03, 2016 15:10:57 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
ARV писал(а): при наличии внешних прерываний, поступающих НА САМОМ ДЕЛЕ в непредсказуемые моменты, ваш подход еще как-то может быть оправдан, хотя получаемые числа и в этом случае будут ОЧЕНЬ далеки от случайных и даже от псевдослучайных... и только тактирование таймера от внешнего нестабилизированного генератора как-то может улучшить ситуацию... именно в непредсказуемые моменты и числа при этом получаются случайные. Разумеется в диапазоне 0 - 255 |
Автор: | smacorp [ Чт ноя 03, 2016 16:07:52 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
ozonn писал(а): именно в непредсказуемые моменты и числа при этом получаются случайные. Разумеется в диапазоне 0 - 255 Вы ошибаетесь. Не рассказывайте Вашу версию криптографам, они повеселятся. Как и Энштейн с его теорией вероятностей. ![]() |
Автор: | ozonn [ Чт ноя 03, 2016 16:16:56 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
smacorp писал(а): ozonn писал(а): именно в непредсказуемые моменты и числа при этом получаются случайные. Разумеется в диапазоне 0 - 255 Вы ошибаетесь. Не рассказывайте Вашу версию криптографам, они повеселятся. Как и Энштейн с его теорией вероятностей. ![]() нет, не ошибаюсь |
Автор: | smacorp [ Чт ноя 03, 2016 16:21:23 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
ozonn писал(а): нет, не ошибаюсь "Блажен, кто верует, тепло ему на свете!" (с) ![]() |
Автор: | ozonn [ Чт ноя 03, 2016 16:36:00 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
smacorp писал(а): ozonn писал(а): нет, не ошибаюсь "Блажен, кто верует, тепло ему на свете!" (с) ![]() не могу вам запретить веровать. Могу лишь посоветовать почитать теорию вероятностей. |
Автор: | ARV [ Чт ноя 03, 2016 18:01:04 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
ozonn писал(а): именно в непредсказуемые моменты для работающей программы в МК непредсказуемые моменты могут возникать ТОЛЬКО по внешним событиям - я писал про прерывания. любые ВНУТРЕННИЕ события будут однозначно предсказуемыми.то есть ваш подход сработает для "электронного кубика" или "однорукого бандита". но устройство, генерирующее текст, выбирая слова из массива по "случайному" индексу, будет генерировать всегда одинаковую последовательность фраз, т.е. однозначно предсказуемо. |
Автор: | smacorp [ Чт ноя 03, 2016 19:06:06 ] |
Заголовок сообщения: | Re: Оптимизация Кода |
Да ozonn тупо просто не хочет понять о чём ему пытаются сказать уже несколько человек. Да и хрен бы с ним, чо. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |