FreeRTOS and ATMega8

Hi,

Did anyone succeede using FreeRTOS on ATMega8?

I changed main.c from the ATMega323 demo expecting to get a LED on PORTB.2 blinking but this most don't work. Idle and Flashing threads start (at least code is entered) but I do not get the LED blinking whatever my routine is. I have not much debug tools...

I tried to tweak parameters in portmacro.h (portMAX_PRIORITIES to 1, portMINIMAL_STACK_SIZE between 5 and 20) but this does not bring the code to work.

Below you will find main.c.

Regards

#include #include

#include "projdefs.h" #include "portable.h" #include "task.h"

static void vLEDFlashTask( void *pvParameters );

portSHORT main( void ) { outp( 0x04, DDRB ); outp( 0x00, DDRC ); outp( 0x00, DDRD );

outp( 0xff, PORTB ); outp( 0xff, PORTC ); outp( 0xff, PORTD );

sTaskCreate( vLEDFlashTask, ( const portCHAR * const ) "LEDx", portMINIMAL_STACK_SIZE, NULL, 1, ( xTaskHandle * ) NULL );

vTaskStartScheduler( portUSE_PREEMPTION );

return 0; }

static void vLEDFlashTask( void *pvParameters ) { for(;;) { portTickType xFlashRate = ( portTickType ) 200; xFlashRate /= portTICKS_PER_MS; xFlashRate /= ( portTickType ) 2;

cbi( PORTB, 2 ); vTaskDelay( xFlashRate ); sbi( PORTB, 2 ); vTaskDelay( xFlashRate ); } }

Reply to
sap
Loading thread data ...

A couple of things:

1) Have you tested your LED initialisation code in isolation?

If you write a simple main() function as per .... :

portSHORT main( void ) { unsigned portSHORT s;

outp( 0x04, DDRB ); outp( 0x00, DDRC ); outp( 0x00, DDRD );

outp( 0xff, PORTB ); outp( 0xff, PORTC ); outp( 0xff, PORTD );

for(;;) { /* Crude delay. */ for( s = 0; s < 999; s++ );

cbi( PORTB, 2 );

/* Crude delay. */ for( s = 0; s < 9999; s++ );

sbi( PORTB, 2 ); } }

.... does the LED flash?

2) The ATMega8 only has 1K of RAM. Have you adjusted the memory pool sizes? Are you absolutely sure the task is being created, it might not be if the allocation is failing?

3) Have you tried running the code in the simulator that comes with AVR Studio (this is free for download from the Atmel site). This should allow you to see exactly what is going on.

4) Have you read the instructions on the WEB site regarding using other devices? In addition you will need to change the included header file at the top of Source\portable\GCC\ATMega323\portmacro.h from the ATMega323 header file to the ATMega8 header file.

6) portMINIMAL_STACK should be around 80 - definately not between 5 and 20 - it has to hold 30 registers!

If you are still having difficulties - email me directly using the address on the FreeRTOS WEB site contact page. If you send me your test program project (all files including makefile, etc.) I will be able to help you out.

Regards, Richard.

formatting link

Reply to
Richard

Hi,

sizes?

That was my error as I wrote yesterday. It works much better with 45 bytes per task.

#define portMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 45 )

Is this what you mean the pool or are there other parameters?

That was checked by toggling LED state. Allocation succeeded even for very short stack sizes but tasks could not run.

I have to learn how to use it... I will.

Was done. In fact, I've read all the source and learned a lot :-)

20 -

I thought less RAM would mean lower stack size...

Is there something else than portMINIMAL_STACK to tweak for 1k RAM?

out.

many thanks :-)

Reply to
sap

Ok, I see: inside portheap.c. For the time being I fell pretty confortable, small tasks are running and the remaining will sure be more clear during comming days. Regards

/*-----------------------------------------------------------

  • Very basic block allocation scheme. This is tailored exactly for the demo

  • application needs and should be tuned or replaced for any other application.

*----------------------------------------------------------*/

/* Compiler include files. */

#include

/* Scheduler include files. */

#include "projdefs.h"

#include "portable.h"

#define heapSMALL_BLOCK_SIZE ( ( unsigned portSHORT ) 45 )

#define heapLARGE_BLOCK_SIZE portMINIMAL_STACK_SIZE

/* These are the number of blocks required by the demo application. */

#define heapNUM_SMALL_BLOCKS ( 16 )

#define heapNUM_LARGE_BLOCKS ( 10 )

/* Each block contains the data area and a variable that marks the block as

empty of full. */

Reply to
sap

Hi again,

The stack size required by a task is the same no matter how much RAM you have available. Less RAM just means fewer tasks.

See

formatting link
but bare in mind that the use of malloc and free can require some configuration on low end microcontrollers.

Regards, Richard.

formatting link

demo

as

Reply to
Richard

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.