TA的每日心情 | 开心 2018-6-21 08:39 |
---|
签到天数: 8 天 连续签到: 2 天 [LV.3]偶尔看看II
|
学习了一下esp8266的底层驱动,首先是两个数据结构
cpu和esp8266之间通过USART2通信,代码中把USART的收发包封装成了一个驱动层叫net_io,netIoInfo就是net_io收发包时使用的结构体
NET_IO_INFO netIOInfo = {0, 0, REV_WAIT, {0}, NULL, NULL};
esp8266的driver代码中称为net_device,netDeviceInfo是net_device收发包时使用的结构体
NET_DEVICE_INFO netDeviceInfo = {0, 0, 0, 0, 0, 0, 0};
ESP8266驱动中构造和解析包流程中常用的clib库函数有:sprintf,strstr,strlen,mktime
net_io.c ---- 连接ESP8266的USART提供的接口
NET_IO_Init ---- 初始化网络设备IO驱动层
NET_IO_Send ---- 底层数据发送接口
NET_IO_WaitRecive ---- 轮询等待接收数据接口
NET_IO_ClearRecive ---- 清空接收缓存接口
发送:
不开DMA时,直接轮询发送每一个字符
使用DMA时,发送接口的实现比较少见,是轮询等待上一次DMA发送完成后,再把传入接口的数据地址和长度填到DMA寄存器中触发本次DMA,然后就直接退出了
这样存在一个问题就是所有的发送都不是同步的;上层函数在调用完发送接口后,其实发送还并没有完成,后面的操作如果有依赖于发送完成动作的,就有可能会出问题,不过协议栈我还没有研究明白,有可能所有的发送都只需要异步发送也说不定
接收:
不开DMA时,如果接收到数据就在USART的接收中断处理函数中,把数据存到netIOInfo.buf中,并更新长度netIOInfo.dataLen
然后在NET_IO_WaitRecive接口中判断netIOInfo.dataLen是否于上一次轮询时调用NET_IO_WaitRecive的结果一样,如果一样就说明包已经接收完成了,这样通过两次调用NET_IO_WaitRecive判断一段时间内都没有再收到数据,从而确定是否收到一个完整的数据包
使用DMA时,由于预先是不知道要接收的长度的,所以接收其实只有在接收buf满的时候才靠DMA中断来处理,正常情况下都是靠串口的IDEL中断,即USART的中断处理函数USART2_IRQHandler来处理的。在串口为IDLE时中断处理函数中将netIOInfo.rev_idle标记为REV_OK,并重新打开DMA的channel等待数据
然后在NET_IO_WaitRecive接口中判断netIOInfo.rev_idle是否为REV_OK来确定是否收到数据包,并将netIOInfo.rev_idle清为REV_WAIT
注意这里可能有隐患,有可能数据还未处理,从服务器下发的新数据就把netIOInfo.buf里的数据冲掉了
net_device.c ---- ESP8266驱动提供的接口
NET_DEVICE_SendCmd ---- 给ESP8266写命令,操作控制ESP8266都要调用此接口
NET_DEVICE_SendData ---- 向某一个连接发送数据
AT+CIPSEND
NET_DEVICE_AddDataSendList ---- 在发送链表尾新增一个发送node
NET_DEVICE_DeleteDataSendList ---- 从发送链表头删除一个node
NET_DEVICE_GetIPD ---- 获取某一个连接返回的数据,+IPD,x:yyy中yyy的指针
NET_DEVICE_ClrData ---- 调用NET_IO_ClearRecive清接收缓存
NET_DEVICE_IO_Init ---- 复位管脚和UART管脚的IO初始化
NET_DEVICE_Reset ---- 硬复位
NET_DEVICE_Init ---- 获取网络时间,连接OneNET平台服务器
AT+CIPSTART="TCP","183.230.40.39",876 ---- OneNET平台服务器
NET_DEVICE_Exist ---- 要在init之前通过airkiss接入wifi
AT+CWSMARTSTART=2
NET_DEVICE_GetTime ---- 从时标服务器获取网络时间
AT+CIPCLOSE
AT+CIPSTART="TCP","24.56.178.140",13 ---- 时标服务器
AT+CIPCLOSE
NET_DEVICE_Check ---- 检查网络设备连接状态
AT+CIPSTATUS ---- 2:连接AP并获得IP
3:建立TCP/UDP连接
4:TCP/UDP连接断开
5:没有连接到AP
对应返回状态为2,0,1,3 ---- STATUS 2 -> 2:获得IP
STATUS 3 -> 0:连接成功
STATUS 4 -> 1:失去连接
STATUS 5 -> 3:硬件故障
NET_DEVICE_ReConfig ---- 只设置网络设备初始化的步骤
NET_DEVICE_ReLink ---- 重新建立TCP连接
AT+CIPCLOSE
AT+CIPSTART="TCP",ip,port
多个任务中都可以调用NET_DEVICE_SendData和NET_DEVICE_AddDataSendList来发送数据,前者直接调用底层的发送接口,后者只是把数据放到netIOInfo.head上,由DATALIST_Task轮询发送。只是发送接口没有mutex保护,不知道会不会发生互斥问题,比如task1调用NET_DEVICE_SendCmd时在调用NET_IO_Send之后被task2抢占了,如果task2的下一步要执行NET_DEVICE_SendCmd不知道会不会有问题
NET_DEVICE_Exist感觉有个小问题,就是cfgTimeOut如果超时15s退出了,在退出前cfgTimeOut被清零了,那么后面的NET_DEVICE_Check和打印“接入超时,请检查WIFI配置”就不会运行了。。。
目前就看了这么多,接下来准备接着学习EDP协议和OneNET的代码
|
|