ESP8266 RTOS SDK定时器API详解

1 下载量 77 浏览量 更新于2024-08-31 2 收藏 200KB PDF 举报
ESP8266的学习笔记涵盖了ESP_IDF中的定时器接口使用,特别是针对RTOS SDK的定时器API。这篇笔记旨在介绍如何利用esp_timer库来克服FreeRTOS软件计时器的局限性,如较低的分辨率和回调执行的低优先级。 在ESP8266开发中,旧版SDK的ets_timer已经被新的ESP_IDF软件定时器API所替代。FreeRTOS的软件计时器有其限制,包括最大分辨率等于RTOS的滴答周期,以及回调函数在低优先级任务中执行。硬件计时器虽然没有这些限制,但使用上较为复杂,需要额外的机制来处理挂起的事件。 esp_timer库提供了解决方案,它利用64位硬件计时器(取决于配置的CONFIG_ESP_TIMER_IMPL),支持一次性及周期性计时器,并具有微秒级别的分辨率。计时器回调是通过高优先级的esp_timer任务调度,确保快速响应。回调函数应当避免执行复杂的操作,而是通过RTOS的通知机制(如队列、信号量或事件组)来传递信息给其他任务。 当其他高优先级任务正在运行时,如SPI Flash操作,计时器回调的调度可能会被延迟。此外,创建、启动计时器以及调度回调都需要一定的时间,因此存在最小超时值。对于esp_timer_start_once(),如果超时值小于20us,回调将在约20us后被调度。对于周期性计时器,最小周期为50us,更短的周期会导致过多的CPU占用,此时可能需要考虑使用硬件外设或DMA。 以下是esp_timer库中主要的API接口: 1. `esp_timer_init`:初始化定时器系统。 2. `esp_timer_deinit`:释放定时器系统资源。 3. `esp_timer_create`:创建一个新的定时器实例,指定回调函数和用户数据。 4. `esp_timer_start_once`:启动一次性的定时器,指定超时时间。 5. `esp_timer_start_periodic`:启动周期性的定时器,设定周期间隔。 6. `esp_timer_stop`:停止已启动的定时器。 7. `esp_timer_delete`:删除已创建的定时器实例。 8. `esp_timer_get_time`:获取当前的时间戳,可用于计算和验证超时。 掌握这些API的使用,开发者可以更加高效地在ESP8266上实现精确的定时任务,克服FreeRTOS软件计时器的不足,同时充分利用硬件资源。在编写定时器回调函数时,务必注意优先级和性能优化,以保持系统的稳定运行。