Here is a sample program that demonstrates the basics of initializing the library and starting a thread. It was originally written for the ATmega128.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr-thread.h>
// Thread stack
uint8_t fn_stack[128];
// Thread context
avr_thread_context fn_context;
// Thread code
void fn(void)
{
uint8_t state = 0;
for (;;) {
if (state)
PORTB &= ~0x02;
else
PORTB |= 0x02;
state = ! state;
}
}
int main(void)
{
// Setup port B as all output.
PORTB = 0xff;
DDRB = 0xff;
// Setup timer 2 mode. Include reset on overflow bit.
// Approximately 1.008 kHz for 4 MHz crystal.
TCCR2 = _BV(WGM21) | _BV(CS21) | _BV(CS20);
OCR2 = 62;
TCNT2 = 0;
TIMSK |= _BV(OCIE2);
// Initialize avr-thread library.
avr_thread_init();
sei();
// Start new thread
avr_thread_start(&fn_context,
fn, fn_stack, sizeof(fn_stack));
uint8_t state = 0;
for (;;) {
if (state)
PORTB &= ~0x01;
else
PORTB |= 0x01;
state = ! state;
}
}
uint32_t switch_count = 0;
// Task switcher
void SIG_OUTPUT_COMPARE2(void) __attribute__((naked));
void SIG_OUTPUT_COMPARE2(void)
{
sei();
avr_thread_isr_start();
switch_count++;
avr_thread_isr_end();
}