ESP8266 SDK编程的程序架构和注意事项

程序架构:

和普通单片机程序的比较

1)普通单片机的程序运行时基于“主循环”的方式

Main.c文件中:

Int main(void)

{

初始化……………      //IO口,定时器,设置中断………..

While(1)

{

   ……..

}

Return 0;

}

 

Void  xxx_interrupt(void)  //中断处理函数

{

…………………   //执行中断处理

}

 

_____________________________________________________________________

_____________________________________________________________________

 

2ESP8266SDK编程是基于“内核回调”的方式

 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章