AnsweredAssumed Answered

S32K148 SysTick_Handler

Question asked by 张 舜毅 on Aug 21, 2019
Latest reply on Sep 25, 2019 by Victor Jimenez

//====================================================================================
//函数名称 : u8 BSPSysTickInit(u32 time, u8 busClock)
//输入参数 : time:配置时间[1,200000](0.001ms即1us) busClock:总线时钟≥1(M)
//输出参数 : 初始化结果 TRUE:成功 FALSE:失败
//函数功能 : 系统闹钟定时中断驱动模块初始化
//注意事项 : BSP调用,系统us级定时
//===================================================================================
u8 BSPSysTickInit(u32 time, u8 busClock)
{
      //u32 clkTime = 0;

      //参数错误
      if((0 == time) || (time > 200000) || (0 == busClock))
      {
           return(FALSE);
        }

      S32_SysTick->RVR = 0xFFFFFF;//350ms
      //S32_SysTick->RVR = 0xBB3F;//1ms
      S32_SysTick->CVR = S32_SysTick_CVR_CURRENT(0);
      S32_SysTick->CVR = 0;
      S32_SysTick->CSR = S32_SysTick_CSR_TICKINT(1) | S32_SysTick_CSR_ENABLE(1);

      return(TRUE);
}

 

//====================================================================================
//函数名称 :void SysTick_Handler(void)
//输入参数 : void
//输出参数 : void
//函数功能 : 系统闹钟定时中断程序
//注意事项 : 底层调用,用于系统1ms定时
//====================================================================================
void SysTick_Handler(void)

{

      BSPCosRefur();

}

 

//====================================================================================
//函数名称 : void BSP_ENTER_CRITICAL(void)
//输入参数 : void
//输出参数 : void
//函数功能 : 进入临界区域(禁止中断)
//注意事项 :
//====================================================================================
void BSP_ENTER_CRITICAL(void)
{
      INT_SYS_DisableIRQGlobal();
}

//====================================================================================
//函数名称 : void BSP_EXIT_CRITICAL(void)
//输入参数 : void
//输出参数 : void
//函数功能 : 切换出临界区域(使能中断)
//注意事项 :
//====================================================================================
void BSP_EXIT_CRITICAL(void)
{
      INT_SYS_EnableIRQGlobal();
}

 

//====================================================================================
//函数名称 : void BSPCosRefur(void)
//输入参数 : void
//输出参数 : void
//函数功能 : 中断执行函数,设定COS任务标志
//注意事项 : 1ms定时中断调用
//====================================================================================
void BSPCosRefur(void)
{
      u8 i = 0;
      t_COS *pcos;

      sCOSTimer++;
   
      pcos = &sCosTbl[0];

      if(sCOSTimer >= COS_MAX_USEABLE_TIME)
      {
            for(i = 0; i < COS_MAX_NUM; i++)
            {
                  if(pcos->CosCtr != 0x0ffffffff)
                  {
                        pcos->CosCtr -= COS_MAX_USEABLE_TIME;
                  }
                  pcos++;
               }

         sCOSTimer -= COS_MAX_USEABLE_TIME;
         }

      pcos = &sCosTbl[0];
      for(i = 0; i < COS_MAX_NUM; i++)
      {
            if(pcos->CosEn == 1)
            {
                  if(pcos->CosCtr <= sCOSTimer)
                  {
                        pcos->CosRdy = 1;
                  }
            }
      pcos++;
      }
}

 

u32 watchcounter = 0;
//===================================================================================
//函数名称 : int main(void)
//输入参数 : void
//输出参数 : void
//函数功能 : 主函数,自动执行
//注意事项 :
//====================================================================================
int main(void)
{
      BSPSystemInit(); //初始化

      for(;;)
      {
            BSPCosTask((void *)0); //执行COS任务
            //watchcounter++;
      }
}

 

hello !

I have a question now.

When I use the system timer to interrupt, the interrupt works, the main function works, and the "watchcounter" variable counts normally.

But when I switch to my g task, the interrupt gets stuck and my "BSPCosTask((void *)0)" task doesn't work properly. Why?Is my Systick_Handler configuration abnormal?

Outcomes