Non-OS SDK简介
- Non-OS SDK为用户提供了一套应用程序编程接口(API),能够实现ESP8266的核心功能改,例如数据接收/发送、TCP/IP功能、硬件接口功能,以及基本的系统管理功能等。用户不必关心底层网络,如Wi-Fi、TCP/IP等的具体实现,只需要专注于物联网上层应用的开发,利用相应接口实现各种功能即可。
- ESP8266物联网平台的所有网络功能均在库中实现,对用户不透明。用户应用的初始化功能可以在
user_ main.c
中实现。 void user_ init(void)
是上层程序的入口函数,给用户提供一个初始化接口,用户可在该函数内增加硬件初始化、网络参数设置、定时器初始化等功能。void user_ init(void)
是上层程序的入口函数,给用户提供一个初始化接口,用户可在该函数内增加硬件初始化、网络参数设置、定时器初始化等功能。- 对于ESP8266_ NONOS_ SDK_ v1.5.2 及之后版本,请在user_ main.c增加函数
void user_ rf pre_ init(void)
和uint32 user_ rf _cal_ sector_ set(void)
, 可参考IOT_ Demo的user_ main.c
。 用户可在user_ rf_ pre_ init
中配置RF初始化,相关RF设
置接口为system_ _phy_ _set_ rfoption
, 或者在Deep-sleep前调用system_ _deep_ sleep_ set_ option
。如果设置为RF不打开,则ESP8266 Station及SoftAP均无法使用,请勿调用Wi-Fi相关接口及网络功能。RF关闭时,Wi-Fi射频功能和网络堆栈管理API均无法使用。 - 对于ESP8266_ NONOS_ SDK_ v2.1.0及之后版本,用户如果并未使用DIO-To-QIO flash, 可以在
user_ main.c
中增加空函数
void user. spi. flash. _dio_ to_ qio_ pre_ init(void)
来优化iRAM空间。
SDK中提供了对JSON包的处理API, 用户也可以采用自定义数据包格式,自行对数据进行处理。
普通单片机的程序运行
main. c文件中
void main (void) //程序入口
{
初始化... ; //IO口、定时器、设置中断...
while(1) //主循环,完成主要功能
{
...
}
return 0;
}
void xxx_ IRQHandler (void)//中断函数
}
... //执行中断
{
Non-OS SDK代码结构
Non-OS SDK不像基于RTOS的应用程序支持任务调度。Non-OS SDK使用四种类型的函数:
(1)应用函数:应用函数类似于嵌入式C编程中的常用C函数。这些函数必须由另-一个函数调用。应用函数在定义时建议添加ICACHE FLASH ATTR
宏,相应程序将存放在flash中,被调用时才加载到cache运行。而如果添加了IRAM ATTR
宏的函数,则会在.上电启动时就加载到iRAM中。
(2)回调函数:回调函数是指不直接从用户程序调用的函数,而是当某系统事件发生时,相应的回调函数由non-OS SDK内核调用执行。这使得开发者能够在不使用RTOS或者轮询事件的情况下响应实时事件。
要编写回调函数,用户首先需要使用相应的register_ cb API
注册回调函数。回调函数的示例包括定时器回调函数和网络事件回调函数。
(3)中断服务程序:中断服务程序(ISR)是-种特殊类型的回调函数。发生硬件中断时会调用这些函数。当使能中断时,必须注册相应的中断处理函数。请注意,ISR 必须添加IRAM ATTR。
(4)用户任务可以分为三个优先级: 0、1、2。任务优先级为2> 1 > 0。即Non-OS SDK最多只支持3个用户任务,优先级分别为0、1、2。
用户任务一般用于函数不能直接被调用的情况下。
【注意】
1、non-OS SDK不支持抢占任务或进程切换。因此开发者需要自行保证程序的正确执行,用户代码不能长期占用CPU。否则会导致看门狗复位,ESP8266 重启。
2、如果某些特殊情况下,用序线程必须执行较长时间(比如大于500 ms),建议经常调用system. soft_ wdt_ feedO) API来喂软件看门狗,而不建议禁用软件看门狗。
3、esp_ jnit_ _data.bin
和blank.bin
文件至少需要烧录-次,以用于正确的初始化系统。应用程序必须在user_ rf_ cal_ sector_ set
中设置RF校准扇区。
ESP8266看门狗
由于on-OS SDK不支持抢占任务或进程切换。因此开发者需要自行保证程序的正确执行,用户代码不能长期占用CPU。当我们不执行喂狗程序时,死循环一直长时间占用CPU,发现看门狗不停的在复位。
当我们执行喂狗程序时
等几秒后,发现没有继续复位
ESP8266的SDK编程
基于内核回调的方式
user_ main. c文件中:
void user_ init (void) // ESP8266内核为用户提供的初始化接口:用户的[应用功能初始化]入口
{
初始化... ; //I0口、定时器、设置中断...
} //用户看不见,不能修改
{
内核初始化...
user_ init() ; //执行用户的[应用功能初始化]
while(1) //类似于主循环
{
执行内核功能...
执行用户功能. .. //比如: 用户初始化中设定 了1S定时, 那么在这里将会进行定时器计时
}
}
回调函数
当满足某条件时,内核调用这些回调函数
void xxx_cb(void)//例如:这是1S定时的回调函数,那么内核1S计时完成,就会调用此函数
{
LED闪烁... //例如:在此函数中用户可以让LED以2S的频率闪烁
}
任务函数:
如果安排了任务,在系统空闲时,内核会调用任务函数
void xxx_ Task (void)//当触发中断时,进入中断函数
{
... //执行中断处理
}
中断函数:
与单片机的中断函数相似
void xxx_ _IRQHandler (void)//当触发中断时,进入中断函数
{
...//执行中断处理
}
注意事项
- 不能频繁调用定时器,频率不高于每5ms一次(微秒计时器则为100μs)。
- 微秒定时器不是很精确,在回调中使用500 μs的抖动。PWM API不能与硬件定时器同时使用。
- 不能长时间关闭中断。ISR执行时间也应当尽可能短(即微秒级)。
- ESP8266通常的运行速率为80 MHz, 在高性能应用中也可以配置为160 MHz。【注意】外设不受CPU频率设置的影响,因为它们使用了不同的时钟源。
- 设置更高的时钟频率或者禁用睡眠模式,会导致更大的功耗,但能获得更好的性能。
- RAM和flash访问必须是4字对齐的,不能直接进行指针转换。