ZYNQ_Linux_裸机AMP Linux+裸机/RTOS

ZYNQ中两个CPU分别跑linux和裸机代码AMP

1.问题

​ 学习正点原子ZYNQ的时候发现了AMP这个东西,分别可以实现两个cpu跑两个不同的系统,可以实现CPU0跑linux,CPU1跑裸机或者RTOS,于是开始根据正点原子给的文档尝试实现linux+裸机的AMP。

​ 跟着教程的时候发现这么几个问题:

​ 1.分配设备树memory后linux分配的内存仍为最大,导致linux驱动加载时程序卡死,出现跳转空指针现象。

​ 2.CPU1裸机代码无法调用AXI总线,导致程序卡死。但在uboot、加载kernel之前能够正常运行CPU0和CPU1代码。

​ 3.加载linux驱动失败。

2.ZYNQ镜像编译

​ zynq的uboot、kernel、dtb、rootfs均是参考正点原子ZYNQA盘《3_领航者ZYNQ之嵌入式Linux开发指南_V2.2.pdf》的第二十章 另一种方式编译ZYNQ镜像

3.AMP搭建

​ linux搭建参考正点原子ZYNQA盘\9_增值资料\2,扩展资料\正点原子ZYNQ双核AMP通信示例_V1.0.pdf

4.问题解决

问题1:

发现过程

我手上的的是一块ZYNQ7010的板子,我将DDR的前256MB分配给了linux,剩下的分配给了裸机代码。

按照[3.AMP搭建](## 3.AMP搭建)中的3.2 制作 BOOT.BIN 启动开发板修改memory设备树之后

	memory {
		device_type = "memory";
		reg = <0x0 0x10000000>;
	};

insmod命令加载文档中的驱动,发现kernel报错指向空指针,kernel崩溃,板子卡死。

后面在驱动程序中debug,发现程序中的share_meme_addr

share_meme_addr = ioremap(SHARE_MEM_ADDR, 4);       // 将共享内存物理地址转换为虚拟地址

虚拟地址映射后返回为NULL空指针,重新复位开机。

通过命令free -m查看到linux内存分配仍为最大内存

前面修改的设备树memory节点并没有生效,且查看设备树文件夹下memory节点

root@Petalinux_uboot:/proc/device-tree/memory# xxd reg
00000000: 0000 0000 2000 0000                      .... ...

查看到memory节点的大小仍为0x2000 0000,也就是 512MB大小,并没有通过设备树获取,这是因为内核解析数据的时候使用的是uboot传入的memory数据

内存信息生效的优先级:ATAG_CMDLINE类型的tag > ATAG_MEM类型的tag > 设备树"/memory"节点

在这里插入图片描述

具体文章参考:linux内存管理——内存大小、起始地址的解析与修改文中详细提到了memory解析顺序

这导致了在ioremap时出现了内存冲突,虚拟内存映射失败,返回空指针

解决方法

1.在uboot的bootargs中添加

mem=256M

2.在设备树中的bootargs添加mem=256M

chosen {
		bootargs = "mem=250M console=ttyPS0,115200 maxcpus=1 earlyprintk root=/dev/mmcblk0p2 rw rootwait";
		stdout-path = "serial0:115200n8";
    };

开机后再次启动驱动能够正常分配内存

问题2:CPU1无法使用PL端的AXI接口

发现过程

开机之后当程序运行到

XGpio_SetDataDirection(&Gpio, LED_CHANNEL, ~LED);
XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, LED);

程序卡死

后续发现当没有启动kernel的时候是能正常运行CPU0和CPU1的,且CPUI读写axi接口正常,一启动kernel就会卡死在上面的两个函数中。

查询了网上能查到的所有信息都没类似问题的解决方案,于是开始排除kernel配置问题

在这里插入图片描述

看到了kernel默认打开了功耗管理(上图中已经关闭了所有功率管理的选项),在kernel中 power management打开后,系统会自动管理没有用到模块的时钟,或关闭时钟或减小运行频率,由于linux一开始并没有调用axi的资源,于是linux默认关闭了axi的时钟。参考文档:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841827/Zynq-7000+Power+Management

这导致CPU1对AXI读写数据是,由于AXI没有分配时钟或者时钟频率不对,导致读写出错卡死。

解决方法

关闭power management中所有的选项,重新保存退出,编译zImage

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j10

重启开发板,CPU1正常使用AXI资源。

问题3

发现问题

insmod加载.ko驱动文件时报错

unknown symbol in module or invalid parameter
解决问题

编译驱动时

KERN_DIR := /home/user/kernel/linux-xlnx-xilinx-v2018.3
obj-m := axi_gpio.o
all:
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERN_DIR) M=`pwd` modules
clean:
	make -C $(KERN_DIR) M=`pwd` clean

1.可能编译驱动时的内核版本和板载的驱动版本不一致,重新修改makefile为与板载一致的内核源码

2.可能是修改内核之后编译之后的板载配置和驱动编译时的板载配置不一致导致的,重新编译驱动文件即可。

  • 34
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
文档共60页。主要向初学者提供了Zynq开发的技术方向,针对不同应用给出了基本的参考文档;同时对Zynq双核AMP加载方式做了详细描述,对Zynq的fsbl启动流程做了简单介绍。章节如下: Zynq User Guide 1 介绍 4 2 快速上手指南 4 3 多核开发教程 4 3.1 AMP开发说明 6 3.1.1 快速生成amp工程 6 3.1.2 Generating Boot File 8 3.1.3 烧写程序 9 3.1.4 启动 10 3.1.5 调试 10 3.1.6 总结 11 3.2 SMP开发说明 11 4 ZC706启动代码分析 11 4.1 启动代码 12 4.2 FSBL流程(FOR AMP) 13 4.3 CPU0启动CPU1流程 14 5 程序在线烧写方案及流程 14 5.1 程序烧写需求 14 5.2 提出该需求的原因 14 5.3 程序烧写方案 14 5.3.1 BOOT.BIN组成 14 5.3.2 BOOT.BIN生成方法 15 5.4 FSBL.BIN和APP.BIN等的生成 15 5.5 制作*BIN及烧写的具体步骤 15 5.5.1 制作*bin流程 15 5.5.2 BOOT.bin制作过程 15 5.5.3 FSBL.bin和APP.bin等的生成过程 22 5.6 烧写BOOT.BIN步骤 26 5.6.1 通过SDK工具烧写步骤 26 5.6.2 通过上位机烧写软件的烧写步骤 29 5.6.3 通过串口调试助手烧写步骤 29 6 Zynq Qspi控制器 30 6.1 基本特性 30 6.2 I/O接口 31 6.3 QSPI控制器模式 33 6.3.1 I/O模式 33 6.3.2 线性地址(linear address)模式 33 6.3.3 传统(legacy)SPI模式 34 6.4 QSPI 例程 34 6.5 QSPI控制器支持访问32MB方法 35 6.5.1 Bank地址寄存器(Bank address register) 35 6.5.2 扩展地址模式(Extended address mode) 35 6.5.3 使用新写命令(New commands) 35 6.6 QSPI FLASH选择 35 6.7 作为BOOT器件考虑 35 7 µC/OS系统启动指南 36 7.1 INTRODUCTION 36 7.1.1 Software Requirements 36 7.1.2 Hardware Requirements 36 7.2 HARDWARE DESIGN 37 7.2.1 Step 1. Invoke the Vivado IDE and Create a project 37 7.2.2 Step 2. Create an IP Integrator Design 39 7.2.3 Step 3. Add and setup the Zynq processor system IP block 39 7.2.4 Step 4. Customize the Zynq block for our design 41 7.2.5 Step 5. Add the soft peripherals 45 7.2.6 Step 6. Generate HDL Design Files 47 7.2.7 Step 7. Synthesis, Implement and Generate Bitstream 48 7.3 SOFTWARE DESIGN 49 7.3.1 Step 1. Installation of the µC/OS Repository 49 7.3.2 Step 2. Generate the µC/OS BSP 50 7.3.3 Step 3. Build and Debug the Demonstration Project 54 7.3.4 Step 4. Program the AXI Timer 0 with the ucos_axitimer Driver 55 7.3.5 Step 5. Program the AXI Timer 1 with the Xilinx tmrctr Driver 58 7.4 CONCLUSION 59 8 Linux系统启动指南 59
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值