- ссылка на аддон из вот этого видео
https://www.youtube.com/watch?v=5hSZSTNsgM0
Ну мне уже стало интересно ))) Ща…
Оооопачки!!!
uint16_t note[7] = {1911, 1432, 1517, 1432, 956, 956, 1911};
uint8_t i ;
uint32_t ms ;
void setup() {
// pinMode(PB2, OUTPUT);
DDRB |= (1 << PB2);
i = 0;
ms = millis();
}
void loop() {
ms = millis();
do {
digitalWrite(PB2, HIGH);
delayMicroseconds(note[i]);
digitalWrite(PB2, LOW);
delayMicroseconds(note[i]);
} while (millis() - ms < 500);
ms = millis();
digitalWrite(PB2, LOW);
delay(10);
i++;
if (i == 7) {
digitalWrite(PB2, LOW);
delay(500);
i = 0;
}
}
Вывод:
Скетч использует 548 байт (54%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 14 байт (43%) динамической памяти, оставляя 18 байт для локальных переменных. Максимум: 32 байт.
6 байт сэкономил прямом доступом к регистру “на вывод”…
Ну собственно вот и причина - содержимое файла
ATtiny10Core-addon/hardware/avr/2.1.0/cores/tiny/wiring_time.c
Спойлер
#include <Arduino.h>
void delay(uint32_t ms) {
#if defined(_TINY10_MILLIS_IMPLEMENT) && defined(_TINY10_TIMER_INIT)
uint32_t start = millis();
while (millis() - start < ms); // Делей на миллисе если он есть
#else
while (ms) { // Или цикл
_delay_ms(1); // С фикс. делеем
ms--;
}
#endif
}
void delayMicroseconds(uint32_t us) {
while (us) { // Тут всегда цикл
_delay_us(1);
us--;
}
}
#ifdef _TINY10_MILLIS_WDT // Миллис на WDT
volatile uint32_t _wdt_millis_cnt = 0; // Счетчик
uint32_t millis(void) { // Миллис
return (uint32_t)_wdt_millis_cnt; // Возвразаем счетчик
}
ISR(WDT_vect) { // Прерывание WDT
_wdt_millis_cnt += 16; // Добавляем 16 (шаг 16 мс)
}
#endif
#ifdef _TINY10_MILLIS_IMPLEMENT // Полноценный ардуиновский millis/micros
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)
#define MICROS_MULT (64 / clockCyclesPerMicrosecond())
volatile uint32_t timer0_overflow_count = 0;
volatile uint32_t timer0_millis = 0;
static uint8_t timer0_fract = 0;
uint32_t millis(void) {
return (uint32_t)timer0_millis;
}
uint32_t micros(void) {
return (uint32_t)(((timer0_overflow_count << 8) + TCNT0) * MICROS_MULT);
}
ISR(TIM0_OVF_vect) {
timer0_millis += MILLIS_INC;
timer0_fract += FRACT_INC;
if (timer0_fract >= FRACT_MAX) {
timer0_fract -= FRACT_MAX;
timer0_millis++;
}
timer0_overflow_count++;
}
#endif
Поддержка миллис требует 17 байт оперативки. А у ТС я насчитал 19 байт
Итого 17 +19 = 36 , а в наличии всего 32
так вранье же… как все у гайвера.
В самом аддоне только на поддержку миллис тратится 17 байт, может и что есть, не искал
А почему миллис 17 байт?
Так глобальные ЖЕ )))
Это как это так 534? ))
Я всё свежее ставил (правда на 1.8.19)
Немного обсчитался, 13.
Строчки 23, 41, 42 и 43 по листингу из #24
И плюс еще байт, наверно, 12 - локальных
Ты мне лучше обьясни, как вот эти три строки
uint16_t note[7] = {1911, 1432, 1517, 1432, 956, 956, 1911};
uint8_t i ;
uint32_t ms ;
сочетаются с сообщением ИДЕ о 14 байтах глобальных переменных???
Я 11 насчитал… Итого 14 + 11 = 25 байт, но даже если 12 - то будет 26 байт, всё в норме…
Тоже не очень понял…
не могу))
сам сижу глаза луплю))
оптимизация
и те 5 байт в 31 байт уложились ))
У меня цифры другие… они не укладываются Ж)
Так что ТС гонит, что не работает ))
одну ноту выкинуть и оставить только до ре ми до ре до
Я видел, откуда 12 байт то локальных?
Распиши…