Hi,
It would be nice if you put some more examples on how to use
atomthreads. Let's say it would have 3 or 4 threads and some two
interrupts and the stack sizes explained. I'm novice in threads, so I
might be asking for too much, if so, then clarify me;)
Also, I'm very interested in using C++ with atom and it seems that it
works, so maybe you could give some explanation on how to do it
properly? I attach my test application that uses one C++ object.
Finally, I suggest that AVR_CPU_HZ in atomport.h was defined as:
#define AVR_CPU_HZ F_CPU
and that "atomport-asm.s" was renamed to "atomport-asm.S". Those two
changes will allow the atomthreads to integrate nicely with WinAVR (or
with Makefile from WinAVR, as I use it under Linux).
By the way, as you may notice I'm interested in AVR's, but it might change;)
--
Best regards,
Andrzej Telszewski
#include <avr/io.h>
#include "lcd.h"
extern "C" {
# include "atom.h"
# include "atomport.h"
# include "atomtimer.h"
}
#define IDLE_STACK_SIZE_BYTES 128
#define STARTUP_STACK_SIZE_BYTES 64
static uint8_t idle_thread_stack[IDLE_STACK_SIZE_BYTES];
static ATOM_TCB main_tcb;
static void main_thread_func (uint32_t data);
static ATOM_TCB lcd_tcb;
static void lcd_thread_func (uint32_t data);
int main()
{
if( ATOM_OK == atomOSInit(&idle_thread_stack[IDLE_STACK_SIZE_BYTES -
1]) )
{
avrInitSystemTickTimer();
if( ATOM_OK != atomThreadCreate( &lcd_tcb, 64, lcd_thread_func,
0, (POINTER)(RAMEND-STARTUP_STACK_SIZE_BYTES-128) ) )
{
goto _ATOM_FAILED;
}
if( ATOM_OK == atomThreadCreate( &main_tcb, 64,
main_thread_func, 0, (POINTER)(RAMEND-STARTUP_STACK_SIZE_BYTES)) )
{
atomOSStart();
}
}
_ATOM_FAILED:
while( 1 );
return 0;
}
static void main_thread_func (uint32_t data)
{
while( 1 )
{
PORTB |= _BV(PB0);
atomTimerDelay( 20 );
PORTB &= ~_BV(PB0);
atomTimerDelay( 20 );
}
}
static void lcd_thread_func (uint32_t data)
{
uint8_t sec = 35;
uint8_t min = 41;
uint8_t hour = 12;
while( 1 )
{
if( ++sec == 60 )
{
sec = 0;
if( ++min == 60 )
{
min = 0;
if( ++hour == 24 ) hour = 0;
}
}
lcd.clrscr();
lcd << pad() << (uint8_t)hour << ':' << (uint8_t)min << ':' <<
(uint8_t)sec;
atomTimerDelay( SYSTEM_TICKS_PER_SEC );
}
}