查看: 2508|回复: 0

kyLinMini学习笔记:3. NET代码学习之net device

[复制链接]
  • TA的每日心情
    开心
    2018-6-21 08:39
  • 签到天数: 8 天

    连续签到: 2 天

    [LV.3]偶尔看看II

    发表于 2017-8-27 20:15:46 | 显示全部楼层 |阅读模式
    分享到:
    学习了一下esp8266的底层驱动,首先是两个数据结构
    cpu和esp8266之间通过USART2通信,代码中把USART的收发包封装成了一个驱动层叫net_io,netIoInfo就是net_io收发包时使用的结构体
    net_io_info.jpg
    NET_IO_INFO netIOInfo = {0, 0, REV_WAIT, {0}, NULL, NULL};

    esp8266的driver代码中称为net_device,netDeviceInfo是net_device收发包时使用的结构体
    net_device_info.jpg
    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时,直接轮询发送每一个字符
    send_no_dma.jpg
    使用DMA时,发送接口的实现比较少见,是轮询等待上一次DMA发送完成后,再把传入接口的数据地址和长度填到DMA寄存器中触发本次DMA,然后就直接退出了
    send_dma.jpg
    这样存在一个问题就是所有的发送都不是同步的;上层函数在调用完发送接口后,其实发送还并没有完成,后面的操作如果有依赖于发送完成动作的,就有可能会出问题,不过协议栈我还没有研究明白,有可能所有的发送都只需要异步发送也说不定

    接收
    不开DMA时,如果接收到数据就在USART的接收中断处理函数中,把数据存到netIOInfo.buf中,并更新长度netIOInfo.dataLen
    recv_no_dma_irq.jpg
    然后在NET_IO_WaitRecive接口中判断netIOInfo.dataLen是否于上一次轮询时调用NET_IO_WaitRecive的结果一样,如果一样就说明包已经接收完成了,这样通过两次调用NET_IO_WaitRecive判断一段时间内都没有再收到数据,从而确定是否收到一个完整的数据包
    recv_no_dma.jpg
    使用DMA时,由于预先是不知道要接收的长度的,所以接收其实只有在接收buf满的时候才靠DMA中断来处理,正常情况下都是靠串口的IDEL中断,即USART的中断处理函数USART2_IRQHandler来处理的。在串口为IDLE时中断处理函数中将netIOInfo.rev_idle标记为REV_OK,并重新打开DMA的channel等待数据
    recv_dma_irq.jpg
    然后在NET_IO_WaitRecive接口中判断netIOInfo.rev_idle是否为REV_OK来确定是否收到数据包,并将netIOInfo.rev_idle清为REV_WAIT
    recv_dma.jpg
    注意这里可能有隐患,有可能数据还未处理,从服务器下发的新数据就把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_SendDataNET_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配置”就不会运行了。。。
    net_device_exist.jpg

    目前就看了这么多,接下来准备接着学习EDP协议和OneNET的代码






    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-27 08:22 , Processed in 0.107959 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.