New to RTOS need help (STM32)

jackkpl wrote on Tuesday, June 03, 2008:

Hello

I have been playing with microprocessor programming for a while and now i am starting to dive into RTOS world. I succesfully ran demo application for ST Primer. Now i would like to create a simples application (1 task) that would toggle a specified PIN on and off on my prototype board (which is tested and works with other code). I have a STM32F101C6T6 processor. I tried to run this code, but it doesn’t work.

int main( void )
{

    prvSetupHardware();

    /* Start the tasks defined within this file/specific to this demo. */
   xTaskCreate( prvTestTask, ( signed portCHAR * ) "Test", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );       

    /* Start the scheduler. */
    vTaskStartScheduler();
   
    /* Will only get here if there was not enough heap space to create the
    idle task. */
    return 0;
}

void prvTestTask( void *pvParameters )
{
   portTickType xLastWakeTime;
   const portTickType xFrequency = 1;
   // Initialise the xLastWakeTime variable with the current time.
   xLastWakeTime = xTaskGetTickCount();
    for( ;; )
    {
      ToggleLed();
      vTaskDelayUntil( &xLastWakeTime, xFrequency );
    }
}

void ToggleLed(void){
   if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12)==0){     
      GPIO_SetBits(GPIOB, GPIO_Pin_12);
   }
   else{
      GPIO_ResetBits(GPIOB, GPIO_Pin_12);
   }
}

When i run ToggleLed in infinite loop in main (not launch kernel) it seems to work. Any help will be appreciated. One information that may be useful. When i run application and pause it it shows 0x0 address as PC and executes CMP R0, #0x0. I am not an assembler guy (i have some basics, but i always used C as lowest level programming language). IF anyone could provide simplest "toggle the ping" example of task which works on this processor i will be really grateful.

Regards
Jacek

rtel wrote on Thursday, June 05, 2008:

How did you create the project.  Was it based on your existing and working primer project, or was it created from scratch?  Maybe there is a compiler option problem, there is nothing obviously wrong in your code.

Regards.

jackkpl wrote on Thursday, June 05, 2008:

Hello

Thank you for reply. By trial and error i noticed that in order to run freeRTOS on Cortex M3  you need to include in the project crt0_STM32x.c which does some things with interrupt vectors etc. Without it scheduling task doesn’t work (probably rtos cannot manage interrupts). Now , when i just added this file to my project it works and “hello world” - blinking led is now making me really happy :slight_smile: