以编程方式配置 AUTOSAR 可运行实体和事件
此示例说明如何以编程方式配置 AUTOSAR 可运行实体和事件。
此示例使用 autosar.api.getAUTOSARProperties 和 autosar.api.getSimulinkMapping 对象及函数来操作示例模型 autosar_swc_expfcns。
AUTOSAR 软件组件的行为由一个或多个可运行实体实现。AUTOSAR 可运行实体是可调度实体,由底层 AUTOSAR 操作系统直接或间接调度。每个可运行实体由 RTEEvent 触发,这些事件由 AUTOSAR 运行时环境 (RTE) 生成。对于每个可运行实体,您需要配置它响应的事件。以下是可运行实体响应的 AUTOSAR 事件示例:
TimingEvent- 触发周期性可运行实体。DataReceivedEvent或DataReceiveErrorEvent- 触发具有接收方端口的可运行实体,该端口参与发送方-接收方通信。OperationInvokedEvent- 触发具有服务器端口的可运行实体,该端口参与客户端-服务器通信。ModeSwitchEvent- 触发具有模式接收方端口的可运行实体,该端口参与模式切换通信。InitEvent(AUTOSAR 架构 4.1 或更高版本)- 触发执行组件初始化的可运行实体。ExternalTriggerOccurredEvent- 触发具有触发器接收方端口的可运行实体,该端口参与外部触发事件通信。
为周期性可运行实体配置 AUTOSAR TimingEvent
此示例使用模型 autosar_swc_expfcns 来说明如何以编程方式添加和配置周期性可运行实体和定时事件。
打开 autosar_swc_expfcns 示例模型并创建 autosar.api.getAUTOSARProperties 对象。
hModel = "autosar_swc_expfcns";
open_system(hModel);
arPropsExport = autosar.api.getAUTOSARProperties(hModel);使用 find 函数查找模型中存在的可运行实体。
swc = get(arPropsExport,"XmlOptions","ComponentQualifiedName"); ib = get(arPropsExport,swc,"Behavior"); runnables = find(arPropsExport,ib,"Runnable","PathType","FullyQualified"); runnables'
ans = 4×1 cell
{'/pkg/swc/ASWC/IB/Runnable_Init'}
{'/pkg/swc/ASWC/IB/Runnable1' }
{'/pkg/swc/ASWC/IB/Runnable2' }
{'/pkg/swc/ASWC/IB/Runnable3' }
然后,您可以遍历这些可运行实体并列出其属性值。有关 AUTOSAR 属性的详细信息,请参阅 AUTOSAR Element Properties。
for ii=1:length(runnables) runnable = runnables{ii}; rnName = get(arPropsExport,runnable,"Name"); rnSymbol = get(arPropsExport,runnable,"symbol"); rnCBIC = get(arPropsExport,runnable,"canBeInvokedConcurrently"); fprintf("Runnable %s: symbol %s, canBeInvokedConcurrently %u\n",... rnName,rnSymbol,rnCBIC); end
Runnable Runnable_Init: symbol Runnable_Init, canBeInvokedConcurrently 0 Runnable Runnable1: symbol Runnable1, canBeInvokedConcurrently 0 Runnable Runnable2: symbol Runnable2, canBeInvokedConcurrently 0 Runnable Runnable3: symbol Runnable3, canBeInvokedConcurrently 0
声明变量以配置可运行实体的属性。
set(arPropsExport,runnables{2},"Name","myRunnable","symbol","myAlgorithm");
runnables = find(arPropsExport,ib,"Runnable","PathType","FullyQualified");
rnName = get(arPropsExport,runnables{2},"Name");
rnSymbol = get(arPropsExport,runnables{2},"symbol");
rnCBIC = get(arPropsExport,runnables{2},"canBeInvokedConcurrently");
fprintf("Runnable %s: symbol %s, canBeInvokedConcurrently %u\n",...
rnName,rnSymbol,rnCBIC);Runnable myRunnable: symbol myAlgorithm, canBeInvokedConcurrently 0
您可以通过指定事件类型来遍历 AUTOSAR 定时事件,并列出关联的可运行实体。
events = find(arPropsExport,ib,"TimingEvent","PathType","FullyQualified"); for ii=1:length(events) event = events{ii}; eventStartOn = get(arPropsExport,event,"StartOnEvent"); fprintf("AUTOSAR event %s triggers %s\n",event,eventStartOn); end
AUTOSAR event /pkg/swc/ASWC/IB/Event_t_1tic_A triggers ASWC/IB/myRunnable AUTOSAR event /pkg/swc/ASWC/IB/Event_t_1tic_B triggers ASWC/IB/Runnable2 AUTOSAR event /pkg/swc/ASWC/IB/Event_t_10tic triggers ASWC/IB/Runnable3
设置名称并将事件配置为 TimingEvent。
set(arPropsExport,events{1},"Name","myEvent");
events = find(arPropsExport,ib,"TimingEvent","PathType","FullyQualified");
eventStartOn = get(arPropsExport,events{1},"StartOnEvent");
fprintf("AUTOSAR event %s triggers %s\n",events{1},eventStartOn);AUTOSAR event /pkg/swc/ASWC/IB/myEvent triggers ASWC/IB/myRunnable
将 Simulink 导出函数 Runnable1 映射到 AUTOSAR 可运行实体 myRunnable。
slMapExport = autosar.api.getSimulinkMapping(hModel); mapFunction(slMapExport,"Runnable1","myRunnable");
The function name value 'Runnable1' is obsolete and will be removed in a future
release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
The function name value 'Runnable1' is obsolete and will be removed in a future
release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
arRunnableName = getFunction(slMapExport,"Runnable1")The function name value 'Runnable1' is obsolete and will be removed in a future
release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
arRunnableName = 'myRunnable'
配置和映射可运行实体
此示例使用模型 autosar_swc_counter 来说明如何添加初始化和周期性可运行实体,以及配置与这些可运行实体关联的定时事件。还提供了一个示例来说明如何以编程方式将可运行实体映射到 Simulink 函数。
打开示例模型 autosar_swc_counter,并创建相关的 autosar.api.getAUTOSARProperties 对象。
hModel = "autosar_swc_counter";
open_system(hModel);
arPropsCounter = autosar.api.getAUTOSARProperties(hModel);定义并添加 AUTOSAR 初始化和周期性可运行实体,分别为 myInitRunnable 和 myPeriodicRunnable。
initRunnable = "myInitRunnable"; periodicRunnable = 'myPeriodicRunnable'; swc = get(arPropsCounter,"XmlOptions","ComponentQualifiedName")
swc = '/Company/Powertrain/Components/autosar_swc_counter'
ib = get(arPropsCounter,swc,"Behavior")ib = 'autosar_swc_counter/ASWC_IB'
add(arPropsCounter,ib,"Runnables",initRunnable); add(arPropsCounter,ib,"Runnables",periodicRunnable);
添加 AUTOSAR 定时事件 myPeriodicEvent。
eventName = "myPeriodicEvent"; add(arPropsCounter,ib,"Events",eventName,"Category","TimingEvent","Period",1,... "StartOnEvent",[ib '/' periodicRunnable]);
创建 autosar.api.getSimulinkMapping 对象。
slMapCounter = autosar.api.getSimulinkMapping(hModel);
将初始化可运行实体 myInitRunnable 映射到 Simulink InitializeFunction。将周期性可运行实体 myPeriodicRunnable 映射到 Simulink StepFunction。
mapFunction(slMapCounter,"InitializeFunction",initRunnable);The function name value 'InitializeFunction' is obsolete and will be removed in
a future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
The function name value 'InitializeFunction' is obsolete and will be removed in
a future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
mapFunction(slMapCounter,"StepFunction",periodicRunnable);The function name value 'StepFunction' is obsolete and will be removed in a
future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
The function name value 'StepFunction' is obsolete and will be removed in a
future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
要通过验证,请删除 AUTOSAR 配置中冗余的初始化和步进可运行实体。
runnables = get(arPropsCounter,ib,"Runnables"); delete(arPropsCounter,[ib,'/Runnable_Init']); delete(arPropsCounter,[ib,'/Runnable_Step']); runnables = get(arPropsCounter,ib,"Runnables")
runnables = 1×2 cell
{'autosar_swc_counter/ASWC_IB/myInitRunnable'} {'autosar_swc_counter/ASWC_IB/myPeriodicRunnable'}
检索和映射信号与状态
此示例使用模型 autosar_swc_counter 来说明如何以编程方式将信号和状态映射到 AUTOSAR 变量类型。
hModel = "autosar_swc_counter";
open_system(hModel);
slMapCounter = autosar.api.getSimulinkMapping(hModel);使用 autosar.api.getSimulinkMapping 对象、slMapCounter 以及对象函数 find 获取信号及其名称,以及模型中存在的状态。
listOfSignals = find(slMapCounter,"Signals")listOfSignals = 1×3
520.0011 524.0020 529.0018
namesOfSignals = get_param(listOfSignals, "Name")namesOfSignals = 3×1 cell
{'equal_to_count'}
{'sum_out' }
{'switch_out' }
listOfStates = find(slMapCounter,"States")listOfStates = "autosar_swc_counter/X"
将信号映射到 AUTOSAR 变量类型。有关详细信息,请参阅 mapSignal 函数。
mapSignal(slMapCounter,listOfSignals(1),"StaticMemory") mapSignal(slMapCounter,listOfSignals(2),"ArTypedPerInstanceMemory") mapSignal(slMapCounter,listOfSignals(3),"Auto")
将状态映射到 AUTOSAR 变量类型 StaticMemory。有关详细信息,请参阅 mapState 函数。
mapState(slMapCounter,'autosar_swc_counter/X','',"StaticMemory")
为可运行实体激活配置事件
此示例说明向模型中的可运行实体添加 AUTOSAR TimingEvent、DataReceivedEvent 和 DataReceiveErrorEvent 的属性函数语法。对于 DataReceivedEvent 或 DataReceiveErrorEvent,您需要指定触发器。触发器名称包括接收事件的 AUTOSAR 接收方端口和数据元素的名称,例如 RPort.DE1。
打开示例模型 autosar_swc_expfcns 并创建相关的 autosar.api.getAUTOSARProperties 函数。
hModel = "autosar_swc_expfcns";
open_system(hModel);
arPropsExport = autosar.api.getAUTOSARProperties(hModel);使用软件组件的名称和行为,向指定的可运行实体(在本例中为 Runnable1)添加定时事件。
swc = get(arPropsExport,"XmlOptions","ComponentQualifiedName")
swc = '/pkg/swc/ASWC'
ib = get(arPropsExport,swc,"Behavior")ib = 'ASWC/IB'
runnables = get(arPropsExport,ib,"Runnables")'runnables = 4×1 cell
{'ASWC/IB/Runnable_Init'}
{'ASWC/IB/myRunnable' }
{'ASWC/IB/Runnable2' }
{'ASWC/IB/Runnable3' }
runnable = 'Runnable2'; timingEventName = 'myTimingEvent'; add(arPropsExport,ib,"Events",timingEventName,"Category",'TimingEvent',... "Period",1,'StartOnEvent',[ib '/' runnable]);
向可运行实体 myRunnable 添加 DataReceivedEvent 和 DataReceiveErrorEvent。
drEventName = "myDREvent"; add(arPropsExport,ib,"Events",drEventName,"Category","DataReceivedEvent",... "Trigger","RPort.DE1",'StartOnEvent',[ib '/' runnable]); dreEventName = "myDREEvent"; add(arPropsExport,ib,"Events",dreEventName,"Category","DataReceiveErrorEvent",... "Trigger","RPort.DE1",'StartOnEvent',[ib '/' runnable]);
要通过验证,请删除 AUTOSAR 配置中的冗余定时事件。
events = get(arPropsExport,ib,"Events")'events = 6×1 cell
{'ASWC/IB/myEvent' }
{'ASWC/IB/Event_t_1tic_B'}
{'ASWC/IB/Event_t_10tic' }
{'ASWC/IB/myTimingEvent' }
{'ASWC/IB/myDREvent' }
{'ASWC/IB/myDREEvent' }
delete(arPropsExport,[ib,'/Event_t_1tic_B']) events = get(arPropsExport,ib,"Events")'
events = 5×1 cell
{'ASWC/IB/myEvent' }
{'ASWC/IB/Event_t_10tic'}
{'ASWC/IB/myTimingEvent'}
{'ASWC/IB/myDREvent' }
{'ASWC/IB/myDREEvent' }
另请参阅
对象
函数
find|find|getFunction|mapFunction|mapSignal|mapState