WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

Ага обычная команда, а загрузка адреса это еще пара команд на один байт. Либо прибавление к паре Z тоже пара команд.

Вас что то не поймешь, получается по вашим словам, что все таки меньше места занимает чтение из флеш одна команда против 11. Я так полагаю там не одна команда.
Реклама
____Eugene____
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт авг 31, 2010 18:26:35

Re: WinAvr в вопросах и ответах

Сообщение ____Eugene____ »

почему условие выполняется при pack=-100 и др отрицательных

volatile char pack=-100 ;


if(pack>0)
{
led_off;
bit_ind++;
pack=-20;
}
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: WinAvr в вопросах и ответах

Сообщение a_skr »

Загрузка адреса - само собой. Я - не сторонник чего-то определенного из вышесказанного, просто дал мысли - что иногда можно соптимизировать. Экономим ОЗУ - не создаем констант-переменных (дико звучит), используем локальные переменные, и т.д... есть много способов.
Предлагая убрать все константы-переменные и инициализированные переменные (не нулем) - и тем самым сэкономить память программ флеш (на 11 команд) - я вовсе не предлагал читать их из флеш.

p.s.
____Eugene____ писал(а):почему условие выполняется при pack=-100 и др отрицательных
volatile char pack=-100 ;
потому что в другом месте программы его что-то меняет на положительное или, Вы, например, приказали компилятору char считать беззнаковым.
____Eugene____
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт авг 31, 2010 18:26:35

Re: WinAvr в вопросах и ответах

Сообщение ____Eugene____ »

как произвести запись по адресу

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
#define _SFR_IO16(io_addr) ((io_addr) + __SFR_OFFSET)
макросы одинаковые но я полагаю выполняются по разному ?

если изминить макрос вот так
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
В
#define _SFR_IO128(io_addr) ((io_addr) + __SFR_OFFSET)
он перестает работать?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

a_skr писал(а):я вовсе не предлагал читать их из флеш.
Хе а откуда же тогда вы их прочитаете :))) из космоса? Все равно из флешь, только в виде команды загрузки константы. Далее если таких констант много неужели это будет занимать меньше места, чем упомянутые вами 11 команд?

Кстати использование глобальных переменных как раз немного сокращает размер кода в ущерб оперативке. Утверждение проверено насчет размера.
макросы одинаковые но я полагаю выполняются по разному ?
Один для доступа к 8 битной ячейке, второй для 16. А изменять не имеет смысла.
Реклама
____Eugene____
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт авг 31, 2010 18:26:35

Re: WinAvr в вопросах и ответах

Сообщение ____Eugene____ »

второй для 16. А изменять не имеет смысла.
то есть это не совсем макросы?
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: WinAvr в вопросах и ответах

Сообщение a_skr »

vitalik_1984 писал(а):
a_skr писал(а):я вовсе не предлагал читать их из флеш.
Хе а откуда же тогда вы их прочитаете :))) из космоса? Все равно из флешь, только в виде команды загрузки константы. Далее если таких констант много неужели это будет занимать меньше места, чем упомянутые вами 11 команд?
1. Да, из флеш в виде команд загрузки констант, что занимает меньше места и выполняется быстрее загрузки значений из переменных-констант в ОЗУ. 2. Нет, не меньше 11 команд. Про 11 команд смысл такой "избавьтесь от всех инициализированных не нулем глобальных переменных - и выиграйте хоть 22 байта в памяти программ".
vitalik_1984 писал(а):Кстати использование глобальных переменных как раз немного сокращает размер кода в ущерб оперативке. Утверждение проверено насчет размера.
Проверяем:
1. куча глобальных "переменных-констант":

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

uint8_t var[20]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10};
int main (void)
{
  PORTB = var[0];
  PORTB = var[1];
  ...
  PORTB = var[19];
  while(1);
}
Итог флеш: 202 байта, ОЗУ: 20 байт.
2. просто константы:

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

int main (void)
{
  PORTB = 1;
  PORTB = 2;
  ...
  PORTB = 10;
  while(1);
}
Итог: флеш: 100 байт, ОЗУ: 0 байт.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

____Eugene____, а вы дальше раскрутить этот макрос не пробовали?
Попробуйте и многие вопросы сами отпадут.

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

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
        ^^^^^^^^                       ^^^^^^^^^^^^
        это тоже макрос                это тоже define
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2180
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение watchmaker »

1. куча глобальных "переменных-констант":
А если их запхнуть в enum?
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

a_skr писал(а):Итог: флеш: 100 байт, ОЗУ: 0 байт.
Я не про константы-переменные говорил, а про переменные.Хотя сейчас еще раз попробовал произвольный код вроде наоборот.
Видать от ситуации зависит :dont_know: я еще помню удивился - все советуют избавляться от глобальных переменных, а код меньше вышел.
Прошу прощения за ошибку.

Вот такой есть пример: ничем вроде от вашего способа не отличается по размеру:
Спойлер

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

#include <avr/io.h>

int main(void){
int c=7, a=5,b=6;
    PORTD=a;
    PORTB=b;
    PORTC=c;
    c=PIND;
while(1){}}

#include <avr/io.h>

int main(void){
int c;
    PORTD=5;
    PORTB=6;
    PORTC=7;
    c=PIND;
while(1){}
}
 
итого 76 байт (без c=PIND; 74 байта)
Или еще вот так:
Спойлер

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

#include <avr/io.h>
const int  a=5,b=6,c=7; 
int main(void){
    PORTD=a;
    PORTB=b;
    PORTC=c;
while(1){}} 
74байта
Просто нужно понимать для чего то или иное имя служит. Если это неизменяемое число, то и создавать на том же основании.
Kavka писал(а):____Eugene____, а вы дальше раскрутить этот макрос не пробовали?
Попробуйте и многие вопросы сами отпадут.

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

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
        ^^^^^^^^                       ^^^^^^^^^^^^
        это тоже макрос                это тоже define
Это не макрос, а объявление макроса :))
Я как то раз пробовал - по сути получается оба эти макроса указывают на одну и ту же ячейку памяти.
Как например для мега 8 прописано

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

#define OCR1A	_SFR_IO16(0x2A)
#define OCR1AL	_SFR_IO8(0x2A)
Смотрим по Таблице регистров ОЗУ что адрес младшего байта как раз совпадает с начальным адресом регистровой пары.
В поисках истины человек развивается.
____Eugene____
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт авг 31, 2010 18:26:35

Re: WinAvr в вопросах и ответах

Сообщение ____Eugene____ »

Kavka писал(а):а вы дальше раскрутить этот макрос не пробовали?
Попробуйте и многие вопросы сами отпадут.
попробовал
нашел вот это в одном файле

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

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
непонятно почему два разных макроса а одним именем _SFR_IO8(io_addr)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

vitalik_1984 писал(а):Это не макрос, а объявление макроса :))
:facepalm: Ой, ну да, да. И на старуху бывает проруха.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

Я так понимаю что каждый случай спечифичен и зависит сильно от компилятора и его оптимизаторских способностей.

Был код:

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

void fSomeFunck(void) {
   static unsigned char state=0;
   switch (state) {
      case 0:
         do_something();
         break;
      default:
         break;
   }
}
после того как конструкция свич была упрощена (ну т.е. сам оператор удален) размер кода увеличился.

Потом выяснилось что второй вариант занимает больше кода чем первый:

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

do {
  fSomeThing();
}
while(1);

while (1) {
  fSomeThing();
}
так что все очень специфично. Надо пробовать и пробовать.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

alex1126 писал(а):Потом выяснилось что второй вариант занимает больше кода чем первый
На сколько? Каким компилятором пользовались? Версия компилятора? Опции оптимизации?
На своём простеньком примере погонял - при одинаковых опциях оптимизации всё одинаково для
do {} while(1);
while(1) {};
for(;;) {};
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

Kavka писал(а):
alex1126 писал(а):Потом выяснилось что второй вариант занимает больше кода чем первый
На сколько? Каким компилятором пользовались? Версия компилятора? Опции оптимизации?
avr-gcc (WinAVR 20100110) 4.3.3.
опции -О3
на сколько не помню, если очень интересно могу вечерком глянуть.
На своём простеньком примере погонял - при одинаковых опциях оптимизации всё одинаково для
do {} while(1);
while(1) {};
for(;;) {};
я и писал что все очень специфично.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

А чем продиктован выбор опции -O3 ? Или места во флэше пока хватает? :)
Обычно -Os применяют.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

Kavka писал(а):А чем продиктован выбор опции -O3 ? Или места во флэше пока хватает? :)
Обычно -Os применяют.
Вот после такого: http://radiokot.ru/forum/viewtopic.php? ... 3#p1708883 опция -Os была заменена на -O3 и код стал более компактным.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

наврал я немного. Опция -О1. Единственная при которой код скомпилировался. С другими опциями ошибки выдает.
Аватара пользователя
Димаn
Открыл глаза
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Re: WinAvr в вопросах и ответах

Сообщение Димаn »

Доброй ночи! :shock:
Сломал когти о EEPROM... В файле Port.c пытаюсь "завести" переменную в EEPROM, и чтой то не получается (компилятором выдается ошибка, но что конкретно, почему то не пишет...). Подобная ситуация в основном файле делается успешно.... Голова уже не соображает... Вот кусочек из Port.c:

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

#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>    
#include "main.h"
#include "Port.h"
#include "Wake.h"
#include <util/setbaud.h>       


uint8_t EEMEM eeprombyte=0x10; 
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

Этот кусочек у меня не вызывает описанных вами ошибок.
Если вы не понимаете на "что конкретно" ругается компилятор, тогда тем более покажите всё что у вас пишет компилятор при компиляции.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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