IMX8MP录像功能测试

2023-05-16

IMX8MP录像功能测试

目录

1.开发环境搭建

2.编译hello world

3.录像功能测试

4.参考资料


1.开发环境搭建

1.1 开发工具链和源码


开发环境的搭建按照手册上的命令搭建即可,可以更换其中的安装目录,其中需要sdk的目录和工具链目录统一放置在/opt/imx8/目录下,交叉编译所需要的工具链所在目录/opt/imx8/sdk;另一个是/opt/imx8/source,该目录是工程的源码所在目录。

获取sdk和交叉工具链指令如下

#创建目录
mkdir -p /opt/imx8/sdk
cd /opt/imx8/sdk

#解压sdk,过程需要知道sdk目录
./fsl-imx-xwayland-glibc-x86_64-meta-toolchain-qt5-aarch64-\
imx8mpevk-toolchain-5.4-zeus.sh

#配置环境
source ./environment-setup-aarch64-poky-linux

#获取版本信息
aarch64-poky-linux-gcc -v

imx8mpsdktree

编译工具在/opt/imx8/sdk/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/
源码则解压到/opt/imx8/source目录下;

1.2编译源码
编译前需要先配置环境,使其生效

  • 编译内核
#配置环境
source ./environment-setup-aarch64-poky-linux
#查看环境变量是否设置生效
aarch64-poky-linux-gcc -v
#编译 编译完的文件在/opt/imx8/source/OK8MP-linux-sdk/images/kernel/
./build.sh kernel
#如果要清除内核,执行以下指令
./build.sh kernel_clean
  • 编译测试程序
#配置环境
source ./environment-setup-aarch64-poky-linux
#查看环境变量是否设置生效
aarch64-poky-linux-gcc -v
#编译 编译完的文件在/opt/imx8/source/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs/usr/bin/
./build.sh apps
#如果要清除内核,执行以下指令
./build.sh clean_apps
  • 编译freertos
#配置环境
source ./environment-setup-aarch64-poky-linux
#查看环境变量是否设置生效
aarch64-poky-linux-gcc -v
#编译 编译完的文件在/opt/imx8/source/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs/lib/firmware/
./build.sh freertos_demo
#如果要清除内核,执行以下指令
./build.sh clean_freertos_demo

2.编译hello world


先编译最简单的hello程序检查编译环境配置是否有问题,实际上是真的有问题,这个开发工具链有些bug,导致编译的时候会提示找不到一些最基本的头文件;
测试程序代码如下

#include <stdio.h>
int main()
{
   printf("Hello, World!\n");
   return 0;
}

编译指令

#配置环境
source /opt/imx8/sdk/environment-setup-aarch64-poky-linux
#编译程序
aarch64-poky-linux-gcc ./hello.c -o hello

会出现编译报错问题
02imx8helloerror

最简单的标准库头文件都没有找到,显然环境有问题,编译配置环境,最终定位到需要指定编译链的目录;

aarch64-poky-linux-gcc --sysroot=/opt/imx8/sdk/sysroots/aarch64-poky-linux ./hello.c -o hello #需要添加--sysroot指定编译链路径

3.录像功能测试

  • 3.1应用程序编译

这个文件夹不仅可以测试录像的功能,也能测试其他模块功能,文件夹的目录结构如下所示;

03imx8dirtree


CC = aarch64-poky-linux-gcc
CXX = aarch64-poky-linux-g++

export CURDIR = $(shell pwd)
export INSDIR = $(CURDIR)/output
export SDKDIR = /opt/imx8/sdk

TARGET = testRec

SRCS += $(CURDIR)/src/*
OBJS    := $(SRCS:%.c=%.o)
OBJS	+= $(SRCPPS:%.cpp=%.o)

export BUILD_SH			= $(CURDIR)/script/BUILD.sh

CFLAGS = 
CFLAGS += --sysroot=$(SDKDIR)/sysroots/aarch64-poky-linux
CFLAGS += -I$(CURDIR)/include
CFLAGS += -Wall -g

LD_FLAGS += -lpthread -lm 
LD_FLAGS += -L$(CURDIR)/lib

$(TARGET):$(OBJS)
	@/bin/echo "************ Compiling Start ***********"
	$(CC) $(CFLAGS) $(LD_FLAGS) $^ -o $@  
	@/bin/echo "************ Compiling Finish ***********"

$(OBJS):
ifneq ($(SRCS), )
	for x in $(SRCS);	\
	do			\
		$(CC) -MM -MT"$${x%.c}.o" $(CFLAGS) $$x >> $@;\
	done
endif
ifneq ($(SRCPPS), )
	for x in $(SRCPPS);	\
	do			\
		$(CXX) -MM -MT "$${x%.cpp}.o" $(CPPFLAGS) $$x >> $@;\
	done	
endif

clean:
	$(RM) *.o $(TARGET) -r

install:
	cp -rf $(TARGET) $(INSDIR)
	$(RM) $(CURDIR)/$(TARGET)

# vim:noet:sw=4:ts=4

直接执行指令,即可在安装目录下获取到测试的目标文件,将其拷贝到板端即可在板端运行;

make
make install
  • 3.2 测试源代码
#include <stdio.h>
#include <pthread.h>
#include <stdbool.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>
#include <sys/types.h>


#define THREAD_NUM 3           /* 线程数量 */
#define WRITE_SIZE (256*1024)  /* 写入数据量 */

/* 获取当前时间(us) */
static long long int microtime(void)
{
    struct timeval time;
    gettimeofday(&time, NULL);
    long long int microsec = ((long long)time.tv_sec * 1000000) + time.tv_usec;
    return microsec;
}

/* 写文件线程 */
void *write_file_body(void *arg)
{
    int *pChn = (int *)arg;
    char szPath[64] = {0};
    char szCmd[128] = {0};
    long long s64CurTime = 0;
    long long s64LastTime = 0;
    char data[WRITE_SIZE] = {0};
    int ret = 0;
    int cnt = 0;
    sprintf(szPath, "/run/media/sda1/testRec/test%d",*pChn);//卡挂载目录,一般是udev挂载,也可以自己挂载
    sprintf(szCmd, "rm -rf %s",szPath);
    system(szCmd);
    FILE* fp = fopen(szPath, "ab+");
    if (NULL == fp)
    {
        printf("open file %s filed \n",szPath);
    }

    while(1)
    {
        s64LastTime = microtime();
        sprintf(data, "%d",cnt);
        if (cnt <= 1000)
        {
            ret = fwrite(data, WRITE_SIZE, 1,fp);
            if (0 == ret)
            {
                 printf("write failed\n");
            }
        }
	    else
        {
	        break;
        }
        
        if(cnt == 1000)
        {
            fclose(fp);
            printf("close file %d\n",*pChn);
        }
        
        cnt++;
	    s64CurTime = microtime();
        printf("chn[%d] %lld us\n",*pChn, (s64CurTime - s64LastTime));
    }
    return NULL;
}
/* 主线程 */
int main()
{
    pthread_t thread_id;
    static int num[3] = {0};
    int ret = 0;
    int i = 0;
    for(i=0; i<THREAD_NUM; i++)
    {
        num[i] = i;
        ret = pthread_create(&thread_id, NULL, write_file_body, &num[i]);
        if (0 != ret)
        {
            printf("pthread[%d] create failed! [err=%d]\n",i, ret);
            return ret;
        }        
    }
    while(1)
    {
         usleep(1000000);
         //sync();//定时回写
    }

    return 0;
}

​ (1)256k (2)128k (3)64k
256k 128k 64k

上图分别为256*1024 128*102464*1024字节写入卡内,显然,256k128k的三路同时写入耗时超过40ms,对于视频的帧率而言会导致丢帧的问题,而64k字节写入会出现写入不太稳定的问题,这个不稳定是快到尾部的时候写入同步数据到卡上引起的,另一方面,写入卡耗时还由于这张卡是通过USB Hub连接到读卡器上的sd卡,因此耗时也会比在设备端的sd卡耗时更长,具体的可以根据硬件设计完再测试。

  • 3.3 定时回写测试

在主循环中通过手动定时调用sync定时将数据回写,在128k的写入速度写测试,如果添加定时回写,在写1000帧快结束的时候,大部分情况会有耗时比不添加的要少一些,但这个不是绝对的,与系统当前的负载有关,但是大部分情况还是会比不添加手动同步的要耗时少,在64k的写入速度下效果不太明显。

(1) 256k定时手动同步 (2)128k定时手动同步 (3)64k定时手动同步
256k 128k64k

  • 3.4 同步时间间隔

既然同步在一定情况下可以平均负载,降低部分写数据的耗时,那是否可以不停的同步呢?经过测试发现,降低同步时间在一定范围内是可以降低写数据耗时,但是会降低系统处理其他操作的性能,同时当负载过大的情况下,不断的同步会增加操作系统的负担,不利于整体的性能,因此同步操作需要实际测试指定一个比较合适的时间范围;


4.参考资料

*** 不足之处,敬请指出,谢谢! ***
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IMX8MP录像功能测试 的相关文章

  • 【SpringMVC】前端页面只能发送“get”、“post”请求,无法发送“put”、“delete”请求的解决方法

    前端页面默认只能发送 get post 请求 xff0c 无法发送 put delete xff0c 要解决这个问题有以下两个步骤 xff1a xff08 一 xff09 在web xml配置文件中配置SpringMVC提供的Filter
  • Ubuntu20.04 Installing WslRegisterDistribution failed with error: 0xc03a001a

    在软件商店中安装Ubuntu后 xff0c 打开后出现以下的提示 xff0c 说明你进行了压缩文件以节省空间 xff08 如果你的文件右上角出现两个相对的蓝色箭头 xff0c 就说明你启用了该功能 xff09 Installing this
  • Ubuntu连接到gitee(将linux下的Ubuntu的代码传到gitee)

    1 安装git sudo apt install git 2 配置git git config global user name shaolili git config global user email 1515729484 64 qq
  • Qt定时关qmessagebox

    Qt定时关qmessagebox span class token keyword void span span class token class name Class Name span span class token double
  • 动态规划:WEEK11

    必做题 xff1a 一 蒜头君从现在开始工作 xff0c 年薪 N 万 他希望在蒜厂附近买一套 60 平米的房子 xff0c 现在价格是 200 万 假设房子价格以每年百分之 K 增长 xff0c 并且蒜头君未来年薪不变 xff0c 且不吃
  • cmd找不到conda以及通过cmd启用Anaconda中的Python环境(base)

    问题 xff1a 在cmd中输入python无法进入或启用python ipython conda jupyter notebook 一 解决方法 xff1a 在系统环境中添加Anaconda路径 lt 1 gt 1 打开高级系统设置 xf
  • A - 氪金带东

    题意介绍 求图中各点到其他点的最大长度 题意分析 假设图中相距最远的两个点为v1 v2则则图中任一点到其他点的最大长度不是到v1的长度就是到v2的长度 xff0c 所以首要任务就是找到v1 v2 首先 xff0c dfs任意点找到v1或v2
  • D - 数据中心

    题意介绍 给一个n节点的网络图 xff0c 求一个最优的树结构传输图 树结构传输图的传输时间为各边权的最大值 题意分析 求一个最小生成树 xff0c 并输出各边的最大权值 通过代码 span class token macro proper
  • A - 掌握魔法の东东 II

    题意介绍 共有九种牌型 xff0c 先拿出两张牌 xff0c 问每种牌型的可能数 题意分析 用三个for循环对所有组合进行遍历 xff0c 每得到一个组合对这五张牌进行排序 xff0c 看他符合哪一种牌型 xff0c 要注意用 低序号优先
  • C - TT 的美梦

    题意介绍 有若干城市 xff0c 从一个城市到另一个城市需要交税 xff08 可能为负值 xff09 xff0c 求给出城市到首都索要交的税 题意分析 该题要求单源最短路径 xff0c 并且存在负边的情况 xff0c 只能用SPFA算法 在
  • MAC系统连接Windows共享文件的方法

    MAC系统连接Windows共享文件的方法 xff1a 1 首先先确认Windows系统下已开启共享 并且两台电脑之间局域网已通 2 苹果MAC系统 xff0c 点击桌面 打开顶部菜单 前往 3 菜单中选择最下面的 连接服务器 4 输入要共
  • C - 咕咕东的奇妙序列

    题意介绍 一个序列 xff1a 112123123412345123456 即第一部分包含1至1之间的所有数字 xff0c 第二部分包含1至2之间的所有数字 xff0c 第三部分包含1至3之间的所有数字 xff0c 第i部分总是包含1至i之
  • B - 猫猫向前冲

    题意介绍 N只猫比赛 xff0c 给出M个输赢关系 xff0c 给出符合这些关系的字典序最小的排名 题意分析 就是求字典序最小的拓扑序列 xff0c 求出每个点的入度 xff0c 每次从第一个点开始遍历 xff0c 找到第一个入度为0的点拿
  • C - 班长竞选

    题意介绍 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也认为 C 合
  • 消消乐

    题意介绍 消除类游戏是深受大众欢迎的一种游戏 xff0c 游戏在一个包含有n行m列的游戏棋盘上进行 xff0c 棋盘的每一行每一列的方格上放着一个有颜色的棋子 xff0c 当一行或一列上有连续三个或更多的相同颜色的棋子时 xff0c 这些棋
  • B - 必做题 - 2

    题意介绍 zjm被困在一个三维的空间中 现在要寻找最短路径逃生 xff01 空间由立方体单位构成 zjm每次向上下前后左右移动一个单位需要一分钟 xff0c 且zjm不能对角线移动 空间的四周封闭 zjm的目标是走到空间的出口 是否存在逃出
  • C - 必做题 - 3

    题意介绍 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a i 43 43 a j 个人 这让宿管阿姨非常开
  • A - TT 的神秘任务1(必做)

    题意介绍 这一天 xff0c TT 遇到了一个神秘人 神秘人给了两个数字 xff0c 分别表示 n 和 k xff0c 并要求 TT 给出 k 个奇偶性相同的正整数 xff0c 使得其和等于 n 例如 n 61 10 xff0c k 61
  • C - TT 的奖励(必做)

    题意介绍 题意分析 动态规划 xff0c dp i j 表示第i秒第j个位置上猫的数量从最后一秒对每个点的左右两边进行搜索即可 通过代码 span class token macro property span class token di
  • A - Q老师与石头剪刀布(必做)

    题意介绍 每一个大人曾经都是一个小孩 xff0c Q老师 也一样 为了回忆童年 xff0c Q老师 和 Monika 玩起了石头剪刀布的游戏 xff0c 游戏一共 n 轮 无所不知的 Q老师 知道每一轮 Monika 的出招 xff0c 然

随机推荐

  • B - Q老师与十字叉(必做)

    题意介绍 题意分析 一开始打算开二维数组 xff0c 结果发现需要的空间太大 xff0c 不可行 xff0c 只能将二维数组映射到一维数组 xff0c 然后求出每一行以及每一列白色格子的数目 xff0c 然后行列进行两两组合求得符合条件的行
  • NJU数电实验1-3

    实验一 选择器 2选1多路选择器 逻辑表达式 xff1a y 61 s amp a
  • C - Q老师的考验(必做)

    题意介绍 Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新的数列 f x 来考一考大家 数列 f x 定义
  • C - TT 的神秘任务 - X

    题意介绍 TT 的神秘任务系列 这一次 xff0c TT 得到了一个长度为 N 的字符串 xff0c 任务要求在原字符串中至多删去一个字符 xff0c 使得字符串的字典序尽可能小 字符串字典序的比较优先级如下 xff1a 从左往右第一个不同
  • 炉石传说

    题意介绍 题意分析 模拟题 xff0c 模拟每一种操作后两个英雄及其随从的生命值 最后判断两个英雄的生命值对应输出即可 通过代码 span class token macro property span class token direct
  • 元素选择器

    题意介绍 题意分析 模拟题 xff0c 每一行都处理成一个结构体 xff0c 包括级别 标签 id 级别为点数量的二分之一 xff0c 还要把元素名称全部变为小写 xff0c 处理查询时 xff0c 如果输入的一行只有一个单词 xff0c
  • cmd命令行无法使用conda

    在系统变量中增加如下图的anaconda安装夹下的3个路径 D Anaconda3 D Anaconda3 Library bin D Anaconda3 Scripts
  • linux 执行maven项目jar包,并指定日志路径

    一 启动脚本 span class token comment 获取当前脚本所处的目录 span sh dir 61 span class token punctuation span cd 96 dirname span class to
  • c数组与结构体

    数组 xff0c 存储同类型的复合类型 xff1b 结构体 xff0c 存储不同类型的复合类型 xff0c 用于自定义数据结构 计算机中 xff0c 针对存储大量数据的集合 xff0c 有着两种方式 xff0c 一种是以块式集中存储数据 x
  • kali-linux轻量级系统的使用心得

    kali linux轻量级系统即 Kali Linux Light 运行明显比kali完整版要流畅许多 xff0c 非常适合定制自己的渗透测试系统 xff0c 本人10G的虚拟机硬盘安装完各种工具还剩5G多 xff0c 完整版需要至少20G
  • 关于VMware虚拟机中调节图标字体大小

    1 问题详述 当虚拟机界面图标字符或过小时 xff0c 看得很废费劲 2 问题解决 在桌面上点击鼠标右键 xff0c 点击 Change Desktop Background xff0c 在Fonts一栏分别调节各部分字体大小即可 如下图所
  • 关于@RunWith(SpringRunner.class)中SpringRunner.class报红的问题

    原因分析 xff1a 依赖包没导入 解决方案 xff1a span class token tag span class token tag span class token punctuation lt span dependency s
  • 使用xrdp实现windows 远程桌面 ubuntu linux

    一般情况下我们用ssh客户端远程登陆Linux系统 xff0c 至于图形界面下的linux远程登陆工具 xff0c 我们一般都会想到vnc xff0c 但它的安全性不够 xff0c 在这里 xff0c 我将介绍XRDP的安装配置方法 我们可
  • centos信任自建CA证书

    我们经常会用配置网站可以用https访问 xff0c 但是购买证书不现实 xff0c 所以我们会选择自建CA证书 xff0c 但是自建的CA证书 xff0c 在linux中用curl访问时总会报错 xff0c 报错信息如下 xff1a cu
  • Hadoop--HDFS的API环境搭建、在IDEA里对HDFS简单操作

    在windows系统安装hadoop 首先下载hadoop xff1a hadoop 3 1 4 tar gz 解压到C Hadoop目录下 然后下载winutils xff1a https github com cdarlint winu
  • python初学入门——————输入输出语句

    文章目录 一 输出语句1 格式化输出2 f 格式化字符串3 转义字符3 结束符 二 输入语句 一 输出语句 打印语句所使用的函数为print span class token keyword print span span class to
  • 判断一个字符串是不是回文序列

    上两周学习栈和队列的时候老师布置了一个上机作业 xff0c 题目非常的简单 xff0c 用最基本的栈和队列都能做到 xff0c 今天分享给大家 xff0c 题目是这样的 判断一个字符串是不是回文序列 xff0c 例如 aba adda 都是
  • FFMPEG编译裁剪移植

    FFMPEG 编译裁剪移植 author xff1a lyn date xff1a 2022 09 26 version ffmpeg4 1 3 1 ffmpeg文件结构说明 2 ffmpeg交叉编译 3 ffmpeg移植问题 4 参考资料
  • FFMPEG mp4封装实现

    FFMPEG mp4录像 author xff1a lyn date xff1a 2022 09 28 version ffmpeg4 1 3 1 mp4数据结构 2 ffmpeg mp4封装实现 3 mp4函数调用关系 4 参考资料 1
  • IMX8MP录像功能测试

    IMX8MP录像功能测试 目录 1 开发环境搭建 2 编译hello world 3 录像功能测试 4 参考资料 1 开发环境搭建 1 1 开发工具链和源码 开发环境的搭建按照手册上的命令搭建即可 xff0c 可以更换其中的安装目录 xff