WinAvr в вопросах и ответах
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: WinAvr в вопросах и ответах
Ага обычная команда, а загрузка адреса это еще пара команд на один байт. Либо прибавление к паре Z тоже пара команд.
Вас что то не поймешь, получается по вашим словам, что все таки меньше места занимает чтение из флеш одна команда против 11. Я так полагаю там не одна команда.
Вас что то не поймешь, получается по вашим словам, что все таки меньше места занимает чтение из флеш одна команда против 11. Я так полагаю там не одна команда.
- Реклама
-
____Eugene____
- Открыл глаза
- Сообщения: 47
- Зарегистрирован: Вт авг 31, 2010 18:26:35
Re: WinAvr в вопросах и ответах
почему условие выполняется при pack=-100 и др отрицательных
volatile char pack=-100 ;
if(pack>0)
{
led_off;
bit_ind++;
pack=-20;
}
volatile char pack=-100 ;
if(pack>0)
{
led_off;
bit_ind++;
pack=-20;
}
Re: WinAvr в вопросах и ответах
Загрузка адреса - само собой. Я - не сторонник чего-то определенного из вышесказанного, просто дал мысли - что иногда можно соптимизировать. Экономим ОЗУ - не создаем констант-переменных (дико звучит), используем локальные переменные, и т.д... есть много способов.
Предлагая убрать все константы-переменные и инициализированные переменные (не нулем) - и тем самым сэкономить память программ флеш (на 11 команд) - я вовсе не предлагал читать их из флеш.
p.s.
Предлагая убрать все константы-переменные и инициализированные переменные (не нулем) - и тем самым сэкономить память программ флеш (на 11 команд) - я вовсе не предлагал читать их из флеш.
p.s.
потому что в другом месте программы его что-то меняет на положительное или, Вы, например, приказали компилятору char считать беззнаковым.____Eugene____ писал(а):почему условие выполняется при pack=-100 и др отрицательных
volatile char pack=-100 ;
-
____Eugene____
- Открыл глаза
- Сообщения: 47
- Зарегистрирован: Вт авг 31, 2010 18:26:35
Re: WinAvr в вопросах и ответах
как произвести запись по адресу
#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)
он перестает работать?
#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 в вопросах и ответах
Хе а откуда же тогда вы их прочитаетеa_skr писал(а):я вовсе не предлагал читать их из флеш.
Кстати использование глобальных переменных как раз немного сокращает размер кода в ущерб оперативке. Утверждение проверено насчет размера.
Один для доступа к 8 битной ячейке, второй для 16. А изменять не имеет смысла.макросы одинаковые но я полагаю выполняются по разному ?
- Реклама
-
____Eugene____
- Открыл глаза
- Сообщения: 47
- Зарегистрирован: Вт авг 31, 2010 18:26:35
Re: WinAvr в вопросах и ответах
то есть это не совсем макросы?второй для 16. А изменять не имеет смысла.
Re: WinAvr в вопросах и ответах
1. Да, из флеш в виде команд загрузки констант, что занимает меньше места и выполняется быстрее загрузки значений из переменных-констант в ОЗУ. 2. Нет, не меньше 11 команд. Про 11 команд смысл такой "избавьтесь от всех инициализированных не нулем глобальных переменных - и выиграйте хоть 22 байта в памяти программ".vitalik_1984 писал(а):Хе а откуда же тогда вы их прочитаетеa_skr писал(а):я вовсе не предлагал читать их из флеш.из космоса? Все равно из флешь, только в виде команды загрузки константы. Далее если таких констант много неужели это будет занимать меньше места, чем упомянутые вами 11 команд?
Проверяем: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);
}
2. просто константы:
Код: Выделить всё
int main (void)
{
PORTB = 1;
PORTB = 2;
...
PORTB = 10;
while(1);
}Re: WinAvr в вопросах и ответах
____Eugene____, а вы дальше раскрутить этот макрос не пробовали?
Попробуйте и многие вопросы сами отпадут.
Попробуйте и многие вопросы сами отпадут.
Код: Выделить всё
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
^^^^^^^^ ^^^^^^^^^^^^
это тоже макрос это тоже defineКогда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2180
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: WinAvr в вопросах и ответах
А если их запхнуть в enum?1. куча глобальных "переменных-констант":
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: WinAvr в вопросах и ответах
Я не про константы-переменные говорил, а про переменные.Хотя сейчас еще раз попробовал произвольный код вроде наоборот.a_skr писал(а):Итог: флеш: 100 байт, ОЗУ: 0 байт.
Видать от ситуации зависит
Прошу прощения за ошибку.
Вот такой есть пример: ничем вроде от вашего способа не отличается по размеру:
Спойлер
Код: Выделить всё
#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){}
}
Или еще вот так:
Спойлер
Код: Выделить всё
#include <avr/io.h>
const int a=5,b=6,c=7;
int main(void){
PORTD=a;
PORTB=b;
PORTC=c;
while(1){}} Просто нужно понимать для чего то или иное имя служит. Если это неизменяемое число, то и создавать на том же основании.
Это не макрос, а объявление макроса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 в вопросах и ответах
попробовал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)Re: WinAvr в вопросах и ответах
vitalik_1984 писал(а):Это не макрос, а объявление макроса
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: WinAvr в вопросах и ответах
Я так понимаю что каждый случай спечифичен и зависит сильно от компилятора и его оптимизаторских способностей.
Был код:
после того как конструкция свич была упрощена (ну т.е. сам оператор удален) размер кода увеличился.
Потом выяснилось что второй вариант занимает больше кода чем первый:
так что все очень специфично. Надо пробовать и пробовать.
Был код:
Код: Выделить всё
void fSomeFunck(void) {
static unsigned char state=0;
switch (state) {
case 0:
do_something();
break;
default:
break;
}
}
Потом выяснилось что второй вариант занимает больше кода чем первый:
Код: Выделить всё
do {
fSomeThing();
}
while(1);
while (1) {
fSomeThing();
}Re: WinAvr в вопросах и ответах
На сколько? Каким компилятором пользовались? Версия компилятора? Опции оптимизации?alex1126 писал(а):Потом выяснилось что второй вариант занимает больше кода чем первый
На своём простеньком примере погонял - при одинаковых опциях оптимизации всё одинаково для
do {} while(1);
while(1) {};
for(;;) {};
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: WinAvr в вопросах и ответах
avr-gcc (WinAVR 20100110) 4.3.3.Kavka писал(а):На сколько? Каким компилятором пользовались? Версия компилятора? Опции оптимизации?alex1126 писал(а):Потом выяснилось что второй вариант занимает больше кода чем первый
опции -О3
на сколько не помню, если очень интересно могу вечерком глянуть.
я и писал что все очень специфично.На своём простеньком примере погонял - при одинаковых опциях оптимизации всё одинаково для
do {} while(1);
while(1) {};
for(;;) {};
Re: WinAvr в вопросах и ответах
А чем продиктован выбор опции -O3 ? Или места во флэше пока хватает?
Обычно -Os применяют.
Обычно -Os применяют.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: WinAvr в вопросах и ответах
Вот после такого: http://radiokot.ru/forum/viewtopic.php? ... 3#p1708883 опция -Os была заменена на -O3 и код стал более компактным.Kavka писал(а):А чем продиктован выбор опции -O3 ? Или места во флэше пока хватает?![]()
Обычно -Os применяют.
Re: WinAvr в вопросах и ответах
наврал я немного. Опция -О1. Единственная при которой код скомпилировался. С другими опциями ошибки выдает.
Re: WinAvr в вопросах и ответах
Доброй ночи!
Сломал когти о EEPROM... В файле Port.c пытаюсь "завести" переменную в EEPROM, и чтой то не получается (компилятором выдается ошибка, но что конкретно, почему то не пишет...). Подобная ситуация в основном файле делается успешно.... Голова уже не соображает... Вот кусочек из Port.c:
Сломал когти о 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; Re: WinAvr в вопросах и ответах
Этот кусочек у меня не вызывает описанных вами ошибок.
Если вы не понимаете на "что конкретно" ругается компилятор, тогда тем более покажите всё что у вас пишет компилятор при компиляции.
Если вы не понимаете на "что конкретно" ругается компилятор, тогда тем более покажите всё что у вас пишет компилятор при компиляции.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


