• ltp-ddt realtime_cpu_load涉及的cyclictest 交叉编译


    Cyclictest 是 rt-tests 下的一个测试工具,也是rt-tests 下使用最广泛的测试工具,一般主要用来测试使用内核的延迟,从而判断内核的实时性。
     
    1.下载源码
    git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
    一直没法连接上。
    转而手动下载
    解压:tar -zxvf rt-tests-1.3.tar.gz
     
    2.交叉编译
    make CROSS_COMPILE=arm-linux-gnueabihf-
     
    error:
    In file included from src/cyclictest/cyclictest.c:39:0:
    src/cyclictest/rt_numa.h:29:10: fatal error: numa.h: No such file or directory
     
    解决方案,安装依赖包:
    apt-get install libnuma-dev 

    export PATH=/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:$PATH
    make CROSS_COMPILE=arm-linux-gnueabihf-
    make install DESTDIR=.

    一开始没有
    export PATH=/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:$PATH

    编译出来的结果在psoc上执行报./cyclictest: cannot execute binary file: Exec format error


    后来找到原因,which arm-linux-gnueabihf-gcc
    /opt/petalinux/tools/linux-i386/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc
    所以是i386的,当然无法执行。


    make报错impossible constraint in 'asm'
    src/queuelat/queuelat.c: In function ‘main_loop’:
    src/queuelat/queuelat.c:269:8: error: impossible constraint in ‘asm’
            asm volatile("cpuid; rdtsc" : EAX_EDX_RET(val, low, high));
            ^~~
    src/queuelat/queuelat.c:269:8: error: impossible constraint in ‘asm’
            asm volatile("cpuid; rdtsc" : EAX_EDX_RET(val, low, high));
            ^~~
    经查发现是src/queuelat/queuelat.c 269行
    asm volatile("cpuid; rdtsc" : EAX_EDX_RET(val, low, high));
    cpuid; rdtsc是x86汇编,替换为“NOP” arm汇编就不会报错了。

    目前先将这一行//注释掉

    make CROSS_COMPILE=arm-linux-gnueabihf-还是用的cc

    vi Makefile

    VERSION = 1.3
    CC?=$(CROSS_COMPILE)gcc
    AR?=$(CROSS_COMPILE)ar

    将这两条#注释掉
    然后在后面的目标中加入@echo

    $(OBJDIR)/%.o: %.c | $(OBJDIR)
        @echo $(CC)
        $(CC) -D VERSION=$(VERSION) -c $< $(CFLAGS) $(CPPFLAGS) -o $@
    打印出CC就是cc已经定义了。

    CC
    C语言编译程序。默认命令是“cc”。

    再来看?=

    还有一个比较有用的操作符是“?=”,先看示例:
    FOO ?= bar
    其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:
    ifeq ($(origin FOO), undefined)
    FOO = bar
    endif

    所以CC就是cc

    于是将
     
     
    VERSION = 1.3
    CC?=$(CROSS_COMPILE)gcc
    AR?=$(CROSS_COMPILE)ar
    改为
     
     
    VERSION = 1.3
    CC?=$(CROSS_COMPILE)gcc
    AR?=$(CROSS_COMPILE)ar
    CC=/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
    AR=/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar



    export PATH=/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:$PATH
    make
    make install DESTDIR=.



    另外发现一个问题,
    run_cyclictest $latency -S -p98 -m -n -q -D 2m
    有一个参数-n 
    VERSION = 1.3中并没有这个参数

    于是又下载了v1.0确实有-n

  • 相关阅读:
    C#中对ActiveX控件的调用
    C#打开播放器后指定其播放的视频文件的路径代码怎么写啊!
    利用Visual C#开发一个媒体播放器
    C# 播放器控件 的常用方法
    用C#打开一个pdf文件
    C#利用微软DirectX做的视频播放器
    请问C#高手: [DllImport("kernel32.dll")]是什么意思??
    C#中的abstract与virtual
    ListBox Grouping的研究(一):初探GroupItem对象
    一个“>”导致我调试了1个小时才解决问题
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/10985973.html
Copyright © 2020-2023  润新知