前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NONOS_SDK分析篇

NONOS_SDK分析篇

作者头像
云深无际
发布2021-01-18 10:53:30
7520
发布2021-01-18 10:53:30
举报
文章被收录于专栏:云深之无迹云深之无迹

封面图


从这篇文章开始,我就会结合文档,以及代码开始进行ESP8266的知识学习.文章思路就是我学习的思路.


ESP8266 物联网平台的所有⽹网络功能均在库中实现,对⽤用户不不透明。⽤用户应用的初始化 功能可以在 user_main.c中实现。

void user_init(void) 是上层程序的⼊入⼝口函数,给用户提供⼀一个初始化接口,⽤用户可在 该函数内增加硬件初始化、⽹网络参数设置、定时器器初始化等功能。

我们将会将这这些例子全部分析完,来进行一个入门

其实有的人会说,Arduino为什么不学?但是我说Arduino那叫嵌入式??????

首先,我们对这个用户的初始化的函数或者文件来进行查找

首先对第一处出现的关键词进行查看

代码语言:javascript
复制
//-------------------------------Test Code Below--------------------------------------#if 0void   hw_test_timer_cb(void){    static uint16_t j = 0;    j++;
    if ((WDEV_NOW() - tick_now2) >= 1000000) {        static u32 idx = 1;        tick_now2 = WDEV_NOW();        os_printf("b%u:%d\n", idx++, j);        j = 0;    }
    //hw_timer_arm(50);}
void ICACHE_FLASH_ATTR user_init(void){    hw_timer_init(FRC1_SOURCE, 1);    hw_timer_set_func(hw_test_timer_cb);    hw_timer_arm(100);}#endif

没想到第一段代码出现的位置是一段这样的代码

和我们学习的有点偏差,来看看再说


在这里是初始化的时期

出现了这个宏,我在加一些别的内容


• 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。

有了这些知识,我们这个代码就可以读懂了

此时我怕读不懂,写成了这样.里面部分的关键词都没有

即使上面可以找到一些寄存器的意思,但是还是不懂,可能是我的资料不对劲

我看着就是寄存器的写法

寄存器的定义在这里

我们继续看

这就是我们最上面一直说的哪个初始化,一个没有返回值

没有参数的用户初始化函数

这些文件和函数都可以在文档里面找到.接下里看下一个

第二个文件

我们应该关注一下这个初始化函数的位置

是例子里面的AT命令

里面的用户代码

代码语言:javascript
复制
void ICACHE_FLASH_ATTR user_init(void){    char buf[128] = {0};    at_customLinkMax = 5;//在自定义的最长链接数上    at_init();#ifdef ESP_AT_FW_VERSION    if ((ESP_AT_FW_VERSION != NULL) && (os_strlen(ESP_AT_FW_VERSION) < 64)) {        os_sprintf(buf,"compile time:"__DATE__" "__TIME__"\r\n"ESP_AT_FW_VERSION);    } else {        os_sprintf(buf,"compile time:"__DATE__" "__TIME__);    }#else    os_sprintf(buf,"compile time:"__DATE__" "__TIME__);#endif    at_set_custom_info(buf);    at_port_print_irom_str("\r\nready\r\n");    at_cmd_array_regist(&at_custom_cmd[0], sizeof(at_custom_cmd)/sizeof(at_custom_cmd[0]));#ifdef CONFIG_AT_SMARTCONFIG_COMMAND_ENABLE    at_cmd_enable_smartconfig();#endif#ifdef CONFIG_AT_WPA2_ENTERPRISE_COMMAND_ENABLE    at_cmd_enable_wpa2_enterprise();#endif  at_port_print("\r\n***==================================***");  at_port_print("\r\n***  Welcome to at espconn demo!!!   ***");  at_port_print("\r\n*** Please create a TCP Server on PC,***");  at_port_print("\r\n*** then enter command AT+TEST.      ***");  at_port_print("\r\n***==================================***\r\n");}

以上代码是用户代码里面的初始化代码的部分,我单独的拿出来分析.

ESP_AT_FW_VERSION,这个定义的字符没有找到更多的信息,但是应该是一个硬件的版本号


如果这个版本号,不为空而且这个版本号的字数小于64个字节,那么打印编译时间.+这个版本

否则就打印一个编译时间

此时就找到两个函数,剩下等我用到再写

此时我们视角转向这个函数


sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,...]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用 snprintf函数,该函数可对写入字符数做出限制。

看这个搜索情况就是在这个头文件里面做了一些更改


格式化输出函数是在系统的printf基础上,您的项目里应该也有,os_sprintf和字符串复制函数os_strncpy都是扩展自定义的输出函数。ESP8266在头文件(osapi.h中)


代码语言:javascript
复制
https://www.esp8266.com/viewtopic.php?p=1786

找到一个国外老哥讨论这个的,可以看看

我又找到了一些用户的初始化代码,这样我们就可以看懂了初始化这个函数了

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档