b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

硬件定时器_freertos 硬件定时器_linux硬件定时器应用层(2)

电脑杂谈  发布时间:2017-01-29 16:19:43  来源:网络整理

如上所示, 调用函数 xTimerCreate申请,配置定时器, 通过 xTimerStart 启动定时器, 当定时器计数溢出时, 系统回调注册的函数。

定时器可以设置为一次性 One-shot 或者自动重载 Auto-reload 两种, 第一种溢出后停止定时器, 第二种溢出后会再次启动定时器。

硬件定时器_linux硬件定时器应用层_freertos 硬件定时器

在申请定时器的时候设置的定时器周期, 可以通过函数 xTimerChangePeriod 修改, 如下示例 :

 void vAFunction_2( TimerHandle_t xTimer )
 {
     // 判断定时器是否处于运行状态
     if( xTimerIsTimerActive( xTimer ) != pdFALSE )
     {
         /* xTimer is active, do something. */
     }
     else
     {
         // 处于这个状态的定时器, 可能由于 : 
         // 1 定时器 create 后没有start
         // 2 一次性定时器执行溢出后

         // 修改定时器周期
         if( xTimerChangePeriod( xTimer, 
                /*修改定时周期*/
                500 / portTICK_PERIOD_MS, 
            /*允许阻塞最大时间 100 ticks*/
            100 ) == pdPASS )
         {
             // update fail
             // 阻塞 100 tick 仍然无法发送命令

             // 删除定时器 释放对应内存!
             xTimerDelete( xTimer );
         }
         else 
         {
             // 定时器配置更新成功, 并已经启动 !!
         }
    } 
 }

如上, 该函数会修改定时器并使定时器 开始运行!!!

另外, 可以通过函数 xTimerReset 重启定时器, 如果已经启动计数, 重新开始计数; 如果没有启动,启动定时器。freertos 硬件定时器

定时器使用系统提供 API,涉及 Queue 操作, 如果是在中断程序中调用,需要调用对应带 FromISR的接口。

其他获取定时器信息的函数

// 获取名称 , 申请是设置的字符串
pcTimerGetName()
// 定时器溢出周期
xTimerGetPeriod()
// 返回定时器溢出的时间点 (--> xTaskGetTickCount())
xTimerGetExpiryTime()

FreeRTOS 软定时器的实现在源码目录 , 涉及 链表 和 消息队列(后续文章分析)。

使用定时器前,需要先申请定时器, 见 中, 通过函数 xTimerCreate获取一个定时器, 实际上是向系统申请了一块内存存储定时器控制块的数据结构, 并将参数填写到该结构体中。

xTIMER

typedef struct tmrTimerControl
{
    // 定时器名 方便调试
    const char *pcTimerName;
    // 链表项 用于插入定时链表
    ListItem_t xTimerListItem;
    // 定时器中断周期
    TickType_t xTimerPeriodInTicks;
    // 是否自动重置, 如果 =pdFalse 为一次性
    UBaseType_t uxAutoReload;
    // 溢出计数 需自己设置
    void *pvTimerID;
    // 定时器溢出回调函数
    TimerCallbackFunction_t pxCallbackFunction;
    #if( configUSE_TRACE_FACILITY == 1 )
        UBaseType_t uxTimerNumber;
    #endif
    #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && 
        ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
        // 标记定时器使用的内存, 删除时判断是否需要释放内存
        uint8_t ucStaticallyAllocated;  #endif
} xTIMER;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29404-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...