示例#1
0
/*****************************************************************************************************                                                                        
*   Function: SchM_Start
*
*   Description: Starts the scheduler
*
*   Caveats:
*****************************************************************************************************/
void SchM_Start(void)
{
    u16 index_a; 
    u16 index_b;
    u16 index_ControlBlock;
    /*Start the timer for the OS tick*/
    Gpt_StartTimer(CHANNEL_0, 500u);
    //Gpt_StartTimer(CHANNEL_1, 20000u);
    //Gpt_StartTimer(CHANNEL_2, 40020u);
    /*Enable notification*/
    Gpt_EnableNotification(CHANNEL_0);
    Gpt_EnableNotification(CHANNEL_1);
    Gpt_EnableNotification(CHANNEL_2);
    
    /* Initialize Dispacher Array Vector */
    for(index_a=0U;index_a < MAX_PRIORITY;index_a++)
    {
      for(index_b=0U;index_b < CNF_MAXTASKQUEUE;index_b++)
      {
         DispacherArray[index_a][index_b] = 0xFFFF;            
      }
    }
    
    BackgroundControlBlock.BackgroundContextSave.CCR_TaskContext_u16   = 0U;
    BackgroundControlBlock.BackgroundContextSave.D_TaskContext_u16     = 0U;
    BackgroundControlBlock.BackgroundContextSave.X_TaskContext_u16     = 0U;
    BackgroundControlBlock.BackgroundContextSave.Y_TaskContext_u16     = 0U;
    BackgroundControlBlock.BackgroundContextSave.PC_TaskContext_u16    = 0U;
    BackgroundControlBlock.BackgroundContextSave.PPAGE_TaskContext_u16 = 0U;
    BackgroundControlBlock.BackgroundContextSave.SP_TaskContext_u16    = 0U;
    BackgroundControlBlock.BackgroundInterrupted                       = TASK_NOPREEMPTED;

    TaskControlBlock = ((Task_Control_Block *__far)Mem_Alloc((MAX_NUM_TASK*sizeof(Task_Control_Block))));
    for(index_ControlBlock=0U;index_ControlBlock < MAX_NUM_TASK;index_ControlBlock++)
    {
      TaskControlBlock[index_ControlBlock].Task_ID                                  = TaskConfigInitial->ptr_Task[index_ControlBlock].Task_ID;
      TaskControlBlock[index_ControlBlock].Task_Priority                            = TaskConfigInitial->ptr_Task[index_ControlBlock].Task_Priority;
      TaskControlBlock[index_ControlBlock].Task_State                               = SUSPENDED;
      TaskControlBlock[index_ControlBlock].Stack_Information.StartAddress           = 0U;
      TaskControlBlock[index_ControlBlock].Stack_Information.EndAddress             = 0U;
      TaskControlBlock[index_ControlBlock].Task_Deadline.Relative                   = 0U;
      TaskControlBlock[index_ControlBlock].Task_Deadline.Absolute                   = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.CCR_TaskContext_u16     = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.D_TaskContext_u16       = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.X_TaskContext_u16       = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.Y_TaskContext_u16       = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.PC_TaskContext_u16      = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.PPAGE_TaskContext_u16   = 0U;
      TaskControlBlock[index_ControlBlock].Task_ContextSave.SP_TaskContext_u16      = 0U;
      TaskControlBlock[index_ControlBlock].Task_Interrupted                         = TASK_NOPREEMPTED;
      TaskControlBlock[index_ControlBlock].Task_Mode                                = PERIODIC;
    }
    
    while(1)
    {
      SchM_Background();
      _FEED_COP();
    }

}
示例#2
0
/**
* \brief    Scheduler start
* \author   Gerardo Valdovinos
* \param    void
* \return   void     
*/
void SchM_Start(void)
{
    /* Initialize OsTick timer */
    Gpt_EnableNotification(0);
    Gpt_StartTimer(0);
    
    /* Go to a background task */
    SchM_Background();
}
示例#3
0
//-------------------------------------------------------------------
// period is in "ticks" !!
void Gpt_StartTimer(Gpt_ChannelType channel, Gpt_ValueType period_ticks)
{
	int confCh;

	VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_STARTTIMER_SERVICE_ID, GPT_E_UNINIT );
	VALIDATE( VALID_CHANNEL(channel), GPT_STARTTIMER_SERVICE_ID, GPT_E_PARAM_CHANNEL );
	VALIDATE( (Gpt_Unit[channel].state != GPT_STATE_STARTED), GPT_STARTTIMER_SERVICE_ID, GPT_E_BUSY );
	// GPT_E_PARAM_VALUE, all have 32-bit so no need to check

	//DEBUG(DEBUG_HIGH, "Gpt_StartTimer ch=%d, period=%d [ticks]\n", channel, period_ticks);

	confCh = Gpt_Global.channelMap[channel];

	if (channel <= GPT_CHANNEL_CNT)
	{
		uint32 *tlval = (uint32 *)&(TimAddr[channel]->ARR);
		uint32 *tval = (uint32 *)&(TimAddr[channel]->CNT);

		*tlval = period_ticks;
		*tval = period_ticks;

		// always select interrupt
		//TimAddr[channel]->DIER |= TIM_DIER_UIE;

		// Make sure that no interrupt is pending.
		TimAddr[channel]->SR &= ~TIM_SR_UIF;

		// Set prescaler.
		TimAddr[channel]->PSC = Gpt_Global.config[confCh].GptChannelPrescale;

		// Enable timer
		TimAddr[channel]->CR1 |= (TIM_CR1_CEN | TIM_CR1_URS | TIM_CR1_DIR);
		TimAddr[channel]->CR1 &= ~TIM_CR1_UDIS;
	}
	#if ( GPT_ENABLE_DISABLE_NOTIFICATION_API == STD_ON )
	if( Gpt_Global.config[confCh].GptNotification != NULL )
	{
		// GPT275
		Gpt_EnableNotification(channel);
	}
	#endif
	Gpt_Unit[channel].state = GPT_STATE_STARTED;
	Gpt_Unit[channel].expiredWhenStopped = FALSE;
}