山疯子 2023-05-24 14:50 采纳率: 50%
浏览 97
已结题

vitis编译代码出现makefile编译错误且无提示。

在使用vivado开发microblaze的时候,需要用到中断功能。芯片平台是xc7z020clg-400-1。所以我添加了一个axi interrupt controllor模块和两个axi gpio模块。其中一个gpio由于接收key按键输入。另外一个用于发送led显示。其block design所示。

img

生成比特流导出硬件。最后在vitis写c语言代码。

#include "xparameters.h"
#include "xintc.h"
#include "xgpio.h"
#include "sleep.h"

#define KEY_DEV_ID       XPAR_AXI_GPIO_1_DEVICE_ID  //按键 AXI GPIO ID
#define LED_DEV_ID       XPAR_AXI_GPIO_0_DEVICE_ID  //LED AXI GPIO ID
#define INTC_DEVICE_ID   XPAR_INTC_0_DEVICE_ID      //中断控制器ID
// 中断异常ID是一个适配所有处理器的宏定义
#define EXCEPTION_ID     XIL_EXCEPTION_ID_INT       //中断异常ID


static XIntc    Intc;                              //中断控制器实例
static XGpio    KEY_Gpio;                          //GPIO中断实例 按键
static XGpio    LED_Gpio;                          //GPIO实例

int led_value;          //LED值
int key_value;          //按键值
int Intr_times = 0;     //有效中断计数
int key_intr_flag = 0;  //中断标志

void GpioHandler(void *CallbackRef);

// 在主函数部分可以分为器件初始化、设置输入输出、设置中断系统和中断异常处理四部分
int main(){
    //AXI_GPIO器件初始化
    XGpio_Initialize(&KEY_Gpio, KEY_DEV_ID);
    XGpio_Initialize(&LED_Gpio, LED_DEV_ID);
    //为指定的GPIO信道设置所有独立信号的输入/输出方向
    XGpio_SetDataDirection(&LED_Gpio, 1, 0);
    //设置LED初始值
    XGpio_DiscreteWrite(&LED_Gpio, 1, 0x0f);
    XGpio_SetDataDirection(&KEY_Gpio, 1, 1);
    //初始化中断控制器
    XIntc_Initialize(&Intc, INTC_DEVICE_ID);
    //关联中断ID和中断服务函数
    //中断服务函数是需要我们自己编写的, 用于响应和处理 AXI GPIO 中断的函数
    XIntc_Connect(&Intc,KEY_DEV_ID,(Xil_ExceptionHandler)GpioHandler,&KEY_Gpio );
    //使能中断
    XGpio_InterruptEnable(&KEY_Gpio, 1);
    //使能全局中断
    XGpio_InterruptGlobalEnable(&KEY_Gpio);
    //在中断控制器上启用中断向量
    XIntc_Enable(&Intc,KEY_DEV_ID);

    XIntc_Start(&Intc, XIN_REAL_MODE);

    Xil_ExceptionInit();
    Xil_ExceptionRegisterHandler(EXCEPTION_ID,
            (Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);
    Xil_ExceptionEnable();


    while(1){
        if(key_intr_flag){        //检测中断标志信号有效
            key_value = XGpio_DiscreteRead(&KEY_Gpio, 1);  //读取按键值
            if(key_value == 0){             //检测按键是否按下
                if(Intr_times == 0)         //根据有效中断数点亮LED
                    led_value = 0x01;
                else if(Intr_times == 1)
                    led_value = 0x02;
                else if(Intr_times == 2)
                    led_value = 0x04;
                else
                    led_value = 0x08;
            //按键按下后点亮对应LED灯
            XGpio_DiscreteWrite(&LED_Gpio, 1, led_value);
            xil_printf("i = %d\r\n",Intr_times);  //打印当前的Intr_times
            Intr_times = (Intr_times + 1)%4;    //将计数值约束在0到3之间
            //延迟1秒
            sleep(1);
            }
        key_intr_flag = 0;              //中断标志清零
        }
    }
    return 0;
}

void GpioHandler(void *CallbackRef){
    XGpio *GpioPtr = (XGpio *)CallbackRef;
        key_intr_flag = 1;                   //接收到中断,标志信号拉高
        XGpio_InterruptDisable(GpioPtr, 1);  //关闭中断
        XGpio_InterruptClear(GpioPtr, 1);    //清除中断
        XGpio_InterruptEnable(GpioPtr, 1);   //使能中断
}

最后会显示:make:***[makefile:38:test.elf] Error 1

img

想问一下这个是什么问题。

在console窗口没有任何的提示

img


img

补充:这个问题主要由于初始化和配置中断控制器那几行代码引起的。在注释掉这些配置代码后就没有该问题了。

    XGpio_Initialize(&KEY_Gpio, KEY_DEV_ID);
    XGpio_Initialize(&LED_Gpio, LED_DEV_ID);
    //为指定的GPIO信道设置所有独立信号的输入/输出方向
    XGpio_SetDataDirection(&LED_Gpio, 1, 0);
    //设置LED初始值
    XGpio_DiscreteWrite(&LED_Gpio, 1, 0x0f);
    XGpio_SetDataDirection(&KEY_Gpio, 1, 1);
    //初始化中断控制器
    XIntc_Initialize(&Intc, INTC_DEVICE_ID);
    //关联中断ID和中断服务函数
    //中断服务函数是需要我们自己编写的, 用于响应和处理 AXI GPIO 中断的函数
    XIntc_Connect(&Intc,KEY_DEV_ID,(Xil_ExceptionHandler)GpioHandler,&KEY_Gpio );
    //使能中断
    XGpio_InterruptEnable(&KEY_Gpio, 1);
    //使能全局中断
    XGpio_InterruptGlobalEnable(&KEY_Gpio);
    //在中断控制器上启用中断向量
    XIntc_Enable(&Intc,KEY_DEV_ID);
    XIntc_Start(&Intc, XIN_REAL_MODE);
  • 写回答

7条回答 默认 最新

  • 鱼弦 全栈领域优质创作者 2023-05-24 16:11
    关注
    获得1.05元问题酬金

    根据提供的代码,可能的原因是编译出错,导致无法生成可执行文件test.elf。建议检查以下几点:

    确认Vivado工程中的IP核及其连接是否正确。特别是AXI Interrupt Controller模块的连接是否正确,是否已连接到MicroBlaze的中断控制器。

    确认代码中使用的XPAR_AXI_GPIO_1_DEVICE_ID和XPAR_AXI_GPIO_0_DEVICE_ID是否与Vivado中生成的硬件系统中的GPIO IP核对应,可以在生成的硬件系统中查看这些IP核的实例ID。

    确认Vitis编译器是否正确配置。可以检查Vitis项目的设置,确保已选择正确的硬件平台、编译器和库。

    确认是否已正确安装驱动程序和设备支持文件。可以检查Vivado安装目录下的driver文件夹和Vitis安装目录下的platforms文件夹,确保安装了相关的驱动和设备支持文件。

    如果以上几点都没有问题,可以尝试重新生成Vivado的比特流和Vitis的可执行文件。如果仍然出现问题,可以查看Vitis的编译输出日志,以了解详细的错误信息,或者尝试在代码中添加调试信息来确定问题所在。

    评论

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 创建了问题 5月24日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请