Xilinx SDK创建并使用静态库

本文详细介绍了如何使用Xilinx SDK 2019.1版本创建和使用静态库,包括创建静态库工程、编译生成静态库文件、在目标工程中添加静态库和头文件,以及如何正确链接静态库进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文记录了利用Xilinx的SDK工具创建并使用静态库的方法,SDK版本号2019.1。

创建静态库

新建一个Library工程,如下图所示选中Library Project:
在这里插入图片描述
选择Next,库的类型选择Static Library, 平台选择Standalone,输入工程名称,如下图所示:
在这里插入图片描述

选择Finish,工程就创建完成了。
在工程src目录下分别添加文件MyTestLibrary.h和MyTestLibrary.c文件,并添加测试代码如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译后会生成libMyTestLibrary.a文件,如下图所示:
在这里插入图片描述
在这里插入图片描述

加载使用静态库

添加静态库和头文件到目标工程

创建一个helloworld的工程,在工程目录创建一个mylib的目录,并在mylib文件夹下面分别创建lib和include文件夹,分别用来放libMyTestLibrary.a文件和MyTestLibrary.h文件,如下图所示:
在这里插入图片描述
注: 需要指向helloworld工程,【右键】–>【Refresh】

链接到静态库

依照Xilinx SDK提供的步骤:

Right-click your Applicatione project and select C/C++ Build Settings. Alternately, you could select Properties and navigate to C/C++ Build > Settings.

在这里插入图片描述

注意:(Libraries)为实际的静态库名称MyTestLibrary,(Library search path)对应的是静态库目录的绝对路径。可以通过如下方式添加:

选择【Add】–>【workspace】–>【helloworld】–>【OK】
添加实际的静态库目录。

在这里插入图片描述
在这里插入图片描述
配置完成后,修改helloworld.c文件如下图所示:
在这里插入图片描述
连接目标板,通过JTag调试,静态库接口调用正常:
在这里插入图片描述

### 配置和使用UART接口 对于Xilinx Zynq-7000系列器件,如XC7Z045-2FFG900I,在Xilinx SDK中配置和使用UART接口涉及几个关键步骤。当创建一个新的硬件平台项目导入至SDK之后,可以通过调用特定API来初始化和操作UART外设。 #### 初始化UART设备 在应用程序源文件内需包含头文件`xuartps.h`以便访问UART驱动程序函数。接着定义一个全局变量用于保存实例数据结构体指针,该结构体负责管理具体的UART通道资源: ```c #include "xparameters.h" #include "xuartps.h" XUartPs Uart; ``` 随后实现初始化过程,通常放置于main()函数早期部分执行: ```c int status; /* Initialize the UART */ status = XUartPs_CfgInitialize(&Uart, XPAR_XUARTPS_0_DEVICE_ID, XPAR_PS7_UART_1_BASEADDR); if (status != XST_SUCCESS){ return XST_FAILURE; } ``` 上述代码片段展示了如何针对预定义ID号的UART组件完成基本设置工作[^1]。 #### 发送接收字符流 一旦成功完成了UART外围电路的初始化,则可以利用发送(`XUartPs_Send`)以及接收(`XUartPs_Recv`)两个成员方法来进行简单的串行通信任务处理: ```c char txBuffer[] = "Hello from Zynq!"; u32 countSent = strlen(txBuffer); // Send data over UART while(XUartPs_IsTransmitFull(&Uart)); XUartPs_Write(&Uart, (u8*)txBuffer, countSent); // Wait until all bytes have been sent out while(!XUartPs_IsSendComplete(&Uart)); printf("Message transmitted successfully.\n"); ``` 这段示范说明了怎样向目标终端输出一条消息字符串,等待传输结束确认信号返回后再继续后续流程。 --- ### 使用以太网接口 关于以太网控制器方面的工作则相对复杂一些,特别是涉及到PHY层物理连接时更需要注意细节差异。这里假设已经按照文档指导正确搭建好了相应的IP核及其参数设定。 #### 创建网络栈环境 首先应当引入必要的库支持,比如lwip协议栈等第三方工具包;其次编写一段脚本来加载MAC地址表项以及其他必要属性值给定初始状态下的ETHIF对象实体: ```c #include "netif/ethernetif.h" #include "arch/sys_arch.h" #include "hwconfig.h" struct netif gNetIf; extern void lwip_init(void); extern err_t ethernetif_init(struct netif *netif); void setup_network(){ /* Add network interface to the list of available interfaces */ netif_add(&gNetIf, IP_ADDR_ANY, IP_MASK_DEFAULT, GW_IP_ADDRESS, NULL, &ethernetif_init, tcpip_input); /* Register default network interface */ netif_set_default(&gNetIf); /* Bring up the link and start DHCP client */ netif_set_up(&gNetIf); dhcp_start(&gNetIf); } int main(){ sys_thread_new("network_setup", setup_network, NULL, DEFAULT_THREAD_STACKSIZE, tskIDLE_PRIORITY + 1 ); vTaskStartScheduler(); } ``` 此段落描述了一个典型的应用场景下启动LwIP TCP/IP堆栈的过程,其中包含了注册默认路由、激活链路层服务等功能点[^2]。 #### 实现TCP服务器功能 下面给出了一种简易版HTTP Web Server框架的设计思路——监听指定端口号上的入站请求事件,依据GET命令解析路径名后响应对应的静态页面内容: ```c static const char* html_content = "<html><body>" " <h1>Welcome To My Embedded System</h1>" "</body></html>"; err_t http_server_accept(void *arg, struct tcp_pcb *newpcb, err_t err){ static int connection_id = 0; ++connection_id; printf("New HTTP Connection #%d\n", connection_id); tcp_arg(newpcb, arg); tcp_sent(newpcb, http_server_send); tcp_recv(newpcb, http_server_receive); return ERR_OK; } err_t http_server_receive(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err){ if (!p) { tcp_close(tpcb); return ERR_OK; } // Echo back received packet as response body tcp_write(tpcb, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n", 64, 1); tcp_write(tpcb, html_content, sizeof(html_content), 1); tcp_output(tpcb); // Close this session after sending reply tcp_poll(tpcb, NULL, 0); tcp_sent(tpcb, NULL); tcp_recv(tpcb, NULL); tcp_close(tpcb); pbuf_free(p); return ERR_OK; } void init_http_server(u16_t port){ struct tcp_pcb *pcb = tcp_new(); err_t err = tcp_bind(pcb, IP_ADDR_ANY, port); pcb = tcp_listen(pcb); tcp_accepted(pcb, http_server_accept); } ``` 以上示例实现了基于TCP协议构建web server的核心逻辑,包括但不限于建立监听套接字、读取客户端指令集、组装回复报文体等内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值