Но в МК нет неиспользуемых регистров. По той же Вашей логике, где гарантия, что не включится некая маска прерывания сама, который Вы не используете, из-за бага?Jack_A писал(а): я инициализирую все используемые регистры .
Оптимизация Кода
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Оптимизация Кода
- Реклама
Re: Оптимизация Кода
Мк не завис, он просто прыгнул не туда, источник сброса от этого не меняется.Z_h_e писал(а):Если опасаться такого сбоя, который мог бы просто завесить МК, то проще определить причину выполнения начального кода и сделать соответствующие шаги. АВР это умеет.
Re: Оптимизация Кода
В МК масса неиспользуемых регистров, если только его не юзают по максимуму. Что мне инициализировать порт D, к примеру, если он ни к чему не подключен? А насчет прерываний - все неиспользуемые векторы заткнуты reti. Ну а кто пишет
- в случае чего пусть на себя обижается и героически борется.
Это мое мнение, и я с ним полностью согласен
Код: Выделить всё
.org XXXX
<вектор>
.org YYYY
<вектор>
Это мое мнение, и я с ним полностью согласен
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Оптимизация Кода
Я имел ввиду, что МК может не только начать код выполнять сначала, но может где-нибудь с таким же успехом зависнуть и выполнять что попало (я имею ввиду при сбое). Но это не объясняет зачем делать программную переинициализацию регистров, и почему ее надо делать выборочно.Reflector писал(а):Мк не завис, он просто прыгнул не туда, источник сброса от этого не меняется.
Повторюсь, выполнение кода с "нуля" нештатно, в АВР легко идентифицировать. Однако сбой, на то и сбой, он может просто изменить значение одного регистра (при скачке питания допустим). Будет Ваш МК работать в два раза быстрее или медленнее или еще что-то и как спасет в таком случае переинициализация выборочных регистров?
Источника сброса вообще не будет.Мк не завис, он просто прыгнул не туда, источник сброса от этого не меняется.
Добавлено after 8 minutes 57 seconds:
Неиспользуемых программистом, но не самим МК.Jack_A писал(а):В МК масса неиспользуемых регистров,
Ну не только у портов есть регистры, которые Вы не используете. А вдруг OSCCAL неправильно инициализируется? А вдруг внешние прерывания разрешены на том же порте по уровню, будете сидеть в прерывании через команду? Вы очень не предусмотрительны.Jack_A писал(а):Что мне инициализировать порт D, к примеру, если он ни к чему не подключен?
То что Вы инициализируете дополнительно это конечно Ваше дело, но не надо убеждать именно так надо делать.
Re: Оптимизация Кода
Это вопрос вероятностей. При сбое мк может наменять что угодно и вернуться к "нормальной" работе с ненормальными значениями регистров. Но он может и зациклиться, тогда поможет watchdog. Или выполнение кода провалится в неиспользуемую область флеша, что весьма вероятно, особенно если во флеше много незанятого места, тогда более полная инициализация будет весьма кстати.Z_h_e писал(а):Я имел ввиду, что МК может не только начать код выполнять сначала, но может где-нибудь с таким же успехом зависнуть и выполнять что попало (я имею ввиду при сбое). Но это не объясняет зачем делать программную переинициализацию регистров, и почему ее надо делать выборочно.
Повторюсь, выполнение кода с "нуля" нештатно, в АВР легко идентифицировать. Однако сбой, на то и сбой, он может просто изменить значение одного регистра (при скачке питания допустим). Будет Ваш МК работать в два раза быстрее или медленнее или еще что-то и как спасет в таком случае переинициализация выборочных регистров?
- Реклама
Re: Оптимизация Кода
Друзья. Есть ли у кого возможность подсказать, как можно оптимизировать моего динозавра?
Весит аж 4кб. Вроде и следовал советам, что уже давали, а вылезла такая махина.

Спойлер
Код: Выделить всё
#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();
}
}
}
- Ilyazh
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Ср май 21, 2014 13:18:07
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Оптимизация Кода
В качестве генератора "случайных" чисел можно использовать АЦП на ножке висящей в воздухе. Наводки и шумы будут каждый раз давать какое-то непонятное значение
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18614
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Оптимизация Кода
Ощущение, что у вас не включена оптимизация. Опция -Os имеется при запуске компилятора?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Оптимизация Кода
написать на ассемблере. получится в 5-7 раз короче.sTRog писал(а):Есть ли у кого возможность подсказать, как можно оптимизировать моего динозавра?
Весит аж 4кб. Вроде и следовал советам, что уже давали, а вылезла такая махина.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Оптимизация Кода
Не получится, ну ни как. Он с ключами компилятора разобраться не может и поиском пользоваться не умеет, а вы ему АСМ предлагаете. Да он на третьей строчке АСМа утонет окончательно.
-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
Re: Оптимизация Кода
А как это вообще может занимать 4кб?




