FreeRTOS is not switching context between 2 tasks

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

FreeRTOS is not switching context between 2 tasks

Jump to solution
2,942 Views
karma_JC
Contributor I

Hi:

The setup is on MP5748G EVB.  I have setup 2 tasks with same priority using FreeRTOS in debug mode.  I have place 2 breakpoints in 2 different task entries.  Also, each task will blink different user LED on board.

After launched task scheduler, only Task1 is running.  Task2 will not get schedule, or only schedule once at beginning.  I don't see any context switching between 2 tasks being created.  Is there anything wrong????

The following is the code:

 

/*
 * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
 * Copyright 2016-2017 NXP
 * All rights reserved.
 *
 * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */
/* ###################################################################
**     Filename    : main.c
**     Processor   : MPC574xG
**     Abstract    :
**         Main module.
**         This module contains user's application code.
**     Settings    :
**     Contents    :
**         No public methods
**
** ###################################################################*/
/*!
** @file main.c
** @version 01.00
** @brief
**         Main module.
**         This module contains user's application code.
*/         
/*!
**  @addtogroup main_module main module documentation
**  @{
*/         
/* MODULE main */


/* Including necessary module. Cpu.h contains other modules needed for compiling.*/
#include "Cpu.h"
#include "FreeRTOS.h"
#include "clockMan1.h"
#include "pin_mux.h"
#include "task.h"

  volatile int exit_code = 0;
/* User includes (#include below this line is not maintained by Processor Expert) */
#include "clockMan1.h"
//#include "pins_driver.h"

#define PIN_LOW			0
#define PIN_HIGH		1

#define	LED_DELAY_MS		((TickType_t)1000/portTICK_PERIOD_MS)
#define	TSK_BASE_PRIORITY	(tskIDLE_PRIORITY + 2)

volatile int testValue = 0;
void vSystemInit(void);
void vTestTask(void *pParam);
void vTestTask2(void *pParam);
void vTickDelay(uint32_t ulCycles);
/*! 
  \brief The main function for the project.
  \details The startup initialization sequence is the following:
 * - startup asm routine
 * - main()
*/
int main(void)
{
  /* Write your local variable definition here */

  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  #ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of Processor Expert internal initialization.                    ***/

  /* Write your code here */
  /* For example: for(;;) { } */
    vSystemInit();

    PINS_DRV_WritePin(PTG, 2, 1);
    PINS_DRV_WritePin(PTG, 3, 1);
    PINS_DRV_WritePin(PTG, 4, 1);
    PINS_DRV_WritePin(PTG, 5, 1);

    xTaskCreate(vTestTask, (const char * const)"TestTask", configMINIMAL_STACK_SIZE, (void *)0, TSK_BASE_PRIORITY, NULL);
    xTaskCreate(vTestTask2, (const char * const)"TestTask", configMINIMAL_STACK_SIZE, (void *)1, TSK_BASE_PRIORITY, NULL);
    //xTaskCreate(vTestTask, (const char * const)"TestTask3", configMINIMAL_STACK_SIZE, (void *)2, TSK_BASE_PRIORITY+2, NULL);
    //xTaskCreate(vTestTask, (const char * const)"TestTask4", configMINIMAL_STACK_SIZE, (void *)3, TSK_BASE_PRIORITY+3, NULL);

    vTaskStartScheduler();

  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  #ifdef PEX_RTOS_START
    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of RTOS startup code.  ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;) {
    if(exit_code != 0) {
      break;
    }
  }
  return exit_code;
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

/* END main */
void vSystemInit()
{
	CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
					g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
	CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_FORCIBLE );

	PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
}

void vTestTask(void *pParam)
{
	uint32_t ulLED = (uint32_t)pParam;
	for(;;){
		//vTaskDelay(1000);
		//vTickDelay(1000000);
		PINS_DRV_WritePin(PTG, 2, 0);
		//testValue = (testValue + 1) % 100;
		//vTickDelay(1000000);
		PINS_DRV_WritePin(PTG, 2, 1);
		//vTaskDelay(LED_DELAY_MS);
		//vTaskDelay(LED_DELAY_MS);
	}
}

void vTestTask2(void *pParam)
{
	uint32_t ulLED = (uint32_t)pParam;
	for(;;){
		//vTaskDelay(1000);
		//vTickDelay(1000000);
		PINS_DRV_WritePin(PTG, 3, 0);
		//testValue = (testValue + 1) % 100;
		//vTickDelay(1000000);
		PINS_DRV_WritePin(PTG, 3, 1);
		//vTaskDelay(LED_DELAY_MS);
		//vTaskDelay(LED_DELAY_MS);
	}
}

void vTickDelay(uint32_t ulCycles)
{
	while(--ulCycles > 0);
}
/*!
** @}
*/
/*
** ###################################################################
**
**     This file was created by Processor Expert 10.1 [05.21]
**     for the NXP C55 series of microcontrollers.
**
** ###################################################################
*/

 

Thanks

James

Labels (1)
0 Kudos
Reply
1 Solution
2,796 Views
PetrS
NXP TechSupport
NXP TechSupport

Hi,

I just tried your code in demo example, see attached.

BR, Petr

View solution in original post

0 Kudos
Reply
4 Replies
2,891 Views
PetrS
NXP TechSupport
NXP TechSupport

Hi,

I tried your code on freertos_mpc5748g demo and it seems it is running on MPC5748G EVB. I just added PTG pins in pin_mux component.

PetrS_0-1650355864104.pngPetrS_1-1650355877098.pngPetrS_2-1650355891018.png

BR, Petr

0 Kudos
Reply
2,853 Views
karma_JC
Contributor I

Hi Petrs:

I tried again. But, it is not working for me.  I turned the FRZ to 0 as well.  Also, vTaskDelay is not returning as well.  Is there other settings need to take care???

Thanks

James

0 Kudos
Reply
2,797 Views
PetrS
NXP TechSupport
NXP TechSupport

Hi,

I just tried your code in demo example, see attached.

BR, Petr

0 Kudos
Reply
2,791 Views
karma_JC
Contributor I

Hi PetrS:

I got the task switching work couple days ago on FreeRTOS.  The only thing being changed is FRZ bit which related to VTaskDelay.  I'm not sure this being right solution for this issue.  When I turned off FRZ bit in configuration, everything work fine.

Thanks

James

0 Kudos
Reply