SpenceKonde / megaTinyCore

Arduino core for the tinyAVR 0/1/2-series - Ones's digit 2,4,5,7 (pincount, 8,14,20,24), tens digit 0, 1, or 2 (featureset), preceded by flash in kb. Library maintainers: porting help available!
Other
545 stars 141 forks source link

Flash used by const variables not shown in calculated size of sketch and does not cause compile error! #95

Closed bitluni closed 4 years ago

bitluni commented 4 years ago

Edit by Spence - see my last few comments where the true cause of this apparent problem was discovered

Hi, I have used an array defined like this: const signed char soundsSamples[] = {..... it's about 10kb in size. However the compiler seems to be not uploading the constant data. The sketch size is still 2%. Not errors while compiling. Accessing the array seems to return values had been stored in the flash section before.

using same array with PREGMEM works as expected.

Device is ATTiny1604 jtag2udpi as programmer

Any ideas what's wrong? The instructions mentioned that const should work fine

SpenceKonde commented 4 years ago

That's not good!

Can you post a sketch that reproduces this issue?

SpenceKonde commented 4 years ago

My only quick thought is - when not using PROGMEM, you're not trying to access it using the pgmread... functions are you? Those don't work (if it's not declared PROGMEM), access it like a normal array - I'm wondering if the compiler is smart enough to recognize that you're accessing it in a way that will never see the data in the array and optimizing out the array.

bitluni commented 4 years ago

const w/o PROGMEM but with using pgmread does not change the behavior. I could imagine the size being a problem since other const arrays seem to work. try this sketch. it will be always 950bytes compiled no matter how long the array is:

`void setup() { }

const char a[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, -1, -1, 0, 0, 1, 0, -1, -1, -1, 0, 0, 1, 1, -2, -1, 2, 1, -2, 0, 0, -1, 0, 0, 0, 0, 2, 1, -1, 0, 1, 0, 1, -1, -1, 0, -1, -1, 1, 0, 1, 0, 0, 1, 2, -1, -1, 0, 1, -1, 0, 0, -2, };

void loop() { for(int i = 0; i < 256; i++) digitalWrite(0, (PinStatus)a[i]); }`

if you add volatile it will make the binary the proper size but it also consumes ram which is bad.

MCUdude commented 4 years ago

I'm seeing the same behavior when compiling for the Arduino UNO Wifi Rev2 and the Arduino Nano Every too. Both are ATmega4809 based. It may be a good idea to open an issue over at the official Arduino megaAVR core so that the Arduino devs can work on this.

SpenceKonde commented 4 years ago

Well that's unfortunate!

I guess we should figure out under what conditions const variables are left out by the compiler; it sounds like this is a compiler problem?

Or is the core sending the wrong commands to the compiler and leaving out a section?

SpenceKonde commented 4 years ago

Woah, woah, woah!

Check this out:

First, I added a few 1's near the beginning of the array. Second, I set the pin OUTPUT - which you had forgotten, so the current out of it when high would have been miniscule (very dim), and if wired such that LOW was on, would never turn the LED on. Thirdly, I added a delay to the loop just so you can see what was happening.

void setup(){pinMode(LED_BUILTIN,OUTPUT);} const char a[] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, -1, -1, 0, 0, 1, 0, -1, -1, -1, 0, 0, 1, 1, -2, -1, 2, 1, -2, 0, 0, -1, 0, 0,0, 0, 2, 1, -1, 0, 1, 0, 1, -1, -1, 0, -1, -1, 1, 0, 1, 0, 0, 1, 2, -1, -1, 0, 1, -1, 0, 0, -2,}; void loop() { for (int i = 0; i < 256; i++){ digitalWrite(LED_BUILTIN, (PinStatus)a[i]); delay(100); } }

This code works.

However, we still get bogus sketch sizes:

When uploading, we see that 1604 bytes of flash are uploaded: avrdude: verifying ... avrdude: 1604 bytes of flash verified

When COMPILING: Sketch uses 1348 bytes (8%) of program storage space. Maximum is 16384 bytes.

So the problem is that the compiler is not including the size of const variables in the reported size of the sketch.

From the readme, we list what we suspect to be a compiler bug.

Sometimes a sketch which is too big to fit will, instead of generating a message saying that, result in the error: 'relocation truncated to fit: R_AVR_13_PCREL against symbol tablejump2'.

I wonder if this is occurring when the sketch runs outside the memory limit only when counting the const data!

SpenceKonde commented 4 years ago

MUAHAHAHAAHAAAA!

void setup() { pinMode(LED_BUILTIN,OUTPUT); } //Create a const array too big to fit in ram - 2048 bytes on a chip with 2048 bytes of ram, of which some is used elsewhere. const unsigned long a[] = {2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2}; void loop() { for (int i = 0; i < 512; i++){ if(a[i]==2){ digitalWrite(LED_BUILTIN,HIGH); } else if (a[i]==1) { digitalWrite(LED_BUILTIN,LOW); } else { digitalWrite(LED_BUILTIN,LOW); while(1) {;} //hang forever. If we read any value that's not supposed to be in the array, indicating something awful happening, the blinking will stop and we'll know there's a problem! } delay(100); } }

Sketch uses 1350 bytes (8%) of program storage space. Maximum is 16384 bytes. Global variables use 22 bytes (1%) of dynamic memory, leaving 2026 bytes for local variables. Maximum is 2048 bytes.

avrdude: 3398 bytes of flash verified

This sketch runs, and the LED does not hang - which would not be possible if it were actually putting the array in RAM and not telling us.

1350+2048 = 3398, so the const array is not being reported in the sketch size!

Now, I pushed this further by extending the array from 2048 bytes to 15360, which would make the sketch too big to fit.... It compiles fine, but avrdude recognizes that it's trying to write to addresses out of range, and refuses to do so.

void setup() { pinMode(LED_BUILTIN,OUTPUT); }

void setup() { pinMode(LED_BUILTIN,OUTPUT); } //Create a const array too big to fit in flash with the rest of the sketch - 15360 bytes plus 1350 for the sketch itself, on a 16384b of flash: const unsigned long a[] = {2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2}; void loop() { for (int i = 0; i < 512; i++){ if(a[i]==2){ digitalWrite(LED_BUILTIN,HIGH); } else if (a[i]==1) { digitalWrite(LED_BUILTIN,LOW); } else { digitalWrite(LED_BUILTIN,LOW); while(1) {;} //hang forever. If we read any value that's not supposed to be in the array, indicating something awful happening, the blinking will stop and we'll know there's a problem! } delay(100); } }

avrdude: reading input file "C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex" avrdude: ERROR: address 0x4002 out of range at line 1025 of C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex avrdude: read from file 'C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex' failed

SpenceKonde commented 4 years ago

MUAHAHAHAHAH!!!!!!

C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.elf : section size addr .data 4 8402944 .text 1346 0 .rodata 15360 34114 .bss 18 8402948 .comment 17 0 .note.gnu.avr.deviceinfo 64 0 .debug_aranges 232 0 .debug_info 15643 0 .debug_abbrev 7309 0 .debug_line 2642 0 .debug_frame 156 0 .debug_str 5577 0 .debug_loc 1380 0 .debug_ranges 120 0 Total 49868

The const array goes into .rodata instead of .data

But in platform.txt we were doing:

recipe.size.regex=^(?:.text|.data|.bootloader)\s+([0-9]+).*

Changing that to

recipe.size.regex=^(?:.text|.data|.rodata|.bootloader)\s+([0-9]+).*

fixes the problem!

Man. Sometimes I'm so good I scare myself!

SpenceKonde commented 4 years ago

I just put in a PR with the official arduino megavr core to fix this there too.

SpenceKonde commented 4 years ago

@MCUdude - you have a megaavr core that needs this fix too right?

MCUdude commented 4 years ago

@SpenceKonde Yes, I do. Would you like to submit a PR?

bitluni commented 4 years ago

so it's only an output issue?

On Sun, Oct 13, 2019 at 9:16 AM Spence Konde (aka Dr. Azzy) < notifications@github.com> wrote:

MUAHAHAHAAHAAAA!

void setup() { pinMode(LED_BUILTIN,OUTPUT); } //Create a const array too big to fit in ram - 2048 bytes on a chip with 2048 bytes of ram, of which some is used elsewhere. const unsigned long a[] = {2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2}; void loop() { for (int i = 0; i < 512; i++){ if(a[i]==2){ digitalWrite(LED_BUILTIN,HIGH); } else if (a[i]==1) { digitalWrite(LED_BUILTIN,LOW); } else { digitalWrite(LED_BUILTIN,LOW); while(1) {;} //hang forever. If we read any value that's not supposed to be in the array, indicating something awful happening, the blinking will stop and we'll know there's a problem! } delay(100); } }

Sketch uses 1350 bytes (8%) of program storage space. Maximum is 16384 bytes. Global variables use 22 bytes (1%) of dynamic memory, leaving 2026 bytes for local variables. Maximum is 2048 bytes.

avrdude: 3398 bytes of flash verified

This sketch runs, and the LED does not hang - which would not be possible if it were actually putting the array in RAM and not telling us.

1350+2048 = 3398, so the const array is not being reported in the sketch size!

Now, I pushed this further by extending the array from 2048 bytes to 15360, which would make the sketch too big to fit.... It compiles fine, but avrdude recognizes that it's trying to write to addresses out of range, and refuses to do so.

avrdude: reading input file "C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex" avrdude: ERROR: address 0x4002 out of range at line 1025 of C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex avrdude: read from file 'C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex' failed

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/SpenceKonde/megaTinyCore/issues/95?email_source=notifications&email_token=ADCGI23SJVSCPUFKCTT2WTLQOLDNVA5CNFSM4I654HN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBCQGEA#issuecomment-541393680, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADCGI23LPQ7KA3ZDQD5VOPTQOLDNVANCNFSM4I654HNQ .

SpenceKonde commented 4 years ago

Yeah, the only thing that is (well, was) broken is that the ide was reporting the size of the sketch wrong, but compiling and uploading it correctly.


Spence Konde Azzy’S Electronics

New products! Check them out at tindie.com/stores/DrAzzy GitHub: github.com/SpenceKonde ATTinyCore: Arduino support for almost every ATTiny microcontroller Contact: spencekonde@gmail.com

On Sun, Oct 13, 2019, 12:16 bitluni notifications@github.com wrote:

so it's only an output issue?

On Sun, Oct 13, 2019 at 9:16 AM Spence Konde (aka Dr. Azzy) < notifications@github.com> wrote:

MUAHAHAHAAHAAAA!

void setup() { pinMode(LED_BUILTIN,OUTPUT); } //Create a const array too big to fit in ram - 2048 bytes on a chip with 2048 bytes of ram, of which some is used elsewhere. const unsigned long a[] =

{2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2}; void loop() { for (int i = 0; i < 512; i++){ if(a[i]==2){ digitalWrite(LED_BUILTIN,HIGH); } else if (a[i]==1) { digitalWrite(LED_BUILTIN,LOW); } else { digitalWrite(LED_BUILTIN,LOW); while(1) {;} //hang forever. If we read any value that's not supposed to be in the array, indicating something awful happening, the blinking will stop and we'll know there's a problem! } delay(100); } }

Sketch uses 1350 bytes (8%) of program storage space. Maximum is 16384 bytes. Global variables use 22 bytes (1%) of dynamic memory, leaving 2026 bytes for local variables. Maximum is 2048 bytes.

avrdude: 3398 bytes of flash verified

This sketch runs, and the LED does not hang - which would not be possible if it were actually putting the array in RAM and not telling us.

1350+2048 = 3398, so the const array is not being reported in the sketch size!

Now, I pushed this further by extending the array from 2048 bytes to 15360, which would make the sketch too big to fit.... It compiles fine, but avrdude recognizes that it's trying to write to addresses out of range, and refuses to do so.

avrdude: reading input file "C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex" avrdude: ERROR: address 0x4002 out of range at line 1025 of C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex avrdude: read from file 'C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex' failed

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub < https://github.com/SpenceKonde/megaTinyCore/issues/95?email_source=notifications&email_token=ADCGI23SJVSCPUFKCTT2WTLQOLDNVA5CNFSM4I654HN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBCQGEA#issuecomment-541393680 , or unsubscribe < https://github.com/notifications/unsubscribe-auth/ADCGI23LPQ7KA3ZDQD5VOPTQOLDNVANCNFSM4I654HNQ

.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/SpenceKonde/megaTinyCore/issues/95?email_source=notifications&email_token=ABTXEW6MEOXD5HC6FNPAYILQONCUFA5CNFSM4I654HN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBCZURQ#issuecomment-541432390, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABTXEW5QYUNQDAA3ERK5AMDQONCUFANCNFSM4I654HNQ .

bitluni commented 4 years ago

Thanks dudes, you are awesome!

Spence Konde (aka Dr. Azzy) notifications@github.com schrieb am So., 13. Okt. 2019, 18:28:

Yeah, the only thing that is (well, was) broken is that the ide was reporting the size of the sketch wrong, but compiling and uploading it correctly.


Spence Konde Azzy’S Electronics

New products! Check them out at tindie.com/stores/DrAzzy GitHub: github.com/SpenceKonde ATTinyCore: Arduino support for almost every ATTiny microcontroller Contact: spencekonde@gmail.com

On Sun, Oct 13, 2019, 12:16 bitluni notifications@github.com wrote:

so it's only an output issue?

On Sun, Oct 13, 2019 at 9:16 AM Spence Konde (aka Dr. Azzy) < notifications@github.com> wrote:

MUAHAHAHAAHAAAA!

void setup() { pinMode(LED_BUILTIN,OUTPUT); } //Create a const array too big to fit in ram - 2048 bytes on a chip with 2048 bytes of ram, of which some is used elsewhere. const unsigned long a[] =

{2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,2,1,1,1,2};

void loop() { for (int i = 0; i < 512; i++){ if(a[i]==2){ digitalWrite(LED_BUILTIN,HIGH); } else if (a[i]==1) { digitalWrite(LED_BUILTIN,LOW); } else { digitalWrite(LED_BUILTIN,LOW); while(1) {;} //hang forever. If we read any value that's not supposed to be in the array, indicating something awful happening, the blinking will stop and we'll know there's a problem! } delay(100); } }

Sketch uses 1350 bytes (8%) of program storage space. Maximum is 16384 bytes. Global variables use 22 bytes (1%) of dynamic memory, leaving 2026 bytes for local variables. Maximum is 2048 bytes.

avrdude: 3398 bytes of flash verified

This sketch runs, and the LED does not hang - which would not be possible if it were actually putting the array in RAM and not telling us.

1350+2048 = 3398, so the const array is not being reported in the sketch size!

Now, I pushed this further by extending the array from 2048 bytes to 15360, which would make the sketch too big to fit.... It compiles fine, but avrdude recognizes that it's trying to write to addresses out of range, and refuses to do so.

avrdude: reading input file

"C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex" avrdude: ERROR: address 0x4002 out of range at line 1025 of C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex avrdude: read from file

'C:\Users\Pete\AppData\Local\Temp\arduino_build_487809/arraytest.ino.hex' failed

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub <

https://github.com/SpenceKonde/megaTinyCore/issues/95?email_source=notifications&email_token=ADCGI23SJVSCPUFKCTT2WTLQOLDNVA5CNFSM4I654HN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBCQGEA#issuecomment-541393680

, or unsubscribe <

https://github.com/notifications/unsubscribe-auth/ADCGI23LPQ7KA3ZDQD5VOPTQOLDNVANCNFSM4I654HNQ

.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub < https://github.com/SpenceKonde/megaTinyCore/issues/95?email_source=notifications&email_token=ABTXEW6MEOXD5HC6FNPAYILQONCUFA5CNFSM4I654HN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBCZURQ#issuecomment-541432390 , or unsubscribe < https://github.com/notifications/unsubscribe-auth/ABTXEW5QYUNQDAA3ERK5AMDQONCUFANCNFSM4I654HNQ

.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/SpenceKonde/megaTinyCore/issues/95?email_source=notifications&email_token=ADCGI266GITI3OFLIPK3R6LQONECPA5CNFSM4I654HN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBCZ4OA#issuecomment-541433400, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADCGI25JHSQ5XI63N3UFNG3QONECPANCNFSM4I654HNQ .

MCUdude commented 4 years ago

Thanks dudes, you are awesome!

Well, thank you for providing such awesome Youtube content! I'm just a lucky subscriber that gets to thank you in person! 🎉