FreeRTOS is not switching context between 2 tasks

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

FreeRTOS is not switching context between 2 tasks

跳至解决方案
3,014 次查看
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

标签 (1)
0 项奖励
回复
1 解答
2,868 次查看
PetrS
NXP TechSupport
NXP TechSupport

Hi,

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

BR, Petr

在原帖中查看解决方案

0 项奖励
回复
4 回复数
2,963 次查看
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 项奖励
回复
2,925 次查看
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 项奖励
回复
2,869 次查看
PetrS
NXP TechSupport
NXP TechSupport

Hi,

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

BR, Petr

0 项奖励
回复
2,863 次查看
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 项奖励
回复