【12】从0到1教你写uC/OS-III————>时间片

  1. RTOS需要一个时基来驱动,系统任务调度的频率等于该时基的频率;通常该时基由一个定时器来提供,也可以从其它周期性的信号源获得
  2. Crotex-M内核中有一个系统定时器SysTick,它内嵌在NVIC中,是一个24位的递减计算器,每计数一次时间为:1/SysClk;
  3. 当重载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,如此循环往复; 
  4. SysTick寄存器介绍:
    1. 初始化与裸机例程相同,暂不做详细介绍;
    2. 中断内放入调度函数OSSched();
  5. 例程:
    /*********************************************************
     * 函数名:void SysTick_Handler(void);
     * 描述  :中断,任务切换
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     **********************************************************/
    void SysTick_Handler(void)
    {
        OSTimeTick();   //时间片函数; 调度任务
    }
    
    /*********************************************************
     * 函数名:OSTimeTick(void)
     * 描述  :调用任务调度函数
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     **********************************************************/
    void OSTimeTick(void)
    {
        OSSched();  //任务调度
    }
    
    
    /*********************************************************
     * 函数名:void OS_CPU_SysTickInit(CPU_INT32U ms);
     * 描述  :设置中断频率为10ms
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     **********************************************************/
    void OS_CPU_SysTickInit(CPU_INT32U ms)
    {
        //设置重装载寄存器的值 
        SysTick->LOAD = ms * SystemCoreClock / 1000 - 1;
        
        //配置中断优先级为最低
        NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
        
        //复位当前计数器的值
        SysTick->VAL = 0;
        
        //选择时钟源、使能中断、使能计数器
        SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk|
                        SysTick_CTRL_TICKINT_Msk |
                        SysTick_CTRL_ENABLE_Msk;
    }
    
    
    
    
    
    
    int main(void)
    {
        OS_ERR  err;
        
        CPU_IntDis();
        
        OS_CPU_SysTickInit(10);
        
        OSInit(&err);   //初始化相关的全局变量
        
        OSTaskCreate(
                        (OS_TCB *)        &Task1TCB,
                        (OS_TASK_PTR)    Task1,
                        (void *)         0,
                        (CPU_STK*)       &Task1Stk[0],
                        (CPU_STK_SIZE)   TASK1_STK_SIZE,
                        (OS_ERR *)      &err
                     );
    
        OSTaskCreate(
                        (OS_TCB *)        &Task2TCB,
                        (OS_TASK_PTR)    Task2,
                        (void *)         0,
                        (CPU_STK*)       &Task2Stk[0],
                        (CPU_STK_SIZE)   TASK2_STK_SIZE,
                        (OS_ERR *)      &err
                     );
                                      
        OSRdyList[0].HeadPtr = &Task1TCB;
        OSRdyList[1].HeadPtr = &Task2TCB;
                    
             
        OSStrart(&err); //启动OS,无返回值  
    }
    
    void delay(uint32_t count)
    {
        for(;count!=0;count--);
    }
    
    void Task1(void *parg)
    {
        for(;;)
        {
            flag1 = 0;
            delay(100);
            flag1 = 1;
            delay(100);
            
           // OSSched();
        }
    }
    
    void Task2(void *parg)
    {
        for(;;)
        {
            flag2 = 0;
            delay(100);
            flag2 = 1;
            delay(100);
            
          //  OSSched();
        }
    }
    

     

  6. 总结:
    1. 中断是RTOS处理异常事件的重要机制;
    2. 为了处理任务延时、调度等一些与时间有关的事件,任何一个RTOS都应该有一个系统时钟;
    3. SysTick是嵌套在内核中的,所以使得OS在Crotex-M中编写的定时器代码不必修改,移植工作相对简单; 
    4. 中断的频率决定CPU的调度越高、系统的负荷就越重;一直在不断的进入中断;任务的执行时间就减小;
    5. uC/OS-III官方推荐的为10ms;或者高点也可以; 本例程采用10ms的中断频率; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值