Scheduler not working for stm32 in keil?

Hello Friends, I want to port FREERTOS for my STM32F100RB(ARM CM3) discovery board. I don’t know why it’s not working when I scheduled something using scheduler it won’t work I have ported it using the manual methods I have added the bare minimum 5 file like task.c, port.c(selected from the RVDS ARM CM3),list.c, queue.c and heap_4.c.Also added the include in paths with separate “freertosconfig.h”.i know for every porting 2 files are very important port.c(which I selected from ARM cortex RVDS CM3) and the “Freertosconfig.h”.i am attaching my Keil project picture (right now I don’t have right to attach complete project because I am new user).please help …point to note here that when I compile i get 0 error and 0 warning but still its not working…!

Preemption is already enabled here at(#define configUSE_PREEMPTION 1). I am attaching Freertosconfig.h:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/

#define configUSE_PREEMPTION		1
#define configUSE_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#define configCPU_CLOCK_HZ			( ( unsigned long ) 8000000 )	
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES		( 5 )
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 6 * 1024 ) )
#define configMAX_TASK_NAME_LEN		( 16 )
#define configUSE_TRACE_FACILITY	0
#define configUSE_16_BIT_TICKS		0
#define configIDLE_SHOULD_YIELD		1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 		0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet		1
#define INCLUDE_uxTaskPriorityGet		1
#define INCLUDE_vTaskDelete				1
#define INCLUDE_vTaskCleanUpResources	0
#define INCLUDE_vTaskSuspend			1
#define INCLUDE_vTaskDelayUntil			1
#define INCLUDE_vTaskDelay				1

/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY 		255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	191 /* equivalent to 0xb0, or priority 11. */


/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15.  This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.  Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY	15

#endif /* FREERTOS_CONFIG_H */

also the code is given below:

/*******Scheduler includes*******/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
/*******app related header******/
#include "stm32f10x.h" // Device header

void delay(void);
void task1(void *);
void task2(void *);
void gpio_init(void);

int main()
{
  gpio_init();
  xTaskCreate(task1,"task_1",300,NULL,1,NULL);
  xTaskCreate(task2,"task_2",300,NULL,2,NULL);
  vTaskStartScheduler();
  return 0;
}

void gpio_init(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  GPIO_InitTypeDef gpio_c;
  gpio_c.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_8;
  gpio_c.GPIO_Speed=GPIO_Speed_50MHz;
  gpio_c.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC,&gpio_c);	
}


void task1(void *parameter)
{
 while(1)
 {
   GPIO_SetBits(GPIOC,GPIO_Pin_8);
   vTaskDelay(1000);
   GPIO_ResetBits(GPIOC,GPIO_Pin_8);
   vTaskDelay(1000);
 }	 
  //vTaskDelete(NULL);
}

void task2(void *parameter)
{
 while(1)
 {
   GPIO_SetBits(GPIOC,GPIO_Pin_9);
   vTaskDelay(1000);
   GPIO_ResetBits(GPIOC,GPIO_Pin_9);
   vTaskDelay(1000);
 }	 
  //vTaskDelete(NULL);
}

 
void delay(void)
	{
volatile int i = 10000000; /* About 1/4 second delay */
while (i-- > 0);
//asm("nop");
}

I have tested the above code without RTOS means just basic blink its perfectly fine but with freertos its not working .

Hi Shrikant,

did you register your sys tick and port svc handler IRQs at the right places of your interrupt vector table? If yes, do you reach either when you set breakpoints on the ISRs?

1 Like

No sir , I don’t know anything related to this can you please tell me how I can register systick and svc handler. ok, i find systick and svc in startup.s(attached image)…what to change here sir…

also please tell how can I debug it properly…thanks and regards

Look ok so far. Next thing to do is set breakpoints onto SysTickHandler and SVC_Handler and run your app, then see if your breakpoints are hit.

Other issue: You write “with freertos its not working.” You need to be more specific about “not working.” What happens after vTaskStartScheduler() is called? Do you end up in a fault? If not: When your setup is “not working,” and you stop the CPU, where in the code is it? Idle task?

1 Like

@shri There is also a good FAQ worth reading.
I’d also strongly recommend to define configASSERT and also enable stack overflow checking for development/debugging.

1 Like

You need the following three lines in your FreeRTOSConfig.h:

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

These rename FreeRTOS handlers to the ones installed by the startup code (as shown in your image).

Thanks.

1 Like

This info is in the FAQ linked above.

1 Like

Thank you so much Gaurav Sir…and all the forum’s member it’s solved my problem…but one thing I cant understand sir, that i copied the “freertosconfig.h” from one of the demo folders of ARM CM3(Keil/RVDS for stm32f103) if mine “freertosconfig.h” is incomplete than that one also?
one more thing sir if possible can you explain to me the use/purpose of these three lines?I am new here in Freeertos?

Thankyou Richard sir…thankyou for answer…its solved my problem

Thank you hartmut sir.yes in future i will follow these macros for effective debugging…thanks sir…

Is this a demo from us? Where did you download it from?

The first FAQ on this page explains it (look for the note “Special note to ARM Cortex-M users”): FreeRTOS - Open Source RTOS Kernel for small embedded systems

Thanks.

Yes sir i have copied this “Freertosconfig.h” from “FreeRTOSv10.4.1\FreeRTOSv10.4.1\FreeRTOS\Demo\CORTEX_STM32F103_Keil” .I want FREERTOS Team must update this with new “Freertosconfig.h” having these 3 lines:
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
so that like me no one can stuck here… anyway thanks for your help

If you look at the startup code in that project, FreeRTOS handlers are directly installed in the vector table: FreeRTOS/STM32F10x.s at main · FreeRTOS/FreeRTOS · GitHub

So, no change is needed there.

Thanks.