FreeRTOS on Atmel SAM3U in CrossStudio

dannyhaak wrote on Tuesday, September 06, 2011:

I try to get FreeRTOS running on a SAM3U(-EK devkit) in Rowley CrossStudio. While creating tasks goes fine, they do not seem to be executed.

What I did:
- Generate a CrossStudio project for the SAM3U-EK devkit (which includes Rowley start-up and configuration assembly files)
- Include FreeRTOS .c and .h file - take the config file from the SAM3U example project for IAR
- Copy simple task from demo
- Include lowlevel*.c/.h files from AT91LIB - including serveral drivers

It compiles fine. but when I put a breakpoint inside the task, it never gets executed.

My main.c:

// general includes
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
// includes for FreeRTOS
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
int i;
void vATaskFunction( void *pvParameters );
int main()
{
  i = xTaskCreate( vATaskFunction, "test", 200, NULL, tskIDLE_PRIORITY, NULL );
  vTaskStartScheduler();
 for ( ;; );
}
void vATaskFunction( void *pvParameters )
{
  for( ;; )
  {
    int j = 0;
    i  = i +5;
    vTaskDelay(250 / portTICK_RATE_MS);
  }
}

I guess something goes wrong with interrupts to execute ticks - but I’m lost where to fix this. Any help is really appreciated.

rtel wrote on Tuesday, September 06, 2011:

If you step through the call to vTaskStartScheduler() you will find the answer to why the scheduler is not starting.

My (almost certain) guess is that you have not populated the interrupt vector table with the interrupts required by FreeRTOS.  That means, you will get to the call to the SVC assembler instruction in vPortStartFirstTask() that is used to start the kernel, then just jump to the default SVC handler instead of the FreeRTOS SVC handler.

If this is the case then, then install xPortSysTickHandler, vPortSVCHandler, xPortPendSVHandler and xPortSysTickHandler in the appropriate places in the vector table.  Or, if the vector table is using CMSIS function names for the handlers, add the following lines to FreeRTOSConfig.h:

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler

regards.

dannyhaak wrote on Tuesday, October 11, 2011:

This did the trick - thank you.