本帖最后由 FPGA课程 于 2024-10-11 17:29 编辑
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
1概述FreeRTOS 是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、 信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 由于 RTOS 需占用一定的系统资源(尤其是 RAM 资源),只有 μC/OS-II、embOS、salvo、FreeRTOS 等少数实时 操作系统能在小 RAM 单片机上运行。相对 μC/OS-II、embOS 等商业操作系统,FreeRTOS 操作系统是完全免费的 操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点。 2搭建SOC系统工程详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“3-1-01米联客2024版ZynqSocSDK入门篇”中第一个工程 “01Vitis Soc开发入门”这个实验。 2.1系统框图
2.2编译并导出平台文件1:单击Block文件à右键àGenerate the Output ProductsàGlobalàGenerate。 2:单击Block文件à右键à Create a HDL wrapper(生成HDL顶层文件)àLet vivado manager wrapper and auto-update(自动更新)。 3:生成Bit文件。 4:导出到硬件: FileàExport HardwareàInclude bitstream 5:导出完成后,对应工程路径的soc_hw路径下有硬件平台文件:system_wrapper.xsa的文件。根据硬件平台文件system_wrapper.xsa来创建需要Platform平台。
3搭建Vitis-sdk工程创建soc_base sdk platform和APP工程。 3.1创建SDK Platform工程LWIP 库的修改: 1 :新版本系列工业级开发板板载网口芯片是RTL8211FDI,由于默认的驱动不支持,需要手动自己修改库文件。我 们这里已经提供了修改好的库,解压到vivado的安装路径下的对应路径下:
修改好后,需要关闭vitis-sdk然后重新打开sdk,否则无法识别修改的库(如果没打开SDK就可以直接打开SDK) 2:创建soc_base
3:为了创建lwip工程需要先对soc_base中的board support package简称bsp设置lwip库的支持
4:对lwip库参数修改以达到最佳性能。 和 SDK 纯裸机不一样,这里本例程使用 SOCKET API,即函数调用依赖操作系统。将 use_axieth_on_zynq 和 use_emaclite_on_zynq 设为 0。如下图所示。
修改 lwip_memory_options 设置,将 mem_size ,memp n pbuf,mem n tcp_pcb ,memp n tcp_seg 这 4 个参数 值设大,这样会提高 TCP 传输效率。如下图所示。
修改 pbuf_options 设置,将 pbuf_pool_size 设大,增加可用的 pbuf 数量,这样同样会提高 TCP 传输效率。如下 图所示。
修改 tcp_options 设置,将 tcp_snd_buf,tcp_wnd 参数设大,这样同样会提高 TCP 传输效率。如下图所示。
修改 temac_adapter_options 设置,将 n_rx_descriptors 和 n_tx_descriptors 参数设大。这样可以提高zynq 内部emacdma 的数据迁移效率,同样能提高 TCP 传输效率。如下图所示。
编译
4 free_RTOS Hello_World APP
4.1 创建 free_RTOS Hello_World APP 工程
4.2程序分析
1: 计算时间参数x10seconds=pdMS_TO_TICKS( DELAY_10_SECONDS )函数 函数原型如下: #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) 其中configTICK_RATE_HZ参数,以毫秒为单位,计算10秒需要的值。configTICK_RATE_HZ参数是freeRTOS的时钟Tick的频率,也就是FreeRTOS用到的定时中断的产生频率。这个频率越高则定时的精度越高,但是由此带来的开销也越大。FreeRTOS 自带的Demo 程序中将TickRate 设为了1000Hz只是用来测试内核的性能的。实际的应用程序应该根据需要改为较小的数值。 当多个任务共用一个优先级时,内核调度器回来每次时钟中断到来后轮转切换任务,因此,更高的Tick Rate 会导致任务的时间片变短。 2:任务调度函数以下2个函数创建两个任务。 Tx任务的优先级比Rx任务低,因此,一旦Tx任务将项目放入队列,Rx任务将退出Blocked状态并抢占Tx任务。
3:创建消息队列xQueue = xQueueCreate( 1, sizeof( HWstring ) ) 创建任务使用的队列。 Rx任务的优先级高于Tx任务,因此将抢占Tx任务并在Tx任务写入队列后立即从队列中删除值-因此,队列中不能包含多个项目。 通过函数configASSERT( xQueue )确认队列创建成功 4:创建10s中断定时器创建一个计时器,该计时器的到期时间为10秒。 计时器将在10秒后到期,并且将调用计时器回调。 在计时器回调中,将进行检查以确保在此之前任务一直正常运行。在计时器回调中将删除任务,并打印一条消息以表明示例已成功运行。 计时器到期时间设置为10秒,计时器设置为不自动重载。
5:启动定时器和任务
6:发送任务当CPU调度发送任务,首先延迟1秒,然后在执行发送队列,将之前定义的xQueue队列消息发送出去,这里阻塞延迟设置0,代表以最快的速度发送。发送的参数为HWstring[15] = "Hello World"
7:接收任务当CPU调度接收任务,接收任务中等待消息队列的到达,并且把接收的数据保存到Recdstring变量中。
8:定时器中断回调前面定义了10s的定时器中断回调函数,当定时时间到达后产生中断。在定时器回调函数中,判断10s内是否完成了至少9次收发任务。并以此判断本文的实验是否成功。
4.3HelloWorld 方案演示硬件接线如下:
5 free_RTOS TCP_Echo_Server APP 工程
5.1 创建 free_RTOS TCP_Echo_Server APP 工程创建过程和 HelloWorld 方式一样, 只有一下界面中选择 FreeRTOS lwip Echo Server
5.2 free_RTOS TCP_Echo_Server 方案演示硬件接线如下:
6free_RTOS TCP_Perf_Client APP 工程
6.1 创建 free_RTOS TCP_Perf_Client APP 工程创建过程和 HelloWorld 方式一样, 只有一下界面中选择 FreeRTOS lwip TCP Perf Client
6.2 free_RTOS TCP_Perf_Client 方案演示硬件接线如下:
先设置好网络调试助手
7 free_RTOS _UDP_Client APP 工程
7.1 创建 free_RTOS UDP_Perf_Client APP 工程创建过程和 HelloWorld 方式一样, 只有以下界面中选择 FreeRTOS lwip UDP Perf Client
7.2 free_RTOS UDP_Perf_Client 方案演示硬件接线如下:
|