I am a beginner at freeRTOS and trying to make multiple tasks. When I run Example 2(provided in Example Codes) in Windows 10, it runs perfectly and I get the following output:-
Task 1 is running
Task 2 is running
Task 1 is running and so on
But when I run the same code on my FRDM-K64F board, Task 2 Does’nt even run and I only get :-
Task 1 is running
Task 1 is running
Task 1 is running …
The code on FRDM-K64F is as follows:-
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "timers.h"
/* Freescale includes. */
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "board.h"
#include "pin_mux.h"
#include "clock_config.h"
/*******************************************************************************
* Definitions
******************************************************************************/
/* Task priorities. */
#define hello_task_PRIORITY (configMAX_PRIORITIES - 1)
/*******************************************************************************
* Prototypes
******************************************************************************/
static void hello_task(void *pvParameters);
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief Application entry point.
*/
#define mainDELAY_LOOP_COUNT ( 0xffffff )
/* The task function. */
void vTaskFunction( void *pvParameters );
/* Define the strings that will be passed in as the task parameters. These are
defined const and off the stack to ensure they remain valid when the tasks are
executing. */
const char *pcTextForTask1 = "Task 1 is running\r\n";
const char *pcTextForTask2 = "Task 2 is running\r\n";
int main(void)
{
/* Init board hardware. */
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
xTaskCreate( vTaskFunction,
"Task 1",
1000,
(void*)pcTextForTask1,
1, /* This task will run at priority 1. */
NULL ); /* We are not using the task handle. */
xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 1, NULL );
vTaskStartScheduler();
/* The following line should never be reached because vTaskStartScheduler()
will only return if there was not enough FreeRTOS heap memory available to
create the Idle and (if configured) Timer tasks. Heap management, and
techniques for trapping heap exhaustion, are described in the book text. */
for( ;; );
return 0;
}
void vTaskFunction( void *pvParameters )
{
char *pcTaskName;
volatile uint32_t ul;
/* The string to print out is passed in via the parameter. Cast this to a
character pointer. */
pcTaskName = ( char * ) pvParameters;
/* As per most tasks, this task is implemented in an infinite loop. */
for( ;; )
{
/* Print out the name of this task. */
printf( pcTaskName );
/* Delay for a period. */
for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
{
/* This loop is just a very crude delay implementation. There is
nothing to do in here. Later exercises will replace this crude
loop with a proper delay/sleep function. */
}
}
}
Have you installed the FreeRTOS interrupt handlers? See the “Special
note to ARM Cortex-M users” in the to Q1 on this page of the FAQ: https://www.freertos.org/FAQHelp.html
I have also been experimenting with the task priorities. If I keep the priority 1 or 2 of both the tasks, task1 keeps on running. If I keep priority of both the tasks greater than 2(I tested on 3,4,5) Task 2 Keeps on running.
Just sounds like the interrupts are not installed.
Are you calling FreeRTOS API functions from interrupts?
I see you have the three lines in your FreeRTOSConfig.h, but are the
interrupt actually getting installed? If the vector table is populated
with functions called SVC_Handler, PendSV_Handler and SysTick_Handler,
which is normal, then they should be.
Hello,
I am running freeRTOS with the default SDK provided by NXP. I have two tasks named User1 and User2. I am learning semaphores and interrupts. I suspend both the tasks and want them to run when a switch is presses(SW3 on FRDM-64F) therefore I added the Resum function for both tasks in the Switch’s ISR. Whenever I press the switch I get stuck up in Config Assert.
In this Case ulCurrentInterrupt is 75 which I cross checked from the Interrupt Vector Table. However ucCurrentPriority gets a value of 0. When I try to view the value of pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; it gives me
Details:0x20030000 <error: Cannot access memory at address 0x20030000>
Default:0x20030000 <error: Cannot access memory at address 0x20030000>
Decimal:537067520
In freeRTOSConfig.h Following is the interrupt Config: -``
#define configPRIO_BITS __NVIC_PRIO_BITS // __NVIC_PRIO_BITS = 4
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1U << (configPRIO_BITS)) - 1) //15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) //240
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) //32
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler`
If you are calling a FreeRTOS API function from an interrupt then the
priority of the interrupt must be at or below
configMAX_SYSCALL_INTERRUPT_PRIORITY - which on an ARM means a
numerically lower number. All interrupts default to a priority of 0 -
which is the highest priority - so you must manually set the interrupt’s
priority to a lower logical (higher numerical) value before using it.
More information is here (this is more complex than it needs to be on a
Cortex-M):