00. 目录
文章目录
- 00. 目录
- 01. 定时器概述
- 02. 定时器API
- 03. 定时器常用API
- 3.1 osTimerNew
- 3.2 osTimerDelete
- 3.3 osTimerStart
- 3.4 osTimerStop
- 04. 程序示例
- 05. 附录
01. 定时器概述
软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。
硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,因此为了满足用户需求,提供更多的定时器,OpenHarmony LiteOS-M内核提供软件定时器功能。软件定时器扩展了定时器的数量,允许创建更多的定时业务。
软件定时器功能上支持:
- 静态裁剪:能通过宏关闭软件定时器功能。
- 软件定时器创建。
- 软件定时器启动。
- 软件定时器停止。
- 软件定时器删除。
- 软件定时器剩余Tick数获取。
02. 定时器API
(1) osTimerNew
功能:创建并初始化一个新的软件定时器。
参数:
func:定时器到期时的回调函数。
type:定时器的类型,可以是 osTimerOnce(一次性定时器)或osTimerPeriodic(周期性定时器)。
argument:传递给定时器回调函数的参数。
attr:指向定时器属性的指针,通常可以设置为 NULL 以使用默认属性。
返回值:返回一个 osTimerId_t 类型的定时器 ID,用于后续操作定时器。如果创建失败,则返回 NULL。
(2) osTimerStart
功能:启动或重启定时器。
参数:
timer_id:通过 osTimerNew 获得的定时器 ID。
ticks:定时器超时前的 Tick 数(以 RTOS 的 Tick 周期为单位)。
返回值:返回 osStatus_t 类型的状态码,表示操作结果。成功时返回 osOK,失败时返回相应的错误码。
(3) osTimerStop
功能:停止定时器。
参数:
timer_id:通过 osTimerNew 获得的定时器 ID。
返回值:返回 osStatus_t 类型的状态码,表示操作结果。成功时返回 osOK,失败时返回相应的错误码。
(4) osTimerDelete
功能:删除定时器,释放其占用的资源。
参数:
timer_id:通过 osTimerNew 获得的定时器 ID。
返回值:返回 osStatus_t 类型的状态码,表示操作结果。成功时返回 osOK,失败时返回相应的错误码。
(5) osTimerGetName
功能:获取定时器的名称。
参数:
timer_id:通过 osTimerNew 获得的定时器 ID。
返回值:返回定时器的名称字符串。如果定时器没有设置名称,则可能返回空字符串或默认名称。
(6)其他相关函数
osTimerIsRunning:检查定时器是否正在运行。
osTimerGetRemainingTicks:获取定时器剩余的 Tick 数(可选,具体取决于 RTOS 实现)。
03. 定时器常用API
3.1 osTimerNew
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void * argument, const osTimerAttr_t * attr)
描述:
定时器创建函数。
用于创建一个定时器,定时器osTimerStart启动之前处于停止状态。
参数:
Name | 描述 |
---|---|
func | 定时器回调函数。 |
type | 定时器类型,仅限于osTimerOnce或osTimerPeriodic。 |
argument | 定时器回调函数参数。 |
attr | 定时器属性,当前不支持该参数,参数可为NULL。 |
返回:
返回创建的定时器ID。
NULL,表示执行失败或在中断中调用该函数。
3.2 osTimerDelete
osStatus_t osTimerDelete (osTimerId_t timer_id)
描述:
定时器删除函数。
参数:
Name | 描述 |
---|---|
timer_id | 定时器ID(由osTimerNew创建)。 |
返回:
osOK,表示执行成功。
osErrorParameter,表示参数错误。
osErrorResource,表示其他错误。
osErrorISR,表示在中断中调用本函数。
3.3 osTimerStart
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks)
描述:
定时器开始运行函数。
参数:
Name | 描述 |
---|---|
timer_id | 定时器ID(由osTimerNew创建)。 |
ticks | 定时器颗粒度。 |
返回:
osOK,表示执行成功。
osErrorParameter,表示参数错误。
osErrorResource,表示其他错误。
osErrorISR,表示在中断中调用本函数。
3.4 osTimerStop
osStatus_t osTimerStop (osTimerId_t timer_id)
描述:
定时器停止运行函数。
参数:
Name | 描述 |
---|---|
timer_id | 定时器ID(由osTimerNew创建)。 |
返回:
osOK,表示执行成功。
osErrorParameter,表示参数错误。
osErrorResource,表示其他错误。
osErrorISR,表示在中断中调用本函数。
04. 程序示例
创建 1 个任务和 1 个软件定时器,任务 1 间隔 1S 输出信息,定时器间隔 3S输出信息。
template.c
/**
****************************************************************************************************
* @file template.c
****************************************************************************************************
* 实验现象:打开串口助手,任务1间隔1S输出信息,定时器间隔3S输出信息
*
****************************************************************************************************
*/
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
osThreadId_t Task1_ID; // 任务1 ID
osTimerId_t Timer_ID; // 定时器ID
#define TASK_STACK_SIZE 1024
#define TASK1_DELAY_TIME 1 // s
/**
* @description: 任务1
* @param {*}
* @return {*}
*/
void Task1(void)
{
while (1) {
printf("enter Task 1.......\n");
sleep(TASK1_DELAY_TIME); // 1秒
}
}
/**
* @description: 定时器1回调函数
* @param {*}
* @return {*}
*/
void timer1_Callback(void)
{
printf("enter timer1_Callback.......\n");
}
/**
* @description: 初始化并创建任务
* @param {*}
* @return {*}
*/
static void template_demo(void)
{
printf("-Hi3861开发板--LiteOS软件定时器\r\n");
Timer_ID = osTimerNew(timer1_Callback, osTimerPeriodic, NULL, NULL); // 创建定时器
if (Timer_ID != NULL)
{
printf("ID = %d, Create Timer_ID is OK!\n", Timer_ID);
osStatus_t timerStatus = osTimerStart(Timer_ID, 300U); // 开始定时器, 并赋予定时器的定时值(在Hi3861中,1U=10ms,100U=1S)
if (timerStatus != osOK)
{
printf("timer is not startRun !\n");
}
}
osThreadAttr_t taskOptions;
taskOptions.name = "Task1"; // 任务的名字
taskOptions.attr_bits = 0; // 属性位
taskOptions.cb_mem = NULL; // 堆空间地址
taskOptions.cb_size = 0; // 堆空间大小
taskOptions.stack_mem = NULL; // 栈空间地址
taskOptions.stack_size = TASK_STACK_SIZE; // 栈空间大小 单位:字节
taskOptions.priority = osPriorityNormal; // 任务的优先级
Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &taskOptions); // 创建任务1
if (Task1_ID != NULL)
{
printf("ID = %d, Create Task1_ID is OK!\n", Task1_ID);
}
}
SYS_RUN(template_demo);
运行结果