封面图
从这篇文章开始,我就会结合文档,以及代码开始进行ESP8266的知识学习.文章思路就是我学习的思路.
ESP8266 物联网平台的所有⽹网络功能均在库中实现,对⽤用户不不透明。⽤用户应用的初始化 功能可以在 user_main.c中实现。
void user_init(void) 是上层程序的⼊入⼝口函数,给用户提供⼀一个初始化接口,⽤用户可在 该函数内增加硬件初始化、⽹网络参数设置、定时器器初始化等功能。
我们将会将这这些例子全部分析完,来进行一个入门
其实有的人会说,Arduino为什么不学?但是我说Arduino那叫嵌入式??????
首先,我们对这个用户的初始化的函数或者文件来进行查找
首先对第一处出现的关键词进行查看
//-------------------------------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命令
里面的用户代码
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中)
https://www.esp8266.com/viewtopic.php?p=1786
找到一个国外老哥讨论这个的,可以看看
我又找到了一些用户的初始化代码,这样我们就可以看懂了初始化这个函数了