/***************************************************************************************************** * 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(); } }
/** * \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(); }
//------------------------------------------------------------------- // 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; }