zynq hls初体验(三) 在linux下使用自己的hls生成的 ip

时间:2024-02-21 14:44:48

在linux下使用自己的hls生成的 ip

上一部分我们讲述了如何通过裸机调用自己的hls ip
但是我们通常更为常见的一种场景是 在linux下使用我们自己制作的ip,例如我们自己创作了一个浮点数计算加速的ip,那么我们在linux下的其他复杂应用如何调用这个ip呢?
在上一部分的sdk中我们看到了sdk自动生成的bsp部分中包含一个xled_ctrl_linux.c的文件,那么这个文件是不是可以有助于我们在linux下使用hls的ip核呢,答案是right,接下来将讲述过程

这里说句题外话,sdk生成的bsp是适用于裸机或freertos的,并不能完整的直接拷贝到linux端使用。其编译工具链也是-none-eabi-

接下来入正题
我们查看xled_ctrl_linux.c的源代码可以很容易的看到其是基于uio进行设计的,其实这也很好理解,这样可以最大限度的减小开发耦合,其实如果想自己去做这部分驱动也很简单,在下面的一张vivado的图中可以看到物理地址,只要对这部分地址进行映射操作,就可以很容易的写出来自己的驱动了,其实sdk的uio驱动也是做了这部分工作,这里不赘述了。
在这里插入图片描述在这里插入图片描述* 1 创建自己的petalinux工程,在设备树文件中添加uio的地址区间
在这里插入图片描述然后执行编译,上板启动
其实到这里如果有过内核驱动开发的同学,应该已经知道怎么做了
在这里插入图片描述我们创建的一个自己的app目录,将sdk生成的bsp文件拷贝过来,如下

zw@zw-pc:~/swap/explore/hls/led_project/app/bsp$ ls
Makefile  ps7_cortexa9_0  system.mss

然后进入ps7_cortexa9_0/libsrc/led_ctrl_v1_0/src/目录,将原来的makefile注释掉,然后添加自己的makefile,内容如下,执行make,注意下路径,为了偷懒,我这里直接写了绝对路径。。。

CC = arm-linux-gnueabihf-gcc
ROOT_DIR      :=  $(shell pwd)
LDFLAGS = 

LIB = ${ROOT_DIR}/libxled.a
INC = /home/zw/swap/explore/hls/led_project/app/bsp/ps7_cortexa9_0/include

OBJS = ${ROOT_DIR}/xled_ctrl_linux.o \
		${ROOT_DIR}/xled_ctrl.o 

all:${LIB} 
	

${ROOT_DIR}/xled_ctrl_linux.o: ${ROOT_DIR}/xled_ctrl_linux.c
	${CC} -c $< -o $@ ${CFLAGS} -I${INC} ${LDFLAGS}

${ROOT_DIR}/xled_ctrl.o: ${ROOT_DIR}/xled_ctrl.c
	${CC} -c $< -o $@ ${CFLAGS} -I${INC} ${LDFLAGS}

${LIB}: ${OBJS}
	rm -f $@
	${AR} crs ${LIB} ${OBJS}
	
clean:
	rm $(LIB)
	rm ${ROOT_DIR}/*.o

这样属于这个led的lib库就生成了
然后编写我们自己的app和对应的makefile
test_led.c

#include "stdio.h"

#include "xled_ctrl.h"
#include "xparameters.h"

int main(int argc, char *argv[])
{
    XLed_ctrl ledctrl;

    printf("test in . \n");

    if (XST_SUCCESS != XLed_ctrl_Initialize(&ledctrl, "led_ctrl"))
    {
        printf("led init error . \n");
        return 1;
    }
    XLed_ctrl_Set_high_cnt(&ledctrl, 50000000);
    XLed_ctrl_Set_total_cnt(&ledctrl, 100000000);

    printf("test out . \n");
    return 0;
}

makefile

export ROOT_DIR      :=  $(shell pwd)
export SRC_DIR       :=  $(ROOT_DIR)/src
export BSP_DIR       :=  $(ROOT_DIR)/bsp
export CC = arm-linux-gnueabihf-gcc

COMMON_CFLAG_OPTION      := -rdynamic -O2 -Wall -Wno-pointer-to-int-cast\
                            -Wno-incompatible-pointer-types -Wno-pointer-sign\
                            -Wno-missing-braces -Wno-format 
export CFLAGS            += -I$(BSP_DIR)/ps7_cortexa9_0/include
export DFLAGS            := -lpthread -lm -lcrypt -ldl -lrt\
                            -L$(BSP_DIR)/ps7_cortexa9_0/lib/ -lxled

OBJS := test_led.o 
TARGET  := test_led


.PHONY : all objs clean

all : $(TARGET)

objs :$(OBJS)


$(TARGET) : $(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS) $(DFLAGS)

clean :
	rm *.o -rf

执行make,导入到板子上,执行应用,发现led呈闪烁状态,证明确实驱动起来了