LiteOS-M小型系统内核之软件定时器——开发指导

jiecho
发布于 2021-7-21 18:14
浏览
0收藏

软件定时器

开发指导

接口说明

OpenHarmony LiteOS-M内核的软件定时器模块提供下面几种功能,接口详细信息可以查看API参考。

表 1 软件定时器接口

功能分类

接口名

描述

创建、删除定时器

LOS_SwtmrCreate

创建定时器

LOS_SwtmrDelete

删除定时器

启动、停止定时器

LOS_SwtmrStart

启动定时器

LOS_SwtmrStop

停止定时器

获得软件定时器剩余Tick数

LOS_SwtmrTimeGet

获得软件定时器剩余Tick数

开发流程

软件定时器的典型开发流程:

  1. 配置软件定时器。

    • 确认配置项LOSCFG_BASE_CORE_SWTMR和LOSCFG_BASE_IPC_QUEUE为1打开状态;
    • 配置LOSCFG_BASE_CORE_SWTMR_LIMIT最大支持的软件定时器数;
    • 配置OS_SWTMR_HANDLE_QUEUE_SIZE软件定时器队列最大长度;
  2. 创建定时器LOS_SwtmrCreate。

    • 创建一个指定计时时长、指定超时处理函数、指定触发模式的软件定时器;
    • 返回函数运行结果,成功或失败;
  3. 启动定时器LOS_SwtmrStart。

  4. 获得软件定时器剩余Tick数LOS_SwtmrTimeGet。

  5. 停止定时器LOS_SwtmrStop。

  6. 删除定时器LOS_SwtmrDelete。

 说明:

  • 软件定时器的回调函数中不要做过多操作,不要使用可能引起任务挂起或者阻塞的接口或操作。
  • 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级设定为0,且不允许修改 。
  • 系统可配置的软件定时器资源个数是指:整个系统可使用的软件定时器资源总个数,而并非是用户可使用的软件定时器资源个数。例如:系统软件定时器多占用一个软件定时器资源数,那么用户能使用的软件定时器资源就会减少一个。
  • 创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。
  • 创建单次不自删除属性的定时器,用户需要调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。

编程实例

实例描述

在下面的例子中,演示如下功能:

  1. 软件定时器创建、启动、删除、暂停、重启操作。
  2. 单次软件定时器,周期软件定时器使用方法。

示例代码

前提条件:

  • 在los_config.h中,将LOSCFG_BASE_CORE_SWTMR配置项打开。
  • 在los_config.h中,将LOSCFG_BASE_CORE_SWTMR_ALIGN配置项关闭,示例代码中演示代码不涉及定时器对齐。
  • 配置好LOSCFG_BASE_CORE_SWTMR_LIMIT最大支持的软件定时器数。
  • 配置好OS_SWTMR_HANDLE_QUEUE_SIZE软件定时器队列最大长度。

代码实现如下:

#include "los_swtmr.h"

/* Timer count */
UINT32 g_timerCount1 = 0;   
UINT32 g_timerCount2 = 0;

/* 任务ID */
UINT32 g_testTaskId01;

void Timer1_Callback(UINT32 arg) // 回调函数1 
{
    UINT32 tick_last1;
    g_timerCount1++;
    tick_last1=(UINT32)LOS_TickCountGet(); // 获取当前Tick数
    printf("g_timerCount1=%d, tick_last1=%d\n", g_timerCount1, tick_last1);
}  

void Timer2_Callback(UINT32 arg) // 回调函数2 
{
    UINT32 tick_last2;
    tick_last2=(UINT32)LOS_TickCountGet();
    g_timerCount2++;
    printf("g_timerCount2=%d tick_last2=%d\n", g_timerCount2, tick_last2);
}  

void Timer_example(void)  
{
    UINT32 id1; // timer id
    UINT32 id2; // timer id
    UINT32 uwTick;

    /*创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */ 
    LOS_SwtmrCreate (1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1);

    /*创建周期性软件定时器,每100Tick数执行回调函数2 */
    LOS_SwtmrCreate(100, LOS_SWTMR_MODE_PERIOD, Timer2_Callback, &id2, 1);
    printf("create Timer1 success\n");

    LOS_SwtmrStart (id1); //启动单次软件定时器 
    printf("start Timer1 sucess\n");

    LOS_TaskDelay(200); //延时200Tick数
    LOS_SwtmrTimeGet(id1, &uwTick); // 获得单次软件定时器剩余Tick数
    printf("uwTick =%d\n", uwTick);

    LOS_SwtmrStop(id1); // 停止软件定时器
    printf("stop Timer1 sucess\n");

    LOS_SwtmrStart(id1);
    LOS_TaskDelay(1000);

    LOS_SwtmrDelete(id1); // 删除软件定时器
    printf("delete Timer1 sucess\n");

    LOS_SwtmrStart(id2); // 启动周期性软件定时器
    printf("start Timer2\n");

    LOS_TaskDelay(1000);
    LOS_SwtmrStop(id2);
    LOS_SwtmrDelete(id2);
}

UINT32 Example_TaskEntry(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S task1;

    /* 锁任务调度 */
    LOS_TaskLock();

    /* 创建任务1 */
    memset(&task1, 0, sizeof(TSK_INIT_PARAM_S));
    task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Timer_example;
    task1.pcName       = "TimerTsk";
    task1.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
    task1.usTaskPrio   = 5;
    ret = LOS_TaskCreate(&g_testTaskId01, &task1);
    if (ret != LOS_OK) {
        printf("TimerTsk create failed.\n");
        return LOS_NOK;
    }

    /* 解锁任务调度 */
    LOS_TaskUnlock();

    return LOS_OK;
}

结果验证

编译烧录运行,输出结果如下:

create Timer1 success
start Timer1 sucess
uwTick =798
stop Timer1 sucess
g_timerCount1=1, tick_last1=1208
delete Timer1 sucess
start Timer2
g_timerCount2=1 tick_last2=1313
g_timerCount2=2 tick_last2=1413
g_timerCount2=3 tick_last2=1513
g_timerCount2=4 tick_last2=1613
g_timerCount2=5 tick_last2=1713
g_timerCount2=6 tick_last2=1813
g_timerCount2=7 tick_last2=1913
g_timerCount2=8 tick_last2=2013
g_timerCount2=9 tick_last2=2113
g_timerCount2=10 tick_last2=2213

已于2021-7-21 18:14:42修改
收藏
回复
举报
回复
    相关推荐