美文网首页NB-IoT程序员
2019-10-24用定时器执行某个重要操作

2019-10-24用定时器执行某个重要操作

作者: 林定益想去NASA捡垃圾 | 来源:发表于2019-10-24 11:52 被阅读0次

当我们需要在程序中执行某个重要的操作的时候一般会怎么做?
首先,为了保证它一定会执行成功,大学期间的我肯定会加个循环,再加个延时,让它一直执行直到成功之后退出,类似于这样:

    while(set_result)
    {
        set_result = set_service_state(state, NULL);

        if((++Cnt) > 10)
        {
            break;
        }

        osDelay(1000);
    }

简单粗暴,常规用用似乎也没有什么问题。但是总觉得这样的程序不够优雅,可能在一些老鸟看来甚至有点愚蠢。
这样的程序,在没有使用操作系统开发的时候,可能是比较方便快捷的选择。
然而,在使用操作系统的时候,就应该充分利用操作系统的优点了,否则跟咸鱼有什么区别?
其实,关键思想也很简单,就是利用定时器和消息队列,类似于这样:

osTimerId_t g_sth_to_do_timer = NULL;

void sth_to_do_cb(osTimerId_t xTimer) 
{
    UNUSED(xTimer);
    if(do_sth == OK)
    {

    }
    else
    {
        send_to_incoming_queue();//执行失败发送到主任务中再执行一次
    }
}


void sth_to_to(void)
{
    if(NULL == g_sth_to_do_timer)
    {
        g_sth_to_do_timer = osTimerNew(sth_to_do_cb,osTimerOnce, NULL,NULL);
    }
    else if(osTimerIsRunning(g_sth_to_do_timer) == 1)
    {
        osTimerStop(g_sth_to_do_timer);
    }
    if(osTimerStart(g_sth_to_do_timer, (uint32_t)osMs2Tick((uint64_t)LWM2M_STATE_QUREY_TIMER * 1000)) != osOK)//每次执行的时间间隔
    {
        APP_COAP_INFO("sth to do failed");
    }
}


void main_task( void *unused_p )
{
    UNUSED(unused_p);

    for(;;)
    {
        if (osMessageQueueGet(incoming_queue, (void*)&msg, NULL, osWaitForever) == osOK )
        {
            switch(msg)
            {
                case 1:

                    break;

                case 2:
                    break;

                case TO_DO_STH:

                    sth_to_to();//在主任务中注册定时器及回调函数

                    break;

                default:
                    break;

            }
        }
    }
}

看起来是不是高级一点?

相关文章

  • 2019-10-24用定时器执行某个重要操作

    当我们需要在程序中执行某个重要的操作的时候一般会怎么做?首先,为了保证它一定会执行成功,大学期间的我肯定会加个循环...

  • Linux-内核定时器

    主要内容:Linux-定时器 知识点: 1.Linux定时器基础知识 1.1 定时器的使用范围(延后执行某个操作,...

  • CS193笔记 第十三讲 定时器和动画

    定时器(Timer)定时器就是在约定的某个时间一次性或重复地执行某个闭包。定时器在main queue执行, 动画...

  • iOS14开发-Timer

    定时器可以设置按固定周期执行某个操作。iOS 中主要有 3 种定时器,本文先讲解第一种 Timer。 使用 iOS...

  • DPDK编程指南(翻译)( 十一)

    11.定时器库 定时器库为DPDK执行单元提供定时器服务,使得执行单元可以为异步操作执行回调函数。定时器库的特性如...

  • JS setTimeout和setInterval的区别

    1.setTimeout和setInterval都属于JS中的定时器,可以规定延迟时间再执行某个操作,不同的是se...

  • iOS 中几种定时器说明

    在开发中经常需要使用定时器来做一些重复操作,执行某个方法,在iOS中主要有NSTimer、CADisplayLin...

  • 读书笔记:LLD3(4)内核定时器

    内核定时器可用来在未来的某个时间点(基于时钟滴答)调度执行的某个函数。 当定时器运行时,调度定时器的进程可能正在休...

  • This的指向总结

    1、//定时器中this的指向 结论:如果由定时器调用执行了某个函数,函数中有this,则这个this指向wind...

  • 7.C# 三种Timer

    简介:定时器一般用作「固定时间间隔」执行某个「任务」。 两种情况: 「固定时间间隔」执行某个「不耗时」任务 例...

网友评论

    本文标题:2019-10-24用定时器执行某个重要操作

    本文链接:https://www.haomeiwen.com/subject/kgyrvctx.html