学习日记——SDK编程程序框架&注意事项(2020.5.13)

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.binblank.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字对齐的,不能直接进行指针转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱生活的fuyao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值