NuMaker-IIoT-NUC980
测评之 EMAC 作者:出出啊
测评环境 开发板:NuMaker-IIoT-NUC980 V1.0 开发环境:keil 5.25 + env 1.2.0.7 + NuWriter v1.18 rt-thread:4.0.5 release 测评任务:EMAC
开箱 开箱图片
NUC980 有两个 EMAC 外设,NuMaker-IIoT-NUC980 只使用了 EMAC0。 支持 RMII 接口,收发都有 DMA 和 各自 256 字节的 FIFO。
搭建环境 下载安装 RT-Thread Studio 安装 Stutio 并运行,用个账号登录,无账号先注册。
后面的所有操作都不影响,为什么每次打开软件都要提示这个信息?这个提示的意思是 studio 不能完整正常工作还是能正常工作?我需要必须安装个 git 吗? 创建项目我们选择基于开发板,如果没有安装 NuMaker-IIoT-NUC980 开发板包,选择安装更多。 选择 rt-thread 版本,删掉不需要的版本。 选择 NK-980IOT 开发板包,点击【安装资源包】。 最后,再次创建项目,完成。
项目配置
打开 settings 之后,把所有选项过一遍,取消掉不需要的配置,先精简配置。我只留下和 EMAC GPIO UART 相关的配置,所有其它默认开启的 SPI ADC RTC WDT… 全去掉了。
先跑个最小系统,检查一下系统能不能正常运行,finsh 能不能工作。
启用 EMAC 外设
选用 EMAC0
同时启用 phy 芯片支持。
添加 webclient 包 添加 webclient 后,先编译了一下出现下面这个错误。
./packages/webclient-v2.2.0/src/webclient.o: In function `webclient_resolve_address':D:\RT-ThreadStudio\workspace\nk980iot\Debug/../packages/webclient-v2.2.0/src/webclient.c:221: undefined reference to `rt_strcpy' 太神奇了,rt_strcpy 函数是 #5404 2021/12/22 合并的
BernardXiong merged 1 commit into RT-Thread:master from mysterywolf:kservice on 22 Dec 2021 我下面的版本是 4.0.5 ,RT-Thread v4.0.5 released Latest
@Guozhanxin Guozhanxin released this 29 Dec 2021 2021/12/29 发布的版本竟然没有这个函数的实现了!!! 自己添加 rt_strcpy 的实现。再次编译通过。 测试代码 通过 webclient 下载文件。先在电脑端用 python 启用了一个简易 web 服务。然后在 rt-thread 系统终端里执行下载程序。
static int http_ota_shard_download_handle(char *buffer, int length){ int ret = RT_EOK; begin_offset += length; print_progress(begin_offset, file_size);__exit: rt_free(buffer); return ret;}static int http_ota_fw_download(const char* uri){ int ret = RT_EOK; struct webclient_session* session = RT_NULL; begin_offset = 0; file_size = 0; /* create webclient session and set header response size */ session = webclient_session_create(GET_HEADER_BUFSZ); if (!session) { LOG_E("open uri failed."); ret = -RT_ERROR; goto __exit; } webclient_set_timeout(session, 1000); /* get the real data length */ webclient_shard_head_function(session, uri, &file_size); if (file_size == 0) { LOG_E("Request file size is 0!"); ret = -RT_ERROR; goto __exit; } else if (file_size < 0) { LOG_E("webclient GET request type is chunked."); ret = -RT_ERROR; goto __exit; } LOG_I("OTA file size is (%d)", file_size); LOG_I("\033[1A"); /* register the handle function, you can handle data in the function */ webclient_register_shard_position_function(session, http_ota_shard_download_handle); /* the "memory size" that you can provide in the project and uri */ ret = webclient_shard_position_function(session, uri, begin_offset, file_size, HTTP_OTA_BUFF_LEN); /* clear the handle function */ webclient_register_shard_position_function(session, RT_NULL); if (ret == RT_EOK) { LOG_I("Download file success."); } else { LOG_E("Download file failed."); }__exit: rt_thread_delay(rt_tick_from_millisecond(5)); if (session != RT_NULL) webclient_close(session); begin_offset = 0; return ret;}
以上是从 web 服务器下载文件的程序。经过多次测试,从1k大小文件开始,到 1.5M 。系统中没有其它多余线程,下载速度情况如下: 开启 RT_DEBUG ,11k/s。关闭所有调试信息,192k/s。
遇到的问题
在使用新唐官方提供的 NonOS 源码测试时发现一个有意思的现象,当两个 EMAC 外设都初始化并且同时设置 LINK UP 会引起 EMAC0 只能被 ping 通,demo 里的 http 服务器访问不到了。去掉 EMAC1 的 LING_UP 标志,EMAC0 才正常工作。目前不知道原因在哪儿。
rt-thread 提供的驱动呢,明面上看是支持最多两个网卡设备的,但是 eth_device_init 初始化设备时用的是同一套 ip 地址配置,这样导致两个网卡配置成相同的 ip。这一点儿是 rt-thread 提供的 eth_device_init 函数处理不当,和芯片无关,换做另外一种芯片,如果它也支持双网卡也会面临相同的尴尬。
解决上面这个问题,可能需要修改 struct eth_device 结构体定义,同时需要定义多组 RT_LWIP_IPADDR 了,把静态 IP 配置项挪到启用外设的位置一目了然(DHCP 可能也是和网卡紧密相关的,不是和 lwip 紧密相关的)。
附:测试应用代码 https://gitee.com/thewon/nuc980-emac-test
|