(1)普通单片机的程序运行时基于“主循环”的方式
Main.c文件中:
Int main(void)
{
初始化…………… //IO口,定时器,设置中断………..
While(1)
{
……..
}
Return 0;
}
Void xxx_interrupt(void) //中断处理函数
{
………………… //执行中断处理
}
_____________________________________________________________________
_____________________________________________________________________
(2)ESP8266的SDK编程是基于“内核回调”的方式
User_main.c文件中:
Void user_init(void) //ESP8266内核为用户提供的初始化接口:用户的【应用功能初始化入口】
{
初始化…………… //IO口,定时器,设置中断………..
}
用户看不见不能修改
-------------------------------------------------------------------------------------------------------
{
User_init(); //执行 用户的【应用功能初始化】
while(1)//类似主循环
{
执行内核功能……..
执行用户功能…….. //eg:用户初始化中设定了1秒定时,那么这里将会执行定时器定时
}
}
-------------------------------------------------------
回调函数 //当满足某条件时,内核调用这些回调函数
-------------------------------------------------------
Void xxx_cd(void) //eg:这是1S定时器的回调函数,那么内核1S计时完成,将会调用此函数
{
LED闪烁…….. //eg:在此函数中用户可以让LED灯以2S的频率闪烁
}
------------------------------------------------------------------------------------------------------------------------------------------
任务函数 //如果安排了任务,在系统空闲时,内核会调用任务函数
-------------------------------------------------------------------------------------------------------------------------------------------
Void xxx_task(void)
{
……………………………
}
Void xxx_interrupt(void) //中断处理函数
{
………………… //执行中断处理
}
------------------------------------------------------------------------------------------------------------------
注意事项:
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,⽤户也可以采⽤⾃定义数据包格式,⾃⾏对数据进
⾏处理
• Non-OS SDK 不像基于 RTOS 的应⽤程序⽀持任务调度。Non-OS SDK 使⽤四种类
型的函数:
- 应⽤函数
- 回调函数
- ⽤户任务
- 中断服务程序 (Interrupt Service Routines, ISR)
应⽤函数类似于嵌⼊式 C 编程中的常⽤ C 函数。这些函数必须由另⼀个函数调⽤。
应⽤函数在定义时建议添加 ICACHE_FLASH_ATTR 宏,相应程序将存放在 flash 中,被
调⽤时才加载到 cache 运⾏。⽽如果添加了 IRAM_ATTR 宏的函数,则会在上电启动
时就加载到 iRAM 中。
回调函数是指不直接从⽤户程序调⽤的函数,⽽是当某系统事件发⽣时,相应的回
调函数由 non-OS SDK 内核调⽤执⾏。这使得开发者能够在不使⽤ RTOS 或者轮询
事件的情况下响应实时事件。
要编写回调函数,⽤户⾸先需要使⽤相应的 register_cb API 注册回调函数。回调
函数的示例包括定时器回调函数和⽹络事件回调函数。
中断服务程序 (ISR) 是⼀种特殊类型的回调函数。发⽣硬件中断时会调⽤这些函数。
当使能中断时,必须注册相应的中断处理函数。请注意,ISR 必须添加 IRAM_ATTR。
⽤户任务可以分为三个优先级:0、1、2。任务优先级为 2 > 1 > 0。即 Non-OS
SDK 最多只⽀持 3 个⽤户任务,优先级分别为 0、1、2。
⽤户任务⼀般⽤于函数不能直接被调⽤的情况下。要创建⽤户任务,请参阅本⽂档
中的 system_os_task() 的 API 描述。例如,espconn_disconnect() API 不能直接
在 espconn 的回调函数中调⽤,因此建议开发者可以在 espconn 回调中创建⽤户任
务来执⾏ espconn_disconnect。
• 如前所述,non-OS SDK 不⽀持抢占任务或进程切换。因此开发者需要⾃⾏保证程
序的正确执⾏,⽤户代码不能⻓期占⽤ CPU。否则会导致看⻔狗复位,ESP8266 重
启。
如果某些特殊情况下,⽤户线程必须执⾏较⻓时间(⽐如⼤于 500 ms),建议经常
调⽤ system_soft_wdt_feed() API 来喂软件看⻔狗,⽽不建议禁⽤软件看⻔狗。
• 请注意,esp_init_data.bin 和 blank.bin ⽂件⾄少需要烧录⼀次,以⽤于正确的初
始化系统。应⽤程序必须在 user_rf_cal_sector_set 中设置 RF 校准扇区。
详细参考:
ESP8266 Non-OS SDK API