I also doubt parasitic capacitance is the issue here. I simulated a circuit with 100pF to ground (a huge amount) and a faux mosfet gate termination. and only saw ~5mA though it with rise/fall times of 100ns. If your rise times are much faster you will see more current, but according to this post:
How solder inductance affects RF circuits?
you'd be lucky ...
You are not using an external "Crystal Oscillator", you have an external crystal.
An external oscillator is an active device that produces a signal by itself, a crystal (or a resonator) is a passive component that is a resonant element to control the frequency of the oscillator internal to the AVR.
This is a fairly common error that people make that is not ...
Is there a good way to solve this with virtually no overhead?
There is no practical way to get 'virtually no overhead' in C on AVR. Code that looks like it should have low overhead often doesn't, and you have to look at the disassembly to see the real code.
AVR has a RISC architecture that needs many instructions to do 'simple' operations. IN, OUT, and SBI/...
Unfortunately you can't have a pointer to certain bit of port directly.
If a struct that for each led contains both the port address and bit index is too wasteful, use one more level of indirection.
I introduce a concept of LED Handle which is simply a byte to conveniently point indirectly to an IO port and bit in it.
First, generate a table that contains ...
How about a structure of the addresses?
//PORTD = 0x10000
void * 0x10000;
void * 0x10001;
void * 0x10002;
// PORTB = 0x20000
void * 0x20000;
void * 0x20001;
Then you can iterate over the structure.
I think since you have absolutely NO experience, you should learn with an arduino uno board. These boards are ready-to use for beginners and include an ATmega328p AVR microcontroller. You can find tons of tutorials on the internet for the Arduino device family and there's a lot to learn. Have fun!