对Xil_Out32未定义的引用

本文记录了一次在HLS工程中遇到的官方库函数Xil_Out32未定义的问题及解决过程。通过在主函数文件中引入xil_io.h头文件,成功解决了函数未定义的链接错误。
AI助手已提取文章相关产品:

第一次在HLS中遇见一个官方库函数未定义问题,这就把解决方法记录下来。

在创建好工程,写完工程代码后,发现报错如下

./src/led_controller_test_tut_4A.o:在函数‘main’中:

/home/greedyhao/Projects/LearningAndWorking/led_controller/led_controller.sdk/LED_Controller_test/Debug/../src/led_controller_test_tut_4A.c:44:对‘Xil_Out32’未定义的引用

collect2: error: ld returned 1 exit status

makefile:39: recipe for target 'LED_Controller_test.elf' failed

make: *** [LED_Controller_test.elf] Error 1

一眼就知道Xil_Out32这个函数,绝对是官方定义的啊。

找到它的定义在xil_io.h这个文件中

static INLINE void Xil_Out32(UINTPTR Addr, u32 Value)

{

   ...

}

在网上查到有人说,因为这个函数是static的,所以将这个头文件include到主函数的文件就可以了

于是在主函数文件添加#include "xil_io.h"并保存好,工程正常

 

END -

 

 

您可能感兴趣的与本文相关内容

#include <stdio.h> #include "xil_io.h" #include "xparameters.h" #include "xil_types.h" #include "xil_cache.h" /************************** 核心寄存器/参数(仅保留验证版配置,删除帧同步) **************************/ // 完全保留验证通过的参数,删除所有VSYNC相关定义 #define VDMA_BASEADDR XPAR_AXI_VDMA_0_BASEADDR #define VDMA_FRAME0 0x01000000 #define STRIDE 1024 #define HSIZE 1024 #define VSIZE 720 #define VDMA_WR_CTRL 0x30 #define VDMA_WR_FRAME0 0xAC #define VDMA_WR_STRIDE 0xA8 #define VDMA_WR_HSIZE 0xA4 #define VDMA_WR_VSIZE 0xA0 #define VDMA_RD_CTRL 0x00 #define VDMA_RD_FRAME0 0x5C #define VDMA_RD_STRIDE 0x58 #define VDMA_RD_HSIZE 0x54 #define VDMA_RD_VSIZE 0x50 #define GPIO_BASEADDR 0xE000A000 #define KEY_MIO_PIN 20 // 保留已验证的MIO20按键 #define GPIO_INTR_ID 52 // ZYNQ GPIO全局中断号(固定) #define GIC_DIST_BASE 0xF8F01000 #define GIC_CPU_BASE 0xF8F00100 #define STATE_RECORD 1 // 录像(上电默认) #define STATE_PLAYBACK 2 // 回放 #define STATE_STANDBY 0 // 待机 /************************** 全局变量(保留防重复触发标记,删除帧同步相关) **************************/ volatile u8 g_Record_State = STATE_RECORD; // 上电默认录像 volatile u8 g_key_release_flag = 1; // 保留防重复触发(加固功能) /************************** 函数前置声明(删除帧同步相关函数) **************************/ void Key_Interrupt_Handler(void); void Gpio_Intr_Init(void); void Intr_Vector_Register(void); void Stop_Vdma(void); /************************** 中断向量表(完全保留验证版) **************************/ static void (*vector_table[])(void) __attribute__((section(".vectors"), aligned(32))) = { (void (*)(void))0x0, (void (*)(void))0x0, (void (*)(void))0x0, (void (*)(void))0x0, (void (*)(void))0x0, (void (*)(void))0x0, (void (*)(void))Key_Interrupt_Handler, (void (*)(void))0x0 }; /************************** 按键中断处理(删除帧同步调用,保留核心逻辑) **************************/ void Key_Interrupt_Handler(void) { // 保留验证通过的消抖延时 for(u32 i=0; i<100000; i++); // 保留按键检测+防重复触发逻辑 if((Xil_In32(GPIO_BASEADDR + 0x0040) & (1 << KEY_MIO_PIN)) == 0 && g_key_release_flag == 1) { g_key_release_flag = 0; // 锁定,避免重复触发 // 保留原状态机切换逻辑(完全未改) switch(g_Record_State) { case STATE_RECORD: g_Record_State = STATE_PLAYBACK; printf("Stop Record → Start Playback [MIO20 Key]\n"); Xil_Out32(VDMA_BASEADDR+VDMA_WR_CTRL, 0x0); Xil_Out32(VDMA_BASEADDR+VDMA_RD_CTRL, 0x1); Xil_Out32(VDMA_BASEADDR+0x5c, VDMA_FRAME0); Xil_Out32(VDMA_BASEADDR+0x58, STRIDE*2); Xil_Out32(VDMA_BASEADDR+0x54, HSIZE*2); Xil_Out32(VDMA_BASEADDR+0x50, VSIZE); break; case STATE_PLAYBACK: g_Record_State = STATE_STANDBY; printf("Stop Playback → Standby [MIO20 Key]\n"); Stop_Vdma(); break; case STATE_STANDBY: g_Record_State = STATE_RECORD; printf("Standby → Start Record [MIO20 Key]\n"); Xil_Out32(VDMA_BASEADDR+VDMA_RD_CTRL, 0x0); Xil_Out32(VDMA_BASEADDR+VDMA_WR_CTRL, 0x1); Xil_Out32(VDMA_BASEADDR+0xAC, VDMA_FRAME0); Xil_Out32(VDMA_BASEADDR+0xA8, STRIDE*2); Xil_Out32(VDMA_BASEADDR+0xA4, HSIZE*2); Xil_Out32(VDMA_BASEADDR+0xA0, VSIZE); break; } // 保留验证通过的中断标志清除 Xil_Out32(GPIO_BASEADDR + 0x0098, 1 << KEY_MIO_PIN); Xil_Out32(GIC_DIST_BASE + 0x0280 + (GPIO_INTR_ID/32)*4, 1 << (GPIO_INTR_ID%32)); } // 保留按键松开解锁逻辑 else if((Xil_In32(GPIO_BASEADDR + 0x0040) & (1 << KEY_MIO_PIN)) != 0) { g_key_release_flag = 1; } } /************************** GPIO中断初始化(删除MIO21配置,保留MIO20验证版) **************************/ void Gpio_Intr_Init(void) { // 完全保留MIO20的验证版配置(一字未改) Xil_Out32(GPIO_BASEADDR + 0x0000, Xil_In32(GPIO_BASEADDR + 0x0000) & ~(1 << KEY_MIO_PIN)); Xil_Out32(GPIO_BASEADDR + 0x0008, Xil_In32(GPIO_BASEADDR + 0x0008) & ~(1 << KEY_MIO_PIN)); Xil_Out32(GPIO_BASEADDR + 0x0080, Xil_In32(GPIO_BASEADDR + 0x0080) | (1 << KEY_MIO_PIN)); Xil_Out32(GPIO_BASEADDR + 0x0088, Xil_In32(GPIO_BASEADDR + 0x0088) & ~(1 << KEY_MIO_PIN)); Xil_Out32(GPIO_BASEADDR + 0x0090, Xil_In32(GPIO_BASEADDR + 0x0090) | (1 << KEY_MIO_PIN)); // 完全保留GIC初始化的验证版配置 Xil_Out32(GIC_DIST_BASE + 0x0000, 0x01); Xil_Out32(GIC_CPU_BASE + 0x0000, 0x01); Xil_Out32(GIC_DIST_BASE + 0x0100 + (GPIO_INTR_ID/32)*4, 1 << (GPIO_INTR_ID%32)); } /************************** 中断向量注册(完全保留验证版) **************************/ void Intr_Vector_Register(void) { Xil_DCacheFlush(); asm volatile( "MOV r0, %0\n" "MCR p15, 0, r0, c12, c0, 0\n" : : "r" (vector_table) : "r0" ); asm volatile("cpsie i"); } /************************** 停止VDMA所有通道(保留优化后的等待逻辑) **************************/ void Stop_Vdma(void) { Xil_Out32(VDMA_BASEADDR+VDMA_WR_CTRL, 0x0); Xil_Out32(VDMA_BASEADDR+VDMA_RD_CTRL, 0x0); for(u32 i=0; i<1000; i++); // 保留等待逻辑(加固稳定性,无副作用) } /************************** 主函数(删除帧同步相关打印,保留验证版) **************************/ int main() { // 完全保留验证版初始化逻辑 Xil_DCacheEnable(); Gpio_Intr_Init(); Intr_Vector_Register(); // 完全保留VDMA验证版配置 Xil_Out32(VDMA_BASEADDR+0x30, 0x1); Xil_Out32(VDMA_BASEADDR+0xAC, VDMA_FRAME0); Xil_Out32(VDMA_BASEADDR+0xA8, STRIDE*2); Xil_Out32(VDMA_BASEADDR+0xA4, HSIZE*2); Xil_Out32(VDMA_BASEADDR+0xA0, VSIZE); Xil_Out32(VDMA_BASEADDR, 0x1); Xil_Out32(VDMA_BASEADDR+0x5c, VDMA_FRAME0); Xil_Out32(VDMA_BASEADDR+0x58, STRIDE*2); Xil_Out32(VDMA_BASEADDR+0x54, HSIZE*2); Xil_Out32(VDMA_BASEADDR+0x50, VSIZE); // 保留原打印信息,删除帧同步相关提示 printf("=== EBAZ4205 VDMA Control ===\n"); printf("Auto Start Record! Press MIO20 Key to Switch State\n"); // 保留原主循环 while(1) { // 无逻辑,仅维持程序运行 } return 0; } 检查代码是否正确(开发板为EBAZ4205)
最新发布
12-10
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值