【Autosar工具使用】

DataTypes

1.配置系统所需,数据类型。

Value窗口

 

数组窗口

 

 其他的Type类型

  • Application Data Types(简称ADT):大家理解成是在Dev软件的图形界面上使用的类型,只存在于概念中,不会在代码中体现
  • Implementation Data Types(简称IDT):理解成是对Base Types改了个名字,方便代码生成时阅读的,比如我们经常做这么一件事typedef uint8 Std_ReturnType
  • Base Types:就是我们经常用到的int、bool、float、uint16这样的基础类型
  • Units:就是数据的单位,比如km、h和kg等
  • Compu Method:计算方法,比如我采样到的ADC是0-4095,那么如何转换成真实的电压值,可以在这里定义一个转换的计算方法。该计算方法可以是线性的,非线性的,基于查表的等等。这个计算方法会在代码中生成一个#define
  • Data Contraints:数据约束,就是对数据进行最大、最小值约束等操作

 ApplicationPortIF

1.配置SWC与CDD之间的接口

配置接口的函数

 

 

Ports是SWC和SWC做接口(Interface)通信使用,或者SWC通过RTE和BSW做接口(Interface)通信使用。    
Ports主要分为5种类型,列在下面的图中:    
 

其中又可分类为:R-Ports、P-Ports和PR-Ports。值得注意的是,这里的PR-Ports只在AutoSAR4中定义了。
或者又可以分为:Send/Receiver(S/R)接口和Client/Server(C/S)接口。而S/R接口是用来传输数据的;C/S接口是用来执行操作的。


S/R接口

作用: 传输数据。通过RTE传输数据,并且通过RTE管理数据的传输,避免数据出问题(例如同时调用同一数据时可能出错)        
一个接口可以包含多个数据,类似于通过结构体传输        
可以传输基础数据类型(int,float等)和复杂数据类型(record,array等)        
再说具体一点,举个例子调用接收接口:        
Rte_Read_<Port>_<Data>()        
//这里的xx是指的传输的数据内容,比如DoorOpen就是:        
SWC_DoorOpen = Rte_Read_Door_DoorOpen();        
        
C/S接口        
 

作用: 提供操作。就是Server提供函数供Client调用    
可以同步和异步。同步就是直接调用,相当于函数直接插入上下文运行;异步的话需要等待,相当于让函数在另一个线程中运行,运行完了再返回,原上下文依然运行    
一个接口可以提供多个操作,就是一个接口可以包含很多函数    
ECU内部和跨ECU都可以调用,跨ECU也是通过外部总线    
再说具体一点,举个例子调用客户接口:    
Rte_Call_<Port>_<Function>()    
//这里的xx是指的调用的函数,比如调用State()就是:    
Rte_Call_Door_State();    

 

 

Service Port Interfaces
这里和Service Component Types一样,一般是由Cfg配置生成的。这里的接口就是用在Service Component上的接口(也就是BSW中服务层对AppL的接口)

Type Mapping Sets
Type Mapping Sets也是右键,new一个出来:
主要作用是将ADT和IDT映射上,之前说过了ADT是概念上的,而IDT才是代码中的。我们在图形界面中一般使用ADT,但是ADT如何生成代码,就需要和IDT映射才行,下图就是映射的界面。但是这里设置的是一个映射的模板,后面还需要将这个模板应用到SWC上,才能算映射成功。

 ApplicationComponentType

1.创建Runnable,这里注意区分是SWC(Application)或CDD,目前使用就这两种。

 

2.创建完毕后,添加Runnable方法,这里注意InitRunnale最开始执行,然后在执行其他的Runnable方法。

 

3.init类型的runnable自动添加init方法

 4.定周期的Runnale,可以在trigger添加定时器,系统就会自动调用。

5.模块视图

6.IPC  server/client 说明

 

7.创建IPC cdd

 

 

 

 

 

8.IPC CDD模型图

 

9.SWC创建Demo:IPC_Client

 

 

10.IPC_Client 的Runnable

 

11.RTE接口导入

 

 

 

 

 

总结:
1.打开工程(注意这里不是新建工程,因为工程一般是在Cfg中新建,由于Cfg和Dev是共享一个工程;因此在Cfg中新建后保存,利用Dev打开这个保存后的.dpa工程就行了。如何新建工程将在8.1节讲解)
2.在Object Browser中设计SWC Types、Data Types等Types(Types相当于一个类)
3.在Software Design中实例化SWC,并且设计其端口,再连接端口(上面说了Types是一个类,而将设计好的Types拖到Software Design中,就相当于将类实例化;类这是C++的概念,如果不了解C++的话,可以这么理解:Types是定义好的一个struct模板,而实例化就是利用struct模板生成的一个具体结构体;还不是很明白的话,就想成一个int类型,用int类型实例化了一个变量i)
4.数据映射
5.保存工程再在Cfg中打开并同步

Con导入配置

 1.使用DaVinci Configurator打开下记路径C:\Vector\CBD1900611_D01_IMX8\Applications\SipAddon\StartApplication\CBD1900611.dpa
默认安装时是没有DaVinci Configurator图标的,需要使用C:\Vector\CBD1900611_D01_IMX8\DaVinciConfigurator\Core\DaVinciCFG.exe打开

ECU_SoftWare 

 1.导入Task,导入之前Dev配置的CDD和SWC。

 

OS_Config

 1.在OSConfguration中增加Task,此处需要手动创建,不能像ECU Software Components中导入。

Tasks
AutoSAR一共规定了两种Task——Basic和Extended的Task,主要区别就是前后者分别有3和4个状态机(Extended多了一个等待状态)。

①、基础任务(Basic Task)
当启动操作系统后,所有的Task都进入到挂起状态;然后由用户去触发需要执行的Task(一般在DaVinci中都有配置,可以生成代码,比如配置成初始化执行或者100ms周期执行);被触发的Task都直接进入准备状态,等待被OS调用;这时OS会根据Task的优先级来调度Task(如果这时有高优先级的Task进入准备状态了,OS就会暂停正在执行的Task,优先让高优先级的Task执行,后继续执行被暂停的Task,类似于中断嵌套)。

 

② 、扩展任务(Extended Task)
但是基础任务有一个缺陷:比如我们有两个Task,我的高优先级Task在执行中需要一个ADC的数据,但是我们的ADC配置成了1秒采样一次,而我们的高优先级Task就需要循环等待1秒ADC数据更新,低优先级任务此时却无法执行,就白白浪费了1秒CPU资源。

扩展任务比基础任务多了一个等待状态,这个状态就是当Task正在运行的时候,突然需要一个事件(比如刚刚的ADC数据更新),那么在等待这个事件的时候Task进入等待状态并释放CPU资源,低优先级的Task就可以继续占用CPU;当ADC数据更新事件来了,那么再让我们在等待状态中的Task进入准备状态,由于优先级高,那么再进入运行状态

 2.创建后可能会有错误,不用理会,稍后全部错误,会有自动选择修正,到时处理。

 

3.之前Dev配置Runnable到映射Task

 

4.先选择一个Task使用的Runnable 

5.选择运行Runnable要执行的Task

6.查看配置结果,点击Finish 

 7.各个Task配置完毕截图

 

 

 

 8.Alarms配置,目前由于Dev配置定周期的Runnable,所以会自动增加Alarm。

 

 

上面说的Task从挂起状态到准备状态可以由一个配置好的周期触发完成,而这个周期就是有Alarms完成的。Alarms顾名思义是闹钟,作用就是设置一个周期定时,但不光能用来触发Task,还可以用来设置一个Event事件(就是上面扩展任务那个Event事件)或者Call一个回调函数。
而Alarms的设置可以是在DaVinci中直接配置,或者在Task中修改设置也是可以的。Alarms的时间基准是通过由硬件定时器产生的Tick Time决定的,每个Tick Time是多少时间可以在DaVinci中配置。每来一个Tick Time,System Counter便加1,加到预设的值,Alarm就被触发了
 

9.中断配置,由于目前video和IPC程序使用都是默认的。 

 

 

 

 

中断大家都熟悉,需要注意的是,中断的优先级始终高于Task,而中断的优先级中一类中断大于二类中断;另外还需要注意的是,周期性Task和周期性中断都能做周期处理,但是在周期要求严格的情况下,最好用中断,因为周期性Task由于操作系统、调度等原因往往时间不是很准确(比如大家可以试试用周期Task模拟出一个100k的PWM,可以观察其周期的波动)    
    
1、一类中断(Cat1)    
不会访问OS服务,中断结束后直接返回中断处(就和我们常用的单片机中断一样,但我们更常使用的是二类中断)。这里OS依然按照正常的调度执行    
    
2、二类中断(Cat2)    
会访问部分OS服务(一些OS服务是不允许的,比如TerminateTask),中断结束后会发生一次OS的重新调度    
    
3、对比    
是不是有点听不懂,没关系,我们依然上图。其实就是多了一个OS调度的立即执行    
举个例子,我们有两个Task:Task1(周期1s),Task2(周期100ms,优先级高),当前时刻正在执行Task1,突然来了中断(假设中断执行时间极短):    
一类中断: 由于不允许使用OS服务,因此在一类中断中不能调用Task2触发函数,只能在退出中断后回到Task1,然后等待OS应该调用Task2的时候再调用    
二类中断: 因为允许使用OS部分服务,这时我们在二类中断中写入了Task2的触发函数,那么在中断结束返回的时候会直接发生一次调度,由于Task2被触发了,优先级又高,那么就直接进入Task2运行,等Task2运行结束,再返回Task1继续运行(如下图的2情况);当然,在中断中也可以不触发其他Task,OS调度也就依然返回到Task1中去(如下图的1情况)    
 

10. IOC:是在内存中开辟了一个被保护的IOC区域,用于跨核通信。估计以后需要吧,因为M4和A35使用的是共享内存。Inter OS Application Communicator(IOC)
 该区域支持多输入多输出,由OS管理,在DaVinci中一般是自动生成无需修改,这里仅作了解

 

11.OS Resources:当至少两个Task并行访问同一个资源的时候(比如双核CPU),很可能出问题,OS Resources就是用来防止并行访问出错,也是了解即可,机制很简单,锁住就行 

如下图(其实为了防止死锁现象,使用了一种优先级上限协议机制

 

 

 

OS的一些调试机制

 OS运行实例    
这是一个流程图,反应了从OS启动开始的运行流程。大家可以自己先看看图,自己分析一下该流程,然后博主将详细讲解,大家对照一下看看自己的分析是否有误    

启动OS    
红色线路表示当前流程运行中的地方。在启动OS之后,会触发三个能AutoStart的Task(Task可以配置成自启动、Alarm周期触发或者手动触发等)。    
    
BtInit: 先运行Initlalization代码;然后由于BtInit和BtCyclic跨核,这里就使用了IOC跨核传输,将被传量放入IOC中,等待其他核读取;最后Terminate结束    
EtReceive: 先运行到Application Code2处;然后就开始等待事件1的触发    
EtTransmit: 先运行到Application Code4处;然后获取OSResource数据,并且一直占用    
然后到此,如果没有Alarm和中断的话,能运行的代码就运行结束了    
 

 Alarm周期    
接着上面的继续,这里突然来了一个Alarm,它会先触发BtCyclic和设置一个事件Event1    
    
BtCyclic(左): 先运行Application Code1;然后读取在IOC中的内容;然后Terminate    
EtReceive: 由于等待的Event1事件到来了,那么就继续执行下面的代码,这里的代码是触发右边的BtCyclic代码    

由于EtReceive触发了BtCyclic,那么如下图,将继续运行
BtCyclic(右): 先执行Application Code3;然后设置Event2,这时就会触发EtTeansmit继续运行;然后获取OSResource,但是由于EtTeansmit一直占用该资源未释放,所以获取失败;然后Terminate
EtTransmit: 在被BtCyclic触发事件Event2之后,就会继续运行Application Code5的内容
 

以上就是Alarm之后,能够执行的全部内容了

中断事件

然后接着上面继续分析,这时来了中断。

ISR Cat2: 先获取OSResource的资源,同样会获取失败,因为被占用未释放;然后设置事件Event3,但是由于EtTransmit已经执行进入Application Code5中了,没有在等待状态,所以本次触发没有效果
EtTransmit: 继续执行Application Code5的内容
 

Add Component Connection 

1.创建接口连接器

 

 

 

 

错误提示修正

1.CDD对应OsApplication_NonTrusted_Core0
2.SWC对应OsApplication_Trusted_Core0
 

Code生成

1.配置检查,Code生成F9

 

2.生成code 部分在C:\Vector\CBD1900611_D01_IMX8\Applications\SipAddon\StartApplication\Appl\GenData目录下,需要手动复制\Source路径中

 

Vector制限
1.手动还原C:\Vector\CBD1900611_D01_IMX8\Applications\SipAddon\StartApplication\Appl\Source路径下的StartApplication.c.BAK
2.手动还原C:\Vector\CBD1900611_D01_IMX8\Applications\SipAddon\StartApplication\Appl\Source路径下的vLinkGen_Template_Backup after moving to TCM and Modifying DDR address.ld
 

 initialization

1.Port Init 声明处理文件

2.初期化各个模块

 

 

Port配置

1.配置引脚功能

 

2.配置引脚参数

 

 

3.目前分配的引脚 

 

 

Dio配置

1.配置DIO用于程序设定引脚状态

 

2.添加Port

 

3.Port选择,GPIO 0 port共16个channel

 

4.channel设定

 

 

5.全部的channel设定

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值