[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_SDK高级篇连载-22FreeRTOS 实时操作系统方案

文档创建者:FPGA课程
浏览次数:76
最后更新:2024-10-11
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-SOC » 1_SDK应用方案(仅旗舰型号) » 2-SDK高级应用方案
本帖最后由 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系统框图
62f189b0a719448abd4ad0d47563450b.jpg
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平台。
def8e8c9381d46c98c80a1a3d315069d.jpg
3搭建Vitis-sdk工程
创建soc_base sdk platform和APP工程。
3.1创建SDK Platform工程
LWIP 库的修改:
1 :新版本系列工业级开发板板载网口芯片是RTL8211FDI,由于默认的驱动不支持,需要手动自己修改库文件。我 们这里已经提供了修改好的库,解压到vivado的安装路径下的对应路径下:
d2c544ea74f74a7f8acdd23613c8e8b7.jpg
0e385835776c4ad09c00a70ad8fd779f.jpg
修改好后,需要关闭vitis-sdk然后重新打开sdk,否则无法识别修改的库(如果没打开SDK就可以直接打开SDK)
2:创建soc_base
77f16c02608946c892f8223cccdd295a.jpg
b6eaba0b55d3419a8d79deacee9bdf01.jpg

3:为了创建lwip工程需要先对soc_base中的board support package简称bsp设置lwip库的支持
06899e7f05d044bab5ed41210d169765.jpg
4:对lwip库参数修改以达到最佳性能。
和 SDK 纯裸机不一样,这里本例程使用 SOCKET API,即函数调用依赖操作系统。将 use_axieth_on_zynq 和 use_emaclite_on_zynq 设为 0。如下图所示。
36902c0c62444b6b9e0913b4b54d1898.jpg
修改 lwip_memory_options 设置,将 mem_size ,memp  n  pbuf,mem  n  tcp_pcb ,memp  n  tcp_seg 这 4 个参数 值设大,这样会提高 TCP 传输效率。如下图所示。
ada07d29298d46cda1337c34d3046657.jpg
修改 pbuf_options 设置,将 pbuf_pool_size 设大,增加可用的 pbuf 数量,这样同样会提高 TCP 传输效率。如下 图所示。
8dcae79a32d24b36876c859ecd476b40.jpg
修改 tcp_options 设置,将 tcp_snd_buf,tcp_wnd 参数设大,这样同样会提高 TCP 传输效率。如下图所示。
01d72385362c4da79ad3f4831ba9f260.jpg
修改 temac_adapter_options 设置,将 n_rx_descriptors 和 n_tx_descriptors 参数设大。这样可以提高zynq  内部emacdma 的数据迁移效率,同样能提高 TCP 传输效率。如下图所示。

bf58a2ff2c574783a4d59ab67f131ba5.jpg
编译

4 free_RTOS Hello_World APP
4.1 创建 free_RTOS Hello_World APP 工程
5c1f1dea56d54565a999eacd627fb6cc.jpg
c11b63e74b914478894f2b76ad6006c7.jpg

affa63493ee842feac3e7fa39d65de75.jpg
e772e665a4be41db8c7315a228944b0c.jpg

35ad21cb859445148363f2576cda0801.jpg
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任务。
abf659e52ef3434ab0ca7f42fdab7d65.jpg
3:创建消息队列
xQueue = xQueueCreate( 1, sizeof( HWstring ) )
创建任务使用的队列。 Rx任务的优先级高于Tx任务,因此将抢占Tx任务并在Tx任务写入队列后立即从队列中删除值-因此,队列中不能包含多个项目。
通过函数configASSERT( xQueue )确认队列创建成功
4:创建10s中断定时器
创建一个计时器,该计时器的到期时间为10秒。 计时器将在10秒后到期,并且将调用计时器回调。 在计时器回调中,将进行检查以确保在此之前任务一直正常运行。在计时器回调中将删除任务,并打印一条消息以表明示例已成功运行。 计时器到期时间设置为10秒,计时器设置为不自动重载。
ee9dbe80cc284db9b4ba3318f74563c2.jpg
5:启动定时器和任务
41c165f089ce45c3a846eb49930dd6b3.jpg
6:发送任务
当CPU调度发送任务,首先延迟1秒,然后在执行发送队列,将之前定义的xQueue队列消息发送出去,这里阻塞延迟设置0,代表以最快的速度发送。发送的参数为HWstring[15] = "Hello World"
cee5ad772dc044d5831b3e2bc751e7c2.jpg
7:接收任务
当CPU调度接收任务,接收任务中等待消息队列的到达,并且把接收的数据保存到Recdstring变量中。
694761c44937438b89251c92d87af44d.jpg
8:定时器中断回调
前面定义了10s的定时器中断回调函数,当定时时间到达后产生中断。在定时器回调函数中,判断10s内是否完成了至少9次收发任务。并以此判断本文的实验是否成功。
ad4bccbc48af4897ab402232b2f068ec.jpg

4.3HelloWorld 方案演示
硬件接线如下:


f34bf00180a44ba8a3a98b5caf4c36ef.jpg

7ff7ff7ebee5412a87bc0e1c20608349.jpg
5 free_RTOS TCP_Echo_Server APP 工程
5.1 创建 free_RTOS TCP_Echo_Server APP 工程
创建过程和 HelloWorld 方式一样, 只有一下界面中选择 FreeRTOS lwip Echo Server
ea1d0394678e4ece9c09a3384e7e3b4c.jpg
5.2 free_RTOS TCP_Echo_Server 方案演示
硬件接线如下:
b21803483d2747b78b6e1ca1a025b196.jpg
9b465bf771fc47e6a12d3f550e0d8920.jpg
7ee083eef81540edb67237dd0be6e0ab.jpg
6free_RTOS TCP_Perf_Client APP 工程
6.1 创建 free_RTOS TCP_Perf_Client APP 工程
创建过程和 HelloWorld 方式一样, 只有一下界面中选择 FreeRTOS lwip TCP Perf Client
b9b0de311e9d4fab9f8737ab7d115d2f.jpg
6.2 free_RTOS TCP_Perf_Client 方案演示
硬件接线如下:

先设置好网络调试助手
839ded29910f4835a18d59343e4279e9.jpg
df17c48638be4f83ab086dc149da0b07.jpg
7 free_RTOS _UDP_Client APP 工程
7.1 创建 free_RTOS UDP_Perf_Client APP 工程
创建过程和 HelloWorld 方式一样, 只有以下界面中选择 FreeRTOS lwip UDP Perf Client
fa1075e5d70747ac9d58961249b5a78e.jpg
7.2 free_RTOS UDP_Perf_Client 方案演示
硬件接线如下:


725da7a691c2462abd1e0ec1092191ec.jpg
5b650d12331f4255b16671a097e4d7a7.jpg

b21803483d2747b78b6e1ca1a025b196.jpg
b21803483d2747b78b6e1ca1a025b196.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则