FreeRTOS is not switching context between 2 tasks

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

FreeRTOS is not switching context between 2 tasks

ソリューションへジャンプ
2,965件の閲覧回数
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,819件の閲覧回数
PetrS
NXP TechSupport
NXP TechSupport

Hi,

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

BR, Petr

元の投稿で解決策を見る

0 件の賞賛
返信
4 返答(返信)
2,914件の閲覧回数
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,876件の閲覧回数
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,820件の閲覧回数
PetrS
NXP TechSupport
NXP TechSupport

Hi,

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

BR, Petr

0 件の賞賛
返信
2,814件の閲覧回数
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 件の賞賛
返信