提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在基于AUTOSAR平台开发的软件系统中,SWC的描述文件的格式是arxml。这个文件常由Vector的Developer导出或者MATLAB编译生成,但在开发过程中模块的接口文档一般是写在Excel表格中的,手动在工具中创建比较麻烦,所以如果能够由表格生成arxml再导入到开发工具或者集成工具中就比较方便了。
以下没有Excel表格读取的内容,仅分享arxml的生成,并且是SWC中常见的内容:SWC、runnable、SR接口和数据类型的创建。
一、第三方库autosar
以下功能是基于Python第三方库autosar (0.4.2)的基础上进行的封装,仅用了里面一部分功能,详细内容可查阅 https://autosar.readthedocs.io/en/latest/
二、代码分享
由于库中的函数和一些方法不好理解,所以按照自己的方式进行了一层封装,只封装了常使用的一些功能。
1. Swc类初始化
Swc是自定义的一个类,一些功能都写在这个类的方法中。
代码如下(示例):
class Swc(object):
def __init__(self, swc, file):
self.swc = swc
pkg_swc = swc
pkg = pkg_swc + '_pkg'
self.refs = {
# Package Paths
'componentPackage': f'/{
pkg}/{
pkg_swc}_swc',
'datatypePackage': f'/{
pkg}/{
pkg_swc}_dt', # /ImplementationDataTypes
'interfacePackage': f'/{
pkg}/{
pkg_swc}_if', # "PortInterfaces", #
# Qualified Names
# 'internalBehaviorName': f'/{pkg}/{pkg_swc}_swc/ib/{pkg_swc}',
# 'implementationName': f'/{pkg}/{pkg_swc}_swc/{pkg_swc}_imp',
# Additional Packages
'applicationDataTypePackage': f'/{
pkg}/{
pkg_swc}_dt/ApplDataTypes',
'swBaseTypePackage': f'/{
pkg}/{
pkg_swc}_dt/SwBaseTypes',
'dataTypeMappingSetPackage': f'/{
pkg}/{
pkg_swc}_dt/DataTypeMappings',
'constantSpecificationPackages': f'/{
pkg}/{
pkg_swc}_dt/Ground',
'physicalDataConstraintsPackage': f'/{
pkg}/{
pkg_swc}_dt/ApplDataTypes/DataConstrs',
'systemConstantPackage': '',
'swAddressMethodPackage': f'/{
pkg}/{
pkg_swc}_dt/SwAddrMethods',
'modeDeclarationGroupPackage': '',
'compuMethodPackage': f'/{
pkg}/{
pkg_swc}_dt/CompuMethod',
'unitPackage': f'/{
pkg}/{
pkg_swc}_dt',
'swRecordLayoutPackage': f'/{
pkg}/{
pkg_swc}_dt/ApplDataTypes/RecordLayouts',
'internalDataConstraintsPackage': 'AUTOSAR_Platform/DataConstrs'
}
self.ws = autosar.workspace("4.2.2")
if file:
self.ws.loadXML(file)
self.ws.version = "4.2.2"
- swc:swc的名称。(如果容易混淆,可以改成其他名字。)
- file:arxml文件路径。autosar也是可以读取arxml文件的,可以在此基础上修改。如果从零创建,可以传入None。
功能说明:
- self.refs:这个是package的路径,后续创建的内容会放到这里面。MATLAB生成的arxml也是可以设置这个路径的,如下:
- self.ws = autosar.workspace(“4.2.2”):后续的处理都是在workspace的基础上进行的,传入的数字是arxml版本,4.0以后的都可以。(这个workspace是可以创建一个Developer工程的,没用到就没咋研究。)
- self.ws.loadXML:是用于读取arxml。
- self.ws.version = “4.2.2”:读取后需要设置一下arxml版本,否则后续处理会出现exception。(好像4.0以后SWC的arxml没事区别,设置一个即可。)
2. 创建package
代码如下(示例):
def common_pkg_create(self):
"""
Create common package according to self.refs.
If package already exist, it will not be created controlling by autosar.workspace. See createPackage.
"""
for ref in self.refs.values():
if ref:
refList = autosar.base.splitRef(ref)
pkg = self.ws.createPackage(refList[0]) # 创建一级目录
if len(refList) > 1:
self.create_sub_pkg_by_ref(pkg, '/'.join(refList[1::])) # 创建子目录
def create_sub_pkg_by_ref(self, pkg, ref):
"""
Create subPackage for pkg according to ref.
"""
refList = autosar.base.splitRef(ref)
f = pkg.find(refList[0]) # 查找是否已经存在package (refList[0])
if len(refList) > 1: # 存在深层次路径,则需要迭代创建
if f:
self.create_sub_pkg_by_ref(f, '/'.join(refList[1::]))
else: # 如果不存在pkg,则创建
temp = pkg.createSubPackage(refList[0])
self.create_sub_pkg_by_ref(temp, '/'.join(refList[1::]))
else:
if not f:
pkg.createSubPackage(refList[0])
- 用于创建self.refs指定的package路径的,使用时调用common_pkg_create()即可。
- 需注意,每一个package需要被setRole,否则用到的地方可能会报错,也可以在用到的地方调用。(Role参考https://autosar.readthedocs.io/en/latest/autosar4_guide/roles.html)
3. 创建数据类型
3.1 BaseType
代码如下(示例):
def util_createSwBaseType(self, name, size=None, encoding=None, nativeDeclaration=None, category='FIXED_LENGTH',
adminData=None):
baseTypes = self.ws.find(self.refs.get('swBaseTypePackage'))
self.ws.setRole(self.refs.get('swBaseTypePackage'), 'DataType')
try:
baseTypes.createSwBaseType(name, size, encoding, nativeDeclaration, category, adminData)
except ValueError:
LOG.debug(f"Already exist SwBaseType: {
name}")
- self.ws.find:可以findpackage,但需要注意传入ref的绝对路径(因为会常用这个路径,所以定义了一个refs字典)。
- self.ws.setRole:需要将swBaseTypePackage设置为DataType角色,一些内部的处理用的这个“Role”。也可在创建package时设置,设置一次即可。
- baseTypes.createSwBaseType:创建BaseType的函数。(后面会有例子)
3.2 ImplementationDataType
代码如下(示例):
def util_createImplementationDataType(self, name, baseTypeRef, lowerLimit=None, upperLimit=None, valueTable=None,
bitmask=None, offset=None, scaling=None, unit=None, forceFloat=False,
dataConstraint='', swCalibrationAccess='', typeEmitter=None,
lowerLimitType=None, upperLimitType=None, category='VALUE', adminData=None):
implTypes = self.ws.find(self.refs.get('datatypePackage'))
self.ws.setRole(implTypes.ref, 'DataType')
try:
implTypes.createImplementationDataType(name, baseTypeRef, lowerLimit, upperLimit, valueTable, bitmask,
offset, scaling, unit, forceFloat, dataConstraint,
swCalibrationAccess, typeEmitter, lowerLimitType, upperLimitType,
category, adminData)
except ValueError:
LOG.debug(f"Already exist ImplementationDataType: {
name}")
- 这个创建Implementation类型,不同的类型(结构体,数组,枚举等)需要传入的参数不同。在此基础上又进行了一次封装。
3.2.1 一般类型
代码如下(示例):
def util_createDataType(self, name, baseType):
implTypes = self.ws.find(self.refs.get('datatypePackage'))
self.ws.setRole(implTypes.ref, 'DataType')
if not implTypes.find(name):
baseTypeRef = f'{
self.refs.get("swBaseTypePackage")}/{
baseType}'
return self.util_createImplementationDataType(name=name, baseTypeRef=baseTypeRef)
- 用于生成如uint8、sint8、float32的一般类型。
- 需要传入baseTypeRef,这个用的是创建的BaseType,其ref在swBaseTypePackage路径下。(在某packa