• ucosIII_软件定时器


    1.定时器API。文件 OS_Tmr.c

    1.1创建定时器

    void  OSTmrCreate (OS_TMR               *p_tmr,
                       CPU_CHAR             *p_name,
                       OS_TICK               dly,
                       OS_TICK               period,
                       OS_OPT                opt,
                       OS_TMR_CALLBACK_PTR   p_callback,
                       void                 *p_callback_arg,
                       OS_ERR               *p_err)

    1.2.开始定时器

    CPU_BOOLEAN  OSTmrStart (OS_TMR  *p_tmr,
                             OS_ERR  *p_err)

    1.3.停止定时器

    CPU_BOOLEAN  OSTmrStop (OS_TMR  *p_tmr,
                            OS_OPT   opt,
                            void    *p_callback_arg,
                            OS_ERR  *p_err)

    2.定时器回调函数

    软件定时器的定时精度不如硬件定时器,最小定时时间取决于OS_systick的最小时间。

    systick的时间由下面两个宏定义确定

    文件:os_cfg_app.c

    OS_RATE_HZ     const  OSCfg_TickRate_Hz          = (OS_RATE_HZ  )OS_CFG_TICK_RATE_HZ;

    文件:os_cfg_app.h

    #define  OS_CFG_TICK_RATE_HZ            200u               /* Tick rate in Hertz (10 to 1000 Hz)                     */

    一个systick是1s/200=50ms在创建定时器的时候第3.4个参数都是传x个systick的时间。

    这里注意一下dly period opt p_callback这几个参数

    dly参数:第一次启动定时器的延时时间(具体图片在后面博客链接中)

    period参数:这个参数是定时器的定时时间

    opt参数:

      OS_OPT_TMR_ONE_SHOT:定时器只触发一次
      OS_OPT_TMR_PERIODIC:定时器循环触发
    无论是单次触发还是循环触发,dly和period参数都有效。
    p_callback参数:是我们先定义的一个函数,把函数名字传进去,当定时器定时时间到了自动执行这个函数,这个函数又用户实现。
     
    下面做个实验:创建一个定时器每1s给串口发送一次数据
    定义定时器:
    OS_TMR  usarttmr;
    定义回调函数:
    void SoftwareTimercallbackForUsrat(void *p_tmr, void *p_arg);     //定时器1回调函数

    创建定时器

        OSTmrCreate((OS_TMR        *)&usarttmr,        
                    (CPU_CHAR    *)"SoftwareTimercallbackForUsrat",        
                    (OS_TICK     )20,            //20*5=100ms    
                    (OS_TICK     )200,           //200*5=1s            
                    (OS_OPT         )OS_OPT_TMR_PERIODIC
    ,     //单次定时器
                    (OS_TMR_CALLBACK_PTR)SoftwareTimercallbackForUsrat,    //定时器回调函数
                    (void        *)0,            
                    (OS_ERR        *)&err);

    开启定时器:

    OSTmrStart(&usarttmr,&err);

    定时器回调函数:

    //定时器usart的回调函数
    void SoftwareTimercallbackForUsrat(void *p_tmr,void *p_arg)
    {
        static u8 num = 0;    OS_ERR err;
        num++;         
    
        LED1 = ~LED1;
        printf("UCOSIII软件定时器测试1秒
    ");
    
    }

    结果:

     一开始定时器无法工作,经过调试发现是dly和period写反了。dly可以写0,period是定时器定时时间,我们要写的是这个参数。关于dly的具体介绍在下面这篇博客中。

    开启定时器的OSTmrStart函数可以写在任务中,不必紧挨着创建定时器的地方。

    参考资料

    【UCOSIII】UCOSIII软件定时器 https://blog.csdn.net/qq_38410730/article/details/80821152

  • 相关阅读:
    iOS开发之--隐藏状态栏
    iOS开发之--iPhone X 适配:MJRefresh上拉加载适配
    iOS开发之--为UITextField监听数值变化的三种方法
    ios开发之--为父view上的子view添加阴影
    iOS开发之--在UIWindow上展示/移除一个View
    iOS开发之--Masonry多个平均布局
    CocoaPods更新过程中出现的坑及解决方法
    那些已成定局的人和事
    两个陌生人的对话
    好好写代码吧,没事别瞎B去创业!
  • 原文地址:https://www.cnblogs.com/1024E/p/13417098.html
Copyright © 2020-2023  润新知