简介
AUTOSAR多核操作系统提供了IOC(Inter-OS-Application Communication)的通讯方式来保证核间数据读写的一致性。与核内SWCs间的通信不同(RTE实现),IOC是由OS实现的。OS Application在读或写时一般会获取Spinlock,以防止其他OS Application操作数据而导致的数据不一致。需要注意的是,核内的SWCs或者BSW模块间的通信不能走IOC,因为这会降低CPU的效率。同时假如不是所有的sender/recevier的SWCs或BSW在同一个OS Application上,那么就应该用IOC的方式进行通信!
功能介绍
IOC只提供sender/receiver的通信方式,RTE会将client-server的请求和应答转换为sender/receiver通信。IOC支持1:1、N:1和N:M(非队列)的通信方式。通信的数据类型既可以是基础数据类型也可以是复杂数据类型。在多核单片机中,IOC还提供了Notification功能,这样接收方就可以更快速的知道数据可用了。通用的通知方式是触发接收方的2类中断来告知。同一个IOC的Api函数可以被同一个SWC的不同runnable调用,但是假如被不同任务调用时需要小心了,用户必须确保IOC Api在返回前不会被另一个任务调用,因为IOC函数是不可重入的,这种情况可能导致Spinlock的死锁(死锁问题见AUTOSAR OS之Resource和Spinlock)!
通信实例
1 1:1 sender/receiver不带Notification的通信
在上边的例子中,发送方把数据写到接收方可以读取的共享内存中。发送方生成的RTE接口为:
Rte_Send_<port>_<item> (..., <data>)
接收方生成的RTE接口为
Rte_Receive_<port>_<item> (..., <data>)
这种通信方式适用于:1 SWC间的Sender/Receiver通信;2 队列或非队列通信;3 1:1通信。
2 N:1 client/server带有Notification的通信
当数据写入IOC内部数据缓存后,Rte函数调用OS的服务来激活接收任务。这种通信方式适用于:1 带Notification的SWC间的Sender/receiver通信;2 Client/server通信。3 队列或非队列通信;4 非polling模式的1:1通信;5 N:1通信。
IOC使用注意事项
当多个核在同一段时间都去访问核间通讯的数据时,由于Spinlock的存在,按照先后顺序访问,后访问的任务就会一直忙等待,假如数据量很大,而访问这个数据的周期又短,这就会导致CPU负载急剧增大。因此对于多核单片机,资源分配一定要做好,尽量要减少核间通信!
伪代码实现
1 IOC数据通信为基本数据类型(原子操作)
由于是基本数据类型,此时数据的读写一条指令就可以完成,因此此时IOC生成的Rte接口不含有任何Spinlock。如:
#define IocWrite_Rte_Rx_000038(value) (Os_Ioc_Rte_Rx_000038 = (uint8)value, IOC_E_OK)
#define IocRead_Rte_Rx_000038(value) (*value = Os_Ioc_Rte_Rx_000038, IOC_E_OK)
2 IOC数据通信为复杂数据类型
此时应该加上Spinlock保证数据一致性。
Std_ReturnType IocRead_Rte_Rx_000000(struct complex_type* value)
{
Os_IocLock(ConfigPtr);/*获取Spinlock*/
*value = Os_Ioc_Rte_Rx_000000;
Os_IocUnlock(ConfigPtr);/*释放Spinlock*/
return E_OK;
}
3 带Notification的核间通信