AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
07.11.2015, 02:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Понятия не имею.
Заявлено 300000 циклов.
|
|
|
|
07.11.2015, 14:16
|
|
Прописка
Регистрация: 18.01.2006
Сообщений: 268
Сказал спасибо: 81
Сказали Спасибо 476 раз(а) в 127 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Сообщение от STM32F0
|
Чушь! АСМ никак не заменяет чтение даташита. Так что АСМ никак не улучшает понимаемость происходящего в проце.
А причём здесь понимаемость к настройкам компилятора или линкера? У меня тоже месяц назад такое было, глюкнула студия и получил зашкал памяти. Ну и что?
Ещё раз, для понимания железа АСМ не нужен! Если у меня на F050 крутится хардварно семисегментник и хардварно крутится с десяток 18В20, то наверное я железо знаю? Что такое хардварно нужно объяснять?
|
Я вообще там где можно на С++ пишу, там где компилятор не поддерживает С++ style on C. На ARM7, BlackFin и др.
|
|
|
|
07.11.2015, 15:18
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Сообщение от omercury
|
И да, запись в PINx единичек инвертирует порт. Тоже одна команда ассемблера, но требуется загрузка регистра
|
Угу!
Цитата:
|
Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port.
|
Сообщение от omercury
|
Заявлено 300000 циклов.
|
Проехали. В СТМ8 можно одной командой одно и то же писать в ЕЕПРОМ сколько угодно, стирания то нет, только запись. Чтобы стереть нужно ещё и нуль записать.
|
|
|
|
07.11.2015, 22:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Сообщение от STM32F0
|
Угу!
|
SBI пишет один бит.
Сообщение от STM32F0
|
Чтобы стереть нужно ещё и нуль записать.
|
Я думал FF...
Понятно к чему это - перезаряда ячейки практически нет, поэтому и деградация минимальна. Скорей всего так и есть, хотя в тепличных условиях количество циклов перезаписи разными уровнями исчисляется миллионами.
|
|
|
|
08.11.2015, 23:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
О! да тут меряются!
Сообщение от oleg110592
|
GCC AVR 4.9.2, размер получился 140 байт, памяти 0 байт,
|
Сообщение от Easyrider83
|
STM8: 165 байт
|
добавил с программе из своего поста №11 запись в еепром + мелкие исправления. 48 байт.
AVRstudio 4,19,0,730
[.cseg] 0x000000 0x000048 48 0 48 4096 1.2%
Код:
|
.equ FCLK = 8000000 ; clock freq.
.equ TOCR = 1000 ; flash period 1000 ms
.equ NCNT1 = 256 ; timer prescaler
.def tmp1 = r16
.def tmp2 = r17
.cseg ;CODE segment
.org 0
rjmp start
.org OVF1addr
out eedr,tmp2
inc tmp2
sbi EECR, EEMPE ; start EEPROM write
sbi EECR, EEPE
start:
clr tmp2
out EEARL,tmp2
ldi tmp1,(1‹‹COM1A0)
sts TCCR1A,tmp1
ldi tmp1,(1‹‹WGM13)|(1‹‹WGM12)|(1‹‹CS12)
sts TCCR1B,tmp1
ldi tmp1,(1‹‹TOIE1)
sts TIMSK1,tmp1
ldi tmp1, high(FCLK*1000/(TOCR*2*NCNT1)-1)
sts ICR1h,tmp1
ldi tmp1, low(FCLK*1000/(TOCR*2*NCNT1)-1)
sts ICR1l,tmp1
sei
rjmp pc |
|
|
|
|
09.11.2015, 08:44
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Похоже причина разрастания объема найдена, случайно вчера наткнулся:
Цитата:
|
Например, в WinAVR есть занятная библиотечная функция __delay. С какого то бодуна туда впендюрили плавучку в аргумент. Спору нет - задержку выдает точно. А ежели забыться и заюзать эту байду с переменной, а не с константой, вычисляемой при компиляции, в код так весело и элегантненько добавится плавучки 4 кб и 256 байт RAM для "конверсии".
|
Сейчас попробовал:
Код:
|
uint16_t a;
int main(void)
{
DDRB |= 0x01;
while(1)
{
PORTB ^= (1‹‹0);
a++;
_delay_ms(a);
eeprom_write_byte((uint8_t*)0,0x55);
}
return 0;
} |
"свежий" GCC AVR выдал:
Цитата:
|
delay.h:163:2: error: __builtin_avr_delay_cycles expects a compile time integer constant __builtin_avr_delay_cycles(__ticks_dc);
|
"подключил" delay.h от WinAVR 2010 (компилятор остался GCC AVR 4.9.2), ошибок нет, действительно подросло:
Код:
|
Device: atmega48
Program: 928 bytes (22.7% Full)
(.text + .data + .bootloader)
Data: 2 bytes (0.4% Full)
(.data + .bss + .noinit) |
Последний раз редактировалось oleg110592; 09.11.2015 в 09:03.
|
|
|
|
20.11.2015, 16:21
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Добрый день!
Столкнулся с подобной проблемой, что и автор темы, поэтому решил новой темы не создавать, а спросить здесь.
Суть такова:
Понадобился мне для одной задачи тип long long (int64_t).
Создал min проект
#include ‹avr\io.h›
#include ‹stdio.h›
#include ‹util\delay.h›
#include ‹math.h›
volatile int64_t Var1 = 100;
int main (void)
{
Var1 =Var1*2/10+300-255;
while (1) {};
return 0;
}
В результате компилятор выдал:
Program: 4814 bytes (29.4% Full)
(.text + .data + .bootloader)
Data: 264 bytes (25.8% Full)
(.data + .bss + .noinit)
Вопрос в следующем, это у всех так или я чего то не так делаю?
Оптимизация выбрана -Os.
Пробовал тоже самое в IAR код получается раз в 5ть короче.
|
|
|
|
20.11.2015, 16:52
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
А что удивляет? Для меги int32_t уже тяжеловато, а вы ему int64_t подсовываете. Смиритесь!
|
|
|
|
20.11.2015, 17:15
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Сообщение от STM32F0
|
А что удивляет? Для меги int32_t уже тяжеловато, а вы ему int64_t подсовываете. Смиритесь!
|
Может быть и смирился если бы IAR не выдавал всего 808 байт против 4814 в GCC. Просто не могу поверить что GCC на столько хуже работает с числами. Возможно кто-то знает какие-то тонкости, настройки, что бы исправить ситуацию.
|
|
|
|
20.11.2015, 17:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2010
Сообщений: 1,752
Сказал спасибо: 158
Сказали Спасибо 640 раз(а) в 364 сообщении(ях)
|
Re: Минимальный проект на ATMega48 занял 100,6% памяти
Сообщение от AlexPi
|
Может быть и смирился если бы IAR не выдавал всего 808 байт против 4814 в GCC. Просто не могу поверить что GCC на столько хуже работает с числами. Возможно кто-то знает какие-то тонкости, настройки, что бы исправить ситуацию.
|
Скомпилируйте с ключом -S в ассемблерный текст и посмотрите.
Может IAR вычислил выражение еще на этапе компиляции, проигнорировав ключ volatile .
Потестил пример на Arduino IDE
Пустой скетч ~3900 байт .
Скетч с примером (объявление переменной и вычисление переменной в цикле) =4502 байт .
Доп. код ~600 байт .
Добавил еще одну переменную
volatile long long Var2 = 200;
и ее вычисление по типу первой. После компиляции 4584 байта. В + к предыдущему 82 байта.
Т.е. ~600 байт процедура работы с длинными целыми и 82 байта собственно на выражение.
Последний раз редактировалось Ar-Gen-Tum; 20.11.2015 в 20:14.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:02.
|
|