初学 FreeRTOS:
(1)使用 ZC706 开发板测试 PS 端网口(Echo,lwIP协议栈);
(2)配合操作 PL 端 LED(直接驱动和使用消息队列两种方式);
(3)PS 端串口 UART 打印调试信息;
(4)QSPI 固化(Dual Quad SPI Parallel 8 bit模式)。
ZC706中,MAC 控制器与 PHY 通过 RGMII(Reduced Gigabit Media Independent Interface)接口进行连接,实现千兆网。
一、工程概述
1.开发板配置
使用 Xilinx ZYNQ 开发板 ZC706,默认配置 ARM 后即可使用PS 端网口、串口和 QSPI,放置 AXI GPIO 的 IP 核驱动 PL 端的 4 个 LED。
ARM端配置如下图所示,以5处的ARM-A9为核心,使用1处的UART1打印调试信息,使用2处的网口0进行以太网通信,使用3处的AXI GP(General Port)Master通用主设备接口连接PL端的AXI GPIO,最后使用4处的QSPI固化程序,烧录Boot文件。
2.SDK程序
上述工程综合、布局布线并生成bit流后,导出硬件。
新建应用工程Application Project,选择 OS Platform 平台为 freertos10_xilinx(Vivado及SDK版本2018.2,低版本的可能是freertos9_xilinx),选择Next,选中“FreeRTOS lwIP Echo Server”。
新建完成后,即可进行最基础的网络通信了。
这里注意,默认设置的是DCHP动态主机配置协议,需要开发板和电脑都连接到一个路由器上。如果直接使用网线连接开发板和电脑,则启用IPv4协议,默认配置的IP地址为 192.168.1.10,子网掩码 255.255.255.0,网关 196.128.1.1,如果想要更改默认配置,可以在 main.c 文件的 main_thread() 主线程中修改,如下所示:
xil_printf("ERROR: DHCP request timed out\r\n");
xil_printf("Configuring default IP of 192.168.1.10\r\n");
IP4_ADDR(&(server_netif.ip_addr), 192, 168, 1, 10);
IP4_ADDR(&(server_netif.netmask), 255, 255, 255, 0);
IP4_ADDR(&(server_netif.gw), 192, 168, 1, 1);
LWIP 是一个小型开源的 TCP/IP 协议栈,支持IPv4、IPv6、TCP、UDP、DHCP等。
• IGMP 协议,用于网络组管理,可以实现多播数据的接收
• Internet 协议(IP),包括 IPv4 和 IPv6,支持 IP 分片与重装,包括通过多个网络接口的数据包转发
• 用于网络维护和调试的 Internet 控制消息协议(ICMP)
• 用户数据报协议(UDP)
• 传输控制协议(TCP)拥塞控制,往返时间(RTT)估计,快速恢复和重传
• DNS,域名解析
• SNMP,简单网络管理协议
• 动态主机配置协议(DHCP)
• 以太网地址解析协议(ARP)
• AUTOIP,IP 地址自动配置
• PPP,点对点协议,支持
3.网络设置
使用网线直接连接ZC706开发板和计算机网口,配置计算机IP地址为192.168.1.11,子网掩码255.255.255.0,网关192.168.1.1,其中IP地址的最后一处可以更改为其他值,但是不能和开发板的相同。
4.开启监听测试
使用SecureCRT软件监听,除此之外,使用其他网口助手也可以。
二、工程测试
1.测试Echo官方例程
先打开串口,波特率115200,下载官方例程到ZC706开发板,连接SecureCRT_CN,初始化工程中串口打印信息如下:配置DCHP动态主机协议超时,自动转为IPv4,将板子的IP地址配置为192.168.1.10,子网掩码255.255.255.0,网关192.168.1.1,使用端口7。
在SecureCRT_CN界面输入字符或字符串,回车,通过网口向开发板发送数据,开发板会返回同样的数据,测试正确。
2.分析源码
2.1 main函数
打开main.c文件,找到main()函数。在main函数中创建了一个线程,传入的参数依次为线程名(调试用)、函数指针、函数需要的参数、需要的堆栈大小、优先级。
按照如下配置,调用了main_thread函数,不需要传参(用0或NULL),堆栈大小由#define定义为1024,优先级为2。
int main()
{
sys_thread_new("main_thrd", (void