
# 开发指导
#### 使用场景
- 创建一个单次触发的定时器，超时后执行用户自定义的回调函数。
- 创建一个周期性触发的定时器，超时后执行用户自定义的回调函数。
 
#### 功能
Huawei LiteOS的软件定时器模块为用户提供下面几种功能，接口详细信息可以查看API参考。
表1 
| 功能分类           | 接口名              | 描述                                   |
|:---|:---|:---|
| 创建/删除定时器       | LOS_SwtmrCreate  | 创建定时器，设置定时器的定时时长、定时器模式、回调函数，并返回定时器ID |
| 创建/删除定时器       | LOS_SwtmrDelete  | 删除定时器                                |
| 启动/停止定时器       | LOS_SwtmrStart   | 启动定时器                                |
| 启动/停止定时器       | LOS_SwtmrStop    | 停止定时器                                |
| 获得软件定时器剩余Tick数 | LOS_SwtmrTimeGet | 获得软件定时器剩余Tick数                       |
   
#### 软件定时器错误码
对存在失败可能性的操作返回对应的错误码，以便快速定位错误原因。
| 序号 | 定义                                     | 实际数值       | 描述                         | 参考解决方案                                |
|:---|:---|:---|:---|:---|
| 1  | LOS_ERRNO_SWTMR_PTR_NULL               | 0x02000300 | 软件定时器回调函数为空                | 定义软件定时器回调函数                           |
| 2  | LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED    | 0x02000301 | 软件定时器的定时时长为0               | 重新定义定时器的定时时长                          |
| 3  | LOS_ERRNO_SWTMR_MODE_INVALID           | 0x02000302 | 不正确的软件定时器模式                | 确认软件定时器模式，范围为\[0,2\]                  |
| 4  | LOS_ERRNO_SWTMR_RET_PTR_NULL           | 0x02000303 | 入参的软件定时器ID指针为NULL          | 定义ID变量，传入有效指针                         |
| 5  | LOS_ERRNO_SWTMR_MAXSIZE                | 0x02000304 | 软件定时器个数超过最大值               | 重新设置软件定时器最大个数，或者等待一个软件定时器释放资源         |
| 6  | LOS_ERRNO_SWTMR_ID_INVALID             | 0x02000305 | 入参的软件定时器ID不正确              | 确保入参合法                                |
| 7  | LOS_ERRNO_SWTMR_NOT_CREATED            | 0x02000306 | 软件定时器未创建                   | 创建软件定时器                               |
| 8  | LOS_ERRNO_SWTMR_NO_MEMORY              | 0x02000307 | 初始化软件定时器模块时，内存不足           | 调整OS_SYS_MEM_SIZE，以确保有足够的内存供软件定时器使用   |
| 9  | LOS_ERRNO_SWTMR_MAXSIZE_INVALID        | 0x02000308 | 暂不使用该错误码                   | -                                     |
| 10 | LOS_ERRNO_SWTMR_HWI_ACTIVE             | 0x02000309 | 在中断中使用定时器                  | 修改源代码确保不在中断中使用                        |
| 11 | LOS_ERRNO_SWTMR_HANDLER_POOL_NO_MEM    | 0x0200030a | 暂不使用该错误码                   | -                                     |
| 12 | LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED    | 0x0200030b | 在软件定时器初始化时，创建定时器队列失败       | 调整OS_SYS_MEM_SIZE，以确保有足够的内存供软件定时器创建队列 |
| 13 | LOS_ERRNO_SWTMR_TASK_CREATE_FAILED     | 0x0200030c | 在软件定时器初始化时，创建定时器任务失败       | 调整OS_SYS_MEM_SIZE，以确保有足够的内存供软件定时器创建任务 |
| 14 | LOS_ERRNO_SWTMR_NOT_STARTED            | 0x0200030d | 未启动软件定时器                   | 启动软件定时器                               |
| 15 | LOS_ERRNO_SWTMR_STATUS_INVALID         | 0x0200030e | 不正确的软件定时器状态                | 检查确认软件定时器状态                           |
| 16 | LOS_ERRNO_SWTMR_SORTLIST_NULL          | 0x0200030f | 暂不使用该错误码                   | -                                     |
| 17 | LOS_ERRNO_SWTMR_TICK_PTR_NULL          | 0x02000310 | 用以获取软件定时器剩余Tick数的入参指针为NULL | 定义有效变量以传入有效指针                         |
| 18 | LOS_ERRNO_SWTMR_SORTLINK_CREATE_FAILED | 0x02000311 | 在软件定时器初始化时，创建定时器链表失败       | 调整OS_SYS_MEM_SIZE，以确保有足够的内存供软件定时器创建链表 |
   
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
错误码定义见[错误码简介](https://support.huaweicloud.com/kernelmanual-LiteOS/zh-cn_topic_0311018405.html#ZH-CN_TOPIC_0311018405__zh-cn_topic_0175230332_section29852515161)。8\~15位的所属模块为软件定时器模块，值为0x03。
#### 开发流程
软件定时器的典型开发流程：
1. 执行make menuconfig命令，进入Kernel ---\> Enable Software Timer菜单，完成软件定时器的配置。
   
   | 配置项                                                                                                                                                | 含义           | 取值范围                                           | 默认值   | 依赖                     |
   |:---|:---|:---|:---|:---|
   | LOSCFG_BASE_CORE_SWTMR                                                                                                                             | 软件定时器裁剪开关    | YES/NO                                         | YES   | LOSCFG_BASE_IPC_QUEUE  |
   | LOSCFG_BASE_CORE_SWTMR_LIMIT                                                                                                                       | 最大支持的软件定时器数  | \<65535                                        | 1024  | LOSCFG_BASE_CORE_SWTMR |
   | LOSCFG_BASE_CORE_SWTMR_IN_ISR                                                                                                                      | 在中断中直接执行回调函数 | YES/NO                                         | NO    | LOSCFG_BASE_CORE_SWTMR |
   | LOSCFG_BASE_CORE_TSK_SWTMR_STACK_SIZE （菜单路径为：Kernel ---\> Basic Config ---\> Task） | 软件定时器任务栈大小   | \[LOSCFG_TASK_MIN_STACK_SIZE, OS_SYS_MEM_SIZE) | 24576 | LOSCFG_BASE_CORE_SWTMR |
      
   
2. 创建定时器LOS_SwtmrCreate，设置定时器的定时时长、定时器模式、超时后的回调函数。
3. 启动定时器LOS_SwtmrStart。
4. 获得软件定时器剩余Tick数LOS_SwtmrTimeGet。
5. 停止定时器LOS_SwtmrStop。
6. 删除定时器LOS_SwtmrDelete。
 
