两种构建Petalinux下应用程序的方法


一、使用Petalinux自带工具

1.1 创建和配置工程

本文使用官方BSP,直接创建工程。此步骤根据自己的需求进行建立
创建工程
切换到工程目录,创建应用程序,输入:

petalinux-create -t apps -n myapp --enable

其中myapp是你应用程序的名字。而--enable参数则是使能对你的应用程序的编译,这样就不用再次去rootfs下再次启动配置。
创建应用程序
打开目录<工程根目录>/project-spec/meta-user/recipes-apps/myapp,可以看到file下存放着你的源码,可以根据自己的需求,直接替换里面的内容。本文就以示例中的Hello World直接进行编译。
工程目录

1.2 编译与运行

切换回工程根目录,重新编译整个工程,输入:

petalinux-build

你也可以单独编译你的应用程序

petalinux-build -c <你的应用程序名字>

此时应用程序仅仅只是单独编译,并没有安装到系统中;如果要将应用程序安装到系统中,输入:

petalinux-build -c <你的应用程序名字> -x do_install
petalinux-build -c rootfs
petalinux-build -x package

第一行将应用程序安装到目标的根文件系统主机副本中<TMPDIR>/work/<MACHINE_NAME>-xilinx-linux/petalinux-image-minimal/1.0-r0/rootfs/.

TMPDIR可以在petalinux-config → Yocto-settings → TMPDIR中找到。如果项目在本地存储,TMPDIR为<工程根目录>/build/tmp/.

第二、三行将应用程序编译入系统镜像。
编译

1.3 测试

ZYNQ有多种启动方式,本文采用以SD卡启动方式为例子;

先生成工程的镜像文件,在工程根目录输入:

petalinux-package --boot --format BIN --fsbl <FSBL的ELF目录> --fpga <FPGA硬件描述bit目录> --u-boot --force

生成镜像文件
<工程根目录>/image/linux下的 BOOT.bin、boot.scr、image.ub这三个文件拷贝到SD卡中,然后调整器件为以SD卡模式启动。

等待进入系统后,输入你的应用程序名字来检测是否添加成功;如本文测试程序myapp
测试程序
使用如下命令可以查看所有已安装的应用程序

cd /usr/bin/
ls

比较多一页放不下,同时也可以找到我们的应用程序(红框)
所有应用程序

1.4 后记

  1. 最好不要使用已有程序作为名字,否则会有冲突以至于发生未知问题。本人曾以test作为名字,与已有test重复,导致无法运行。
  2. 推荐使用本地编译工具速度会大大提高。

二、使用交叉编译工具

2.1 安装交叉编译工具

首先确定你所使用的器件的架构,与其对应的编译工具

Target Architecturex-tool prefix
Zynq-7000 (CodeSourcery - soft float)arm-xilinx-linux-gnueabi-
Zynq-7000 (Linaro - hard float)arm-linux-gnueabihf-
Zynq UltraScale+ MPSoC (ZynqMP)aarch64-linux-gnu-
Microblaze little endianmicroblazeel-xilinx-linux-gnu-
Microblaze big endianmicroblaze-xilinx-linux-gnu-
PowerPCpowerpc-eabi-

本文使用的是ZynqMP系列器件,所以使用aarch64-linux-gnu-gcc/g++(注:最后一个破折号需要自己确定具体编译工具类型)

下载和安装aarch64-linux-gnu-gcc,输入:

sudo apt-get install gcc-aarch64-linux-gnu

如果你同时安装有Petalinux,安装过程中需要注意: 由于兼容性问题,该安装会卸载gcc-multilib,而此库为Petalinux必备运行库,使用Petalinux必须重新安装,且重新安装gcc-multilib会导致gcc-aarch64-linux-gnu被卸载
交叉编译工具安装

2.2 编译

编译没有特别需要强调的,按照正常的交叉编译工具使用就可以了。

如本文新建一个HelloWorld模板的test.c,输入如下命令编译成二进制文件:

aarch64-linux-gnu-gcc test.c -o test

2.3 测试

把输出的文件(test)导入到系统,本文是直接复制到启动的SD卡上。

切换到SD卡目录,运行文件

cd <SD卡挂载点>
./test

在这里插入图片描述

2.4 后记

【未尝试】添加已经编译好的文件到PetaLinux根文件系统中

  1. 确保已经你以PetaLinux(器件)的目标架构去编译你的代码
  2. 用以下命令新建一个应用程序
petalinux-create -t apps --template install --name <应用程序名字> --enable
  1. 进入你刚刚所创建的应用程序工程目录
cd <工程根目录>/project-spec/meta-user/recipes-apps/<应用程序名字>/files/
  1. 删除已存在的应用程序,复制你已经预先编译好的应用程序到<应用程序名字>/files/
rm myapp
cp <预编译好的应用程序目录> ./

注意:需要确保安装模板应用程序安装到目标文件系统中的二进制数据与系统的底层硬件实现兼容。

总结

实际创建APP方法不止文中这两种,可以根据自己的喜好自由选择。


参考文章

[1] UG1144-petalinux-tools-reference-guide

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个基于PetaLinux的CAN应用程序示例,它可以在Zynq SoC上运行: 1. 首先,在PetaLinux添加CAN控制器IP核,并生成PetaLinux系统。 2. 在PetaLinux中创建一个新的应用程序: ``` petalinux-create -t apps -n can_app --enable ``` 3. 进入新创建的应用程序目录: ``` cd components/apps/can_app ``` 4. 创建一个C文件,例如can_app.c,添加以下代码: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <linux/can.h> #include <linux/can/raw.h> #define CAN_INTERFACE "can0" // CAN接口名称 int main(int argc, char *argv[]) { int s, nbytes; struct sockaddr_can addr; struct can_frame frame; // 创建socket if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } // 设置CAN接口 strcpy(addr.can_ifname, CAN_INTERFACE); ioctl(s, SIOCGIFINDEX, &addr); // 绑定socket到CAN接口 if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } // 发送CAN数据 frame.can_id = 0x123; frame.can_dlc = 2; frame.data[0] = 0x11; frame.data[1] = 0x22; nbytes = write(s, &frame, sizeof(struct can_frame)); if (nbytes != sizeof(struct can_frame)) { perror("write"); return 1; } // 接收CAN数据 nbytes = read(s, &frame, sizeof(struct can_frame)); if (nbytes < 0) { perror("read"); return 1; } printf("CAN data received: "); for (int i = 0; i < frame.can_dlc; i++) { printf("%02x ", frame.data[i]); } // 关闭socket close(s); return 0; } ``` 5. 修改Makefile文件,添加以下内容: ``` can_app: can_app.c $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $< ``` 6. 在PetaLinux中编译应用程序: ``` petalinux-build -c can_app ``` 7. 将编译生成的可执行文件复制到PetaLinux系统中: ``` petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot --kernel --force petalinux-package --image -c rootfs --format tar --output ../petalinux_rootfs.tar scp images/linux/can_app root@192.168.1.10:/home/root ``` 其中,192.168.1.10是Zynq SoC的IP地址。 8. 在Zynq SoC上运行CAN应用程序: ``` ./can_app ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值