高通QNX基线编译原理

news2024/9/23 9:32:59

 下面代码以高通智驾平台为例。

1 QNX应用程序编译原理

在高通提供的qnx开发包中,qnx的内核已经由qnx所提供,所以qnx的编译,其实就是大量应用程序的编译,以及最后利用buildfile文件,把内核,库文件以及应用程序打包在一起的过程。

1.1 qnx的工程目录

应用程序的编译,可以利用最常见的makefile规则,来指定生成目标所需要的依赖文件;也可以利用qnx提供的编译机制来生成对应的可执行文件或者库文件。文本着重介绍后者,如何利用qnx的编译机制来生成应用程序。

如果要利用qnx的编译机制,来生成可执行文件,首先要构建如下所示的文件目录结构:

qnx规则对文件目录进行了比较详细的规范,要求开发者尽量遵循上述规则来构建适应多os,多架构的构建。这样构建目录的好处是开发者可以尽可能把通用的代码放到上层目录,尽可能的减少代码的可重复性。同时,每一层级都会有makefile文件,用户可以在任何目录输入make命令,make 会递归每一级目录来编译相应的内容。根据开发经验,上述目录并不是必选的,但是CPU level和variant level是开发过程中需要构建的目录。

这边尤其要注意的是variant level目录的名字,决定着最后编译出来的文件是可执行文件,动态库,还是静态库。

该名字可以包含如下的一些组合,并用(.),(-)或者(/)来进行分割。

名字中包含a字符:说明该文件需要构建成静态库。

名字中包含so字符:说明该文件需要构建成动态库。

名字中包含g字符:说明该文件需要构建成debug的版本,该版本会包含调试信息,可以供gdb调试器使用。

名字中包含be, le字符:说明该目标文件是大端或者是小端。

比如说variant level的目录名为g.le,说明需要构建的目标文件是一个debug的版本的小端的可执行程序。不过有一点需要注意的是,向.a, .so, or .o这些选项最好不要放在名字的结尾,不然会和现有的文件类型产生混淆。

1.2 qnx的makefile

用qnx的规则来构建makefile,可以看到除了最底层variant level,其他层的makefile文件所包含的内容基本都是类似的:

LATE_DIRS=boards

include recurse.mk

recurse.mk 文件用来通知makefile向更底层的目录遍历。

在同级别如果有多个目录,并且不同目录中的文件构建有先后的依赖关系,我们可以使用EARLY_DIRS和LATE_DIRS来构建。需要更早构建的目录放在EARLY_DIRS,需要更晚构建的目录,放在LATE_DIRS中,EARLY_DIRS和LATE_DIRS中可以放置多个目录,但各个目录之间构建的时候没有先后关系。

而在最底层的variant level中,makefile文件的内容基本是这样的形式:

include ../../common.mk

common.mk文件通常放在project目录下面。common.mk文件中的内容是整个编译的核心,通常放着编译的标志,头文件位置,源文件位置,以及需要链接的库等。

common.mk中的内容大概如下:

ifndef QCONFIG

QCONFIG=qconfig.mk

endif

include $(QCONFIG)

# Preset make macros go here

include $(MKFILES_ROOT)/qtargets.mk

# Postset make macros go here

qconfig.mk宏通常包含着一些编译中使用的编译工具的宏定义,命令的宏定义,如(CP_HOST

,LN_HOST)qnx建议在编译的时候使用这些宏,而不是直接去引用某个绝对路径,或者某个host中的命令。在Preset 的位置,用户可以用来定义一些宏,比如如何进行链接,包含了哪些头文件或者源文件,以及目标文件的名字等。Postset可以用来定义一些哄,用来覆盖qtargets.mk中的定义。qtargets.mk用来包含安装路径以及文件链接。

qrules.mk用来放置编译过程中会用到的一些宏,如目标文件,源文件,编译标志,对于可写属性的宏,用户可以进行更改。

一些编译过程中会经常用到的宏:

INSTALLDIR:目标文件安装路径

CCFLAGS:编译标志位

LDFLAGS:链接标志位

LIBS:需要链接的库文件

NAME:指定目标文件的名字

EXTRA_INCVPATH:编译过程中需要搜索的头文件路径

EXTRA_SRCVPATH:编译过程中的源文件,通常源文件不在当前工程文件下时,需要设置该变量。

EXTRA_LIBVPATH:指定编译过程中搜索依赖库的路径

2 QNX image构建原理

在上述利用通用makefile规则或者qnx的makefile规则,编译出相应的可执行程序以后,就需要把这些应用程序打包,构建启动文件。qnx 利用buildfile文件来构建整个image。buildfile制定了qnx的启动文件,启动脚本,以及启动过程中需要打包的库文件以及应用程序。

可以先看一下qnx的启动时序:

最一开始的PLL是硬件相关的,这边不做讨论。

IPL阶段,全称是initial program loader,这是引导qnx系统的第一个阶段。通常用来做一些最基本的硬件初始化工作,当然也有可能会对startup程序进行内存拷贝(如果这一部分工作没有在bootloader完成的话)。

Startup阶段,完成后续的硬件初始化工作,包括内存页表映射,内核调用函数链接,然后把接下来的工作交给procnto(内核),拷贝os image到ram中。

Base system包含内核,以及系统启动的一些必要文件。

Boot script阶段,系统启动中优先级高的任务,可放在该阶段执行。

SLM阶段,一般的应用程序,可放在该阶段执行。

而由startup program,base system和boot script等组成的image,又称作Image Filesystem(IFS)

上述描述了整个qnx系统启动时的一个大概的时序,而buildfile所做的工作,基本能和上述所描述的元素所吻合。看一下buildfile的一些基本要素:

[virtual=x86_64,bios] .bootstrap = {

    startup-x86

    # PATH is the *safe* path for executables (confstr(_CS_PATH...))

    # LD_LIBRARY_PATH is the *safe* path for libraries

    # (confstr(_CS_LIBPATH)). That is, it's the path searched for libs

    # in setuid/setgid executables.

    # The module=aps enables the adaptive partitioning scheduler.

    [module=aps] PATH=/proc/boot:/bin:/usr/bin:/sbin:/usr/sbin \

        LD_LIBRARY_PATH=/proc/boot:/lib:/lib/dll:/usr/lib \

        procnto-smp-instr

}

# Start-up script

[+script] .script = {

    # Create some adaptive partitions during system startup:

    #   - IOPKT with a 20% budget

    #   - QCONN with a 20% budget

    # NOTE:  To specify a critical budget of 5 ms, use sched_aps as seen below

    #       when the filesystem on the disk is available.

    sched_aps IOPKT 20 5

    sched_aps QCONN 20 5

   。。。。。。。

    # Start the main shell

    reopen /dev/con1

    [+session] sh &

}

[perms=0777]

# Include the current "libc.so". It will be created as a real file

# using its internal "SONAME", with "libc.so" being a symlink to it.

# The symlink will point to the last "libc.so.*" so if an earlier

# libc is needed (e.g. libc.so.5) add it before the this line.

libc.so

libgcc_s.so.1

/usr/lib/ldqnx-64.so.2=ldqnx-64.so.2

libelfcore.so.1

libslog2.so

#libusbdi.so

devu-hcd-ehci.so

virtual=x86_64,bios描述的是IPL,startup-x86描述的是startup程序,procnto-smp-instr 是procnto程序,.script 中描述的是启动脚本需要完成的事情。最下面的内容是IFS中包含的一些系统启动所需要的库文件以及应用程序。通过buildfile文件,描述了整个IFS构建所需要的文件以及系统的启动流程。

3 以一个例子介绍高通基线应用程序的编译

这边以qcarcam_test为例,介绍一下高通如何利用qnx的规则,来生成对应的应用程序。

qcarcam_test 的目录结构如下所示:

源文件放在src目录中,build目录就是之前第一章所描述的,利用qnx的规则所创建的目录结构,build 目录可以理解为project level,aarch64目录和arm目录为cpu level,o-le和o-le-v7为variant level。

除了variant level的makefile中引用了common.mk:

其他的makefile文件都只是包含了recurse.mk,用来递归搜索下层目录:

目标文件编译规则由common.mk来描述:

ifndef QCONFIG

QCONFIG=qconfig.mk

endif

include $(QCONFIG)

include $(AMSS_ROOT)/amss_defs.mk

include ../../../../../build/qnx/overrides.mk

NAME=qcarcam_test

#===== INSTALLDIR - Subdirectory where the executable or library is to be installed.

INSTALLDIR=$(CAMERA_OUT_BIN)/$(NAME)

ifeq ($(CPULIST),aarch64)

cpulist=aarch64le

else

cpulist=armle-v7

endif

#===== USEFILE - the file containing the usage message for the application.

USEFILE=$(PROJECT_ROOT)/../src/qcarcam_test.use

#===== PINFO - the file containing the packaging information for the application.

define PINFO

PINFO DESCRIPTION=QCarCam test application

endef

#===== EXTRA_SRCVPATH - a space-separated list of directories to search for source files.

EXTRA_SRCVPATH+= \

        $(PROJECT_ROOT)/../src \

        $(PROJECT_ROOT)/../../test_util/src \

        $(PROJECT_ROOT)/../../test_util/src/qnx

#===== EXTRA_INCVPATH - a space-separated list of directories to search for include files.

EXTRA_INCVPATH+= \

        $(QCX_ROOT)/utils/inc \

        $(QCX_ROOT)/utils/inc/os \

        $(PROJECT_ROOT)/../../test_util/inc \

        $(AMSS_INC) \

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1487469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AirPods Pro 2 耳机推送新固件,苹果Find My功能助力产品成长

苹果公司面向 AirPods Pro 2(包括 USB-C 和 Lightning 版本),推出了全新的测试版固件更新,版本号为 6E188,高于 12 月份发布的 6B34 固件。 苹果和往常一样,并没有提供详细的更新日志或者说明&#xff0c…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

MyBatisPlus(SpringBoot版)的分页插件

目录 一、前置工作: 1.整体项目目录结构 2.创建普通javamaven项目。 3.导入依赖,改造成springboot项目 4.配置启动类 5.创建service接口及其实现类 6.创建接口Mapper 7.配置数据源 8.创建数据库表 二、使用MP(mybatisplus)的分页插件 二、使…

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中,流行的联合显着性(JS)检验会产生过于保守的 I 类错误率,因此功效较低。但是,如果在使用 JS 测试高维中介假设时,可以准确控制…

一站式电商数据采集API接口-支持多平台采集-全面提升数据采集效率!

电商数据采集API接口包含:淘宝采集,天猫采集,拼多多采集,同行店采集,蓝海店铺采集,批量整店采集,蓝海监控上新,首销尾销,潜力款选品,上新品采集,高…

RNA-Seq 笔记 [4]

***********************该笔记为初学者笔记,仅供个人参考谨慎搬运代码****************************** samtools 排序压缩和 featureCounts 生成基因计数表 SAM文件和BAM文件 1.SAM格式:是一种通用的比对格式,用来存储reads到参考序列的比…

【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议

1. AVDTP概念 AVDTP即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协议),主要负责 A/V stream的协商、建立及传输程序,还指定了设备之前传输A/V stream的消息格式. AVDTP的传输机制和消息格式是以 RTP为基础的。…

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式,它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中,有三种角色: 发布者(Publisher):负责发送信…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点,上图 列表共5条数据,准备输入Author过滤条件进行查询 进入查看详情页,就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能,后来放弃了,想到直接用路由去做可能也不错。有时间再整一套…

【VTKExamples::PolyData】第四十四期 ProcurstesAlignmentFilter

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ProcurstesAlignmentFilter,并解析接口vtkProcurstesAlignmentFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^…

jupyter 一键快捷启动方法研究

1.效果 首先打开dat 文件,同意赋予管理员 输入序号1 成功启动 2.Bat代码 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&e…

mac使用sequl的报错说明

出现下图错误,则到此地址下载test-builds版本 Test Builds 使用 sequel pro 的时候出现了 SequelPro encountered an unexpected error 表现为:测试通过,链接就卡住报错的问题。 解决办法 这是软件的问题,下载使用这个 TEST…

大模型理论基础(so-large-lm)课程笔记!

Datawhale干货 作者:辣条,Datawhale优秀学习者 前 言 在当前信息时代,大型语言模型(Large Language Models,LLMs)的发展速度和影响力日益显著。随着技术进步,我们见证了从基本的Transformer架构…

计算机视觉基础知识(二)---数字图像

像素 像素是分辨率的单位;构成位图图像的最基本单元;每个像素都有自己的颜色; 图像分辨率 单位英寸内的像素点数;单位为PPI(Pixels Per Inch),为像素每英寸;PPI表示每英寸对角线上所拥有的像素数目:,x:长度像素数目,y:宽度像素数目,Z:屏幕大小;屏幕尺寸(大小)指的是对角线长…

程序媛的mac修炼手册-- Node.js入门篇

最近因为参与一个微信小程序的开发,开始摸索JavaScript。期间,需要基于Node.js安装微信开发工具的依赖项,所以又顺带学习了Node.js的包管理工具npm(Node Package Manager)。不过,之前看到国外的全栈大佬​​…

electron+vue3全家桶+vite项目搭建【29】封装窗口工具类【3】控制窗口定向移动

文章目录 引入实现效果思路声明通用的定位对象主进程模块渲染进程测试效果 引入 demo项目地址 窗口工具类系列文章: 封装窗口工具类【1】雏形 封装窗口工具类【2】窗口组,维护窗口关系 很多时候,我们想直接让某个窗口移动到边角&#xff0c…

MySQL之索引详解

华子目录 索引概述优缺点 索引的原理索引的设计原则索引结构B-tree(多路平衡查找树)BtreeHash 为什么InnoDB存储引擎选择Btree?索引分类聚集索引选取规则 单列索引和多列索引前缀索引创建索引1.创建表时创建索引2.在已经存在的表上创建索引3.…

funasr VAD语音端点检测;sherpa VAD+STT识别

1、VAD 语音端点检测(funasr) Voice Activity Detection 语音活性检测(VAD)也被称为语音端点检测,基本原理是判断一个区间内的音频(区间被称为一个“语音帧”),是有效语音,还是无效语音。通过连续的检测多帧,就能判断出语音的“开头”(从无效到有效)和“结尾”(从…

【springboot】乡镇卫生院、二甲医院云HIS运维平台源码

目录 云HIS运营管理 ​编辑电子病历主模块:包括门诊电子病历、住院电子病历等子模块 (1)门诊电子病历功能简介 (2)住院电子病历功能简介 ▶患者列表主模块:包括患者信息子模块 (1&#xf…

熔断降级 spring事务

如果有事务处理,会先把事务的自动提交给关闭