在zynq的裸机程序中计算程序运行耗时

本文介绍如何使用ARM内核中的性能检测单元(PMU)来获取耗时的tickcount,并提供了一段示例代码,展示如何通过读取全局定时器计数寄存器来实现这一功能。

可以利用ARM 内核中的Performance Monitor Unit(PMU,性能检测单元)来得到耗时的tick count。

转载别人的代码如下:

修改XTime_GetTime代码:

/**************************************************************************** 
* 
* Get the time from the Global Timer Counter Register. 
* 
* @param    Pointer to the location to be updated with the time. 
* 
* @return   None. 
* 
* @note     None. 
* 
****************************************************************************/  
void XTime_GetTime(XTime *Xtime)  
{  
    u32 low;  
    u32 high;  
  
    /* Reading Global Timer Counter Register */  
    do  
    {  
        high = Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET);  
        low = Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_LOWER_OFFSET);  
    } while(Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET) != high);  
  
    *Xtime = (((XTime) high) << 32) | (XTime) low;  
}  
测试代码:
#include <stdio.h>  
#include "sleep.h"  
#include "xil_io.h"  
#include "xtime_l.h"  
#include "xil_printf.h"  
#include "xpm_counter.h"  
#include "xparameters.h"  
  
#define COUNTS_PER_SECOND          (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ / 2)  
  
int main()  
{  
    XTime tEnd, tCur;  
    u32 tUsed;  
  
    XTime_GetTime(&tCur);  
    usleep(1345);  
    XTime_GetTime(&tEnd);  
    tUsed = ((tEnd-tCur)*1000000)/(COUNTS_PER_SECOND);  
    xil_printf("time elapsed is %d us\r\n",tUsed);  
    while(1);   //等待  
  
    return 0;  
} 



Zynq MP 设备上运行 R5 裸机程序时,通常需要在 Linux 系统环境中加载并启动该裸机程序。这种运行模式通常被称为异构多处理(AMP, Asymmetric Multiprocessing),其中 A53 核运行 Linux 系统,而 R5 核运行裸机程序。以下是实现这一目标的步骤: ### 1. 配置 DDR 内存分配 在运行 Linux 系统的 Zynq MP 设备上,首先需要确保 R5 核使用的 DDR 内存区域与 Linux 系统所使用的 DDR 内存区域不重叠。这通常通过修改设备树(Device Tree)和链接脚本(ld 文件)来实现。例如,可以将 Linux 内核放置在 `0x820000000` 地址处,而 R5 核使用的 DDR 区域则可以设置在其他地址[^2]。 ### 2. 开发 R5 裸机程序 开发 R5 裸机程序时,需要确保程序的链接脚本正确配置了 DDR 内存的起始地址和长度。这可以通过修改 `DDR_0_MEM` 的定义来实现。开发完成后,生成 R5 裸机程序的 `.elf` 文件,并进行测试以确保其功能正常[^3]。 ### 3. 打包 R5 裸机程序 由于不能使用 PetaLinux 工具打包 R5 裸机程序,因此需要使用 Xilinx SDK 的 `create image` 工具进行打包。打包顺序通常为:FSBL、PMU、BIT、BL_31、R5 裸机程序(如 `test_r5.elf`)、U-Boot。最终生成的 `BOOT.bin` 文件和 `image.ub` 文件可以放入 SD 卡中进行启动测试。 ### 4. 启动 Linux 系统并加载 R5 裸机程序 将生成的 `BOOT.bin` 和 `image.ub` 文件放入 SD 卡后,启动 Linux 系统。系统启动后,可以通过 Linux 用户空间程序加载并启动 R5 裸机程序。这通常涉及使用 `devmem` 工具读取 DDR 物理空间的数据,或将 R5 裸机程序作为内核模块加载。 ### 5. 测试与调试 在 Linux 系统下运行 R5 裸机程序时,可以通过串口打印调试信息。Linux 和裸机程序的输出都可以通过串口查看,从而方便调试。如果遇到非程序错误,需要检查 R5 核的 DDR 配置是否正确,因为大部分问题是由 DDR 配置错误引起的[^2]。 ### 示例代码:使用 `devmem` 读取 DDR 物理空间 以下是一个使用 `devmem` 工具读取 DDR 物理空间数据的示例代码: ```bash # 读取 DDR 物理空间的某个地址 devmem 0x80000000 32 ``` ### 相关问题 1. 如何在 Zynq MP 设备上配置 DDR 内存分配以避免冲突? 2. 如何使用 Xilinx SDK 打包 R5 裸机程序? 3. 如何在 Linux 用户空间加载并启动 R5 裸机程序? 4. 如何使用 `devmem` 工具读取 DDR 物理空间的数据? 5. 在 Zynq MP 设备上运行 R5 裸机程序时,如何通过串口进行调试?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值