|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
上一篇说了编译的过程,这里再补充介绍几个重要的scons工具命令。scons run是运行qemu虚拟机加载镜像运行的命令,scons studio是运行配置代码生成工具的命令,scons –menuconfig是配置系统宏的命令。还有一些其他命令例如acons run asone,还没来得及研究。下面一一介绍。
1. scons run命令
执行这个命令qemu虚拟机就运行起来了,但是过程是怎样的,还是要在代码中找。scons run执行后,还是会安装根目录SConstruct文件往下执行,
objs = SConscript('SConscript',variant_dir=BDIR, duplicate=0)
在SConscript函数加载脚本的时候,会加载as.application/board.x86/SConscript在这个文件中,有如下代码:
if('run' in COMMAND_LINE_TARGETS): qemu = Qemu() target = '%s/release/%s/TINIX.IMG'%(ASROOT,asenv['RELEASE']) qemu.Run('-fda %s -boot a -m 64M'%(target))
这个run命令放board.x86里面,是因为虚拟机跟板卡的cpu类型有关系,需要根据不同的板卡组装qemu的运行命令。
在com/as.tool/config.infrastructure.system/building.py中,有一个Qemu的类。初始化的时候ocateASQemu函数会找到qemu工具。
qemu工具为:/release/download/qemu/i386-softmmu/qemu-system-i386
如果没有找到qemu工具则会自动去github下载源码,编译出来这个qemu工具。
在qemu.Run函数中会先生成qemu.sh和telnet.sh,在as/build/posix/x86/ascore目录下。然后执行:
sudo pgrep qemu-system-x86 | xargs -i sudo kill -9 {} //有在运行的qemu就杀死cd %s && chmod +x %s/*.sh && sudo gnome-terminal -x%s/qemu.sh
这里%s就是as/build/posix/x86/ascore目录,等效于执行:
sudo gnome-terminal -x /home/XXX/autosar/as/build/posix/x86/ascore/qemu.sh
gnome-terminal命令用于打开一个新的终端。-X是自动执行,这里不加这个-X也可以自动执行。
qemu.sh
/home/XXX/work/as/release/download/qemu/i386-softmmu/qemu-system-i386-fda /home/XXX/work/as/TINIX.IMG -boot a -m 64M -serialtcp:127.0.0.1:1104,server -net nic -net user,hostfwd=tcp::13400-:1234 -device pci-ascan -device pci-asnet -devicepci-asblk & sh /home/XXX/work/as/build/posix/x86/ascore/telnet.sh
telnet.sh
sudomodprobe vcansudo iplink add dev can0 type vcansudo iplink set up can0sudo iplink set can0 mtu 72sleep0.5telnet127.0.0.1 1104
执行的情况如下:
2. scons studio启动
输入命令scons studio就会出来下面的界面:
可以在界面上进行配置,保存成arxml文件,再生成Lcfg代码。
building.py中building函数里面:
if(('studio' in COMMAND_LINE_TARGETS) and (env == Env)): studio=os.path.abspath('%s/com/as.tool/config.infrastructure.system/'%(env['ASROOT'])) assert(arxml) pd = os.path.abspath(cfgdir) RunCommand('cd %s && %s studio.py %s'%(studio,env['python3'],pd)) exit(0)
studio的路径为:com/as.tool/config.infrastructure.system
cfgdir :as/build/posix/x86/ascore/config
command打印出来为:
cd /home/XXX/autosar/as/com/as.tool/config.infrastructure.system&& python3 studio.py /home/XXX/autosar/as/build/posix/x86/ascore/config
下面看studio.py
if(__name__ == '__main__'): if(len(sys.argv)==2): gDefault_GEN = sys.argv[1] easySAR()
easySAR函数的定义如下:
def easySAR(): qtApp = QApplication(sys.argv) if(os.name == 'nt'): qtApp.setFont(QFont('Consolas')) elif(os.name == 'posix'): qtApp.setFont(QFont('Monospace')) else: print('unKnown platform.') qtGui = easySARGui() qtGui.show() qtApp.exec_()
easySARGui函数具体生成Gui,是使用了python+Qt编程,这里不具体分析了。os.name 打印出来为posix
3.scons --menuconfig启动
执行scons --menuconfig会启动配置界面。了解linux内核裁剪,应该很熟悉这个界面。
代码根目录SConstruct文件中,会调用building.py里面的PrepareEnv函数,如下:
senv = PrepareEnv()PrepareBuilding(asenv)
AddOption('--menuconfig', dest = 'menuconfig', action = 'store_true', default = False, help = 'make menuconfig for Automotive Software AS')
if(GetOption('menuconfig')): menuconfig(env)
首先找到工具com/as.tool/kconfig-frontends/kconfig-mconf,如果没有就编译:下面来看menuconfig这个函数,也在building.py中
cd /com/as.tool/kconfig-frontends && make
然后执行cmd命令,打印出来为:
cmd=export BOARD=x86 && export ASROOT=/home/XXX/autosar/as && rm -f .config&& /home/XXX/autosar/as/com/as.tool/kconfig-frontends/kconfig-mconf Kconfig && cp -fv .config /home/XXX/autosar/as/build/posix/x86/ascore/.config
然后使用kconfig-mconf工具加载根目录下Kconfig文件,出来配置界面。当我们配置保存后,会生成.config文件,最后把.config文件复制到build/posix/x86/ascore/.config目录下。首先删除代码根目录下.config文件
这里关注下根目录下Kconfig 文件
mainmenu "Automotive Software AS Configuration"
source "$ASROOT/com/as.application/Kconfig" source "$ASROOT/com/as.infrastructure/Kconfig"source "$ASROOT/com/as.tool/Kconfig"if !IS_ASTOOLsource "$ASROOT/release/$RELEASE/Kconfig"endif
menu "Run Time Environment"source可以引用其他Kconfig文件,例如com/as.application/Kconfig中
config RTE bool "Run Time Environment" default y if ARCH_POSIX
config RTE_SWC_TELLTALE bool "demo telltale software component" default y if ARCH_POSIX && DIO depends on RTE
menu表示一个菜单,主界面上可以看到
然后进入这个菜单可以看到两个选项
可以看到bool "Run Time Environment" 显示了,bool为变量取值的类型,可为y或n
config RTE这个RTE就是变量,最后会以宏的形式在.config文件中表示这个变量,值为y或者n
demo telltale software component没有显示,是因为
depends on RTE指此菜单的出现与否依赖于另一个定义RTE,这里RTE的值
default y if ARCH_POSIX,因为ARCH_POSIX没定义,所以RTE是n,这个菜单就不显示了。
下面看下生成的.config文件
## Run Time Environment## CONFIG_RTE is not setCONFIG_COMMONXML=y
里面都是像CONFIG_COMMONXML=y这样的宏定义
最后如果build/posix/x86/ascore/.config文件有改动,会重新生成asmconfig.h ksm_cfg.h文件
if(mtime != mtime2): GetConfig(fn,env) cfgdir = '%s/config'%(BDIR) MKDir(cfgdir) xcc.XCC(cfgdir,env)
GetConfig(fn,env)中,fn就是build/posix/x86/ascore/.config
fp = open(cfg)for el in fp.readlines(): if(reOne.search(el)): name,value = reOne.search(el).groups() name = name.replace('CONFIG_','') if(value=='y'): env['MODULES'].append(name) else: if(value[0]=='"'): value = value[1:] if(value[-1]=='"'): value = value[:-1] env['CONFIGS'][name]=valuefp.close()
CONFIG_ARCH_X86=y //值是y,把ARCH_X86保存到env['MODULES']name,value是获取的宏名字和值,这里比较典型的两种如下:
CONFIG_ARCH="x86" //值是字符串,把'ARCH': 'x86'保存到env['CONFIGS']中
cfgdir的值为build/posix/x86/ascore/config
xcc.XCC(cfgdir,env)在2.3中讲过,主要是生成宏到asmconfig.h文件中。
4. 代码目录分析
├── build
│ └── posix #编译后产生的临时目录
├── com
│ ├── as.application #编译的板卡类型相关配置
│ ├── as.infrastructure #Arccore开源代码
│ ├── as.tool #studio、Asone等工具
│ ├── as.virtual
│ └── SConscript #scons 脚本文件
├── Console.bat #在windows下运行的脚本文件,用于准备运行环境
├── Kconfig #kcongig文件
├── kernel.bin #编译后产生的bin文件,由autosar的代码编译而来
├── README.md #说明文件,还包括作者的一些参考网址记录
├── release
│ ├── asboot #bootloader
│ ├── ascore #示例应用程序的核心
│ ├── askar #一种RTOS
│ ├── aslinux #
│ ├── asminix #
│ ├── asslave #
│ ├── download #从网络上下载的一些工具,例如编译器、lwip组件、库文件等
│ ├── README.md #说明文件
│ ├── SConscript #scons脚本
│ └── ucos_ii #一种RTOS
├── SConscript #scons 脚本
├── SConstruct #scons 脚本
└── TINIX.IMG #编译出来的目标文件
|
4.1 as.application
查看as.application/SConscript里面包括三类文件:
objs += SConscript('board.%s/SConscript'%(BOARD))
objs += SConscript('common/SConscript')
objs += SConscript('swc/SConscript')
|
as.application/board.%s平台对应BOARD参数,如x86,stm32,mpc56等。以x86为例:board.x86
├── Kconfig #提供了板卡上芯片构架的宏定义
├── SConscript #定义了MODULES、环境变量声明、qemu参数定制、c文件编译定制
└── script
└── linker-app.lds
|
as.application/common下主要是配置文件、rte文件、测试文件
├── autosar.arxml #配置工具根据这个arxml生成下面config文件夹里面Cfg配置文件
├── config #Cfg配置文件,跟BSW的代码一块参加编译,为各个模块初始化的全局变量声明
├── diagnostic.dml #AsOne工具使用
├── infrastructure.xml #内核编译使用
├── rte #rte对应C代码的基本范式
├── SConscript #scons编译工具脚本文件,定义编译那些模块
├── test #一些测试程序
└── xcp.cml #AsOne工具使用
|
diagnostic.dml在com/as.tool/as.one.py/asdcm.py:740中打开使用,运行AsOne工具,可以看到
.dml是使用DynaScript(一种专门的动态HTML脚本语言)编写的Web脚本;包含可用于动态生成HTML的代码;可以在安装DynaScript的任何Web服务器上执行。
infrastructure.xml 在release/aslinux/automotive-message-broker/plugins/autosar/Makefile中调用
xcp.cml在com/as.tool/as.one.py/asxcp.py:397中打开使用,运行AsOne工具,可以看到
as.application/swc 包含了gauge,linapp,telltale三个SWC,里面分别有一个swc.py
import autosar 这里的autosar是一个开源软件模块,代码路径在:
com/as.tool/config.infrastructure.system/third_party/autosar
github对应的网址为:https://github.com/cogu/autosar
4.2 as.infrastructure
这里面是arccore的源码,比较老一些,最新的autosar源码参考:
https://github.com/openAUTOSAR/classic-platform
4.3 as.tool
├── as.one.py #AsOne工具
├── cancasexl.access #
├── config.infrastructure.gui #仪表盘UI
├── config.infrastructure.system #工具脚本的集中存放地方,例如studio、AsOne等
├── Kconfig
├── kconfig-frontends #Kconfig工具
├── lua #can、lin驱动相关的一些代码
├── py.can.database.access #
├── qemu #qemu虚拟机相关的一些驱动
└── SConscript
|
4.3.1 as.one.py
python写的一个工具,集成了很多功能,例如 CAN、DoIP(以太网)或 XCP(通用校准协议)上的 BOOTLOADER、诊断通信控制(UDS iso14229)等
这个工具运行在PC上,通过各种通信方式(eth、can等)可以给汽车发送报文消息,用于测试
43.3.2 config.infrastructure.system
├── argen #工具生成cfg配置文件的python脚本
├── aroil #
├── arxml #处理arxml文件的脚本,在生成配置文件中使用
├── AS.xlsm #在misc.py中引用
├── building.py #scons命令的主要执行python脚本,执行完后进行编译c文件组装目标文件
├── misc.py #
├── plugin #
├── __pycache__ #运行python后会产生,见下面解释
├── studio.py #cfg配置文件生成工具
├── third_party #包括autosar和cfile两个开源工具
└── xcc.py #根据模块MODULES生成对应的配置文件时候使用
|
__pycache__文件夹的意义何在呢?
因为第一次执行代码的时候,Python解释器已经把编译的字节码放在__pycache__文件夹中,这样以后再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去__pycache__文件夹中去运行相关的 *.pyc 文件,大大缩短了项目运行前的准备时间。
4.3.3 third_party
Autosar
用来读/解析/写arxml,也包含了配置rte等方法,但内容比较少。as在此基础上做了二次开发,如asSWCGen方法。
代码地址:https://github.com/cogu/autosar
手册地址:https://autosar.readthedocs.io/en/latest/index.html
cfile python生成c代码的工具
4.3.4 lua
can驱动相关的一些代码,在AsOne工具里面会用到
4.4 release
存放C和C++发布的应用程序
4.5 支持的RTOS
十余种ROTS,可以使用scons --menuconfig配置,默认为askar
askar是as的作者自己搞的一个os很强大,也可以换成freeRTOS或者freeosek。
后记:
编译的东西到这告一段落,这部分跟编译脚本python等相关,有点乏味,想仔细研究AS代码,或者后续要修改的时候可以再看看。后续的文章将围绕网络协议栈和诊断展开,进入真正的autosar业务和c代码编程的世界。
Talk is cheap,show methe code,持续更新,纯干货分享,无广告,不打赏,欢迎转载,欢迎评论交流!
往期回顾:
AUTOSAR入门-江湖
AUTOSAR入门-AS开源代码运行环境搭建
AUTOSAR入门-AS开源代码编译过程详解 |
|