AUTOSAR入门-AS平台工具命令和目录介绍

原创 thatway 那路谈OS与SoC嵌入式软件 2022-03-10 20:16

     上一篇说了编译的过程,这里再补充介绍几个重要的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 vcan
sudo iplink add dev can0 type vcan
sudo iplink set up can0
sudo iplink set can0 mtu 72
sleep0.5
telnet127.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_ASTOOL
source "$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 set
CONFIG_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]=value
fp.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 #studioAsone等工具

│ ├── 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 #工具脚本的集中存放地方,例如studioAsOne

├── Kconfig

├── kconfig-frontends #Kconfig工具

├── lua #canlin驱动相关的一些代码

├── 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 #包括autosarcfile两个开源工具

└── 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开源代码编译过程详解

results matching ""

    No results matching ""