关键词
嵌入式、C语言、autosar
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | EB |
芯片厂商 | 英飞凌 TC397 |
编程语言 | C,C++ |
编译器 | TASKING |
一、背景
在一个项目中,会从多个外部ECU或者sensor通过can总线接收大量的object,在应用层中对这些object进行处理和使用。
二、问题现象
CAN 通讯占用了大量的CPU资源。
三、原因
CAN->CANIF->PDUR->COM->RTE->ASW memory
copy了多次,浪费了大量的cpu资源。
四、解决办法
在can if 上层创建一个CDD,对数据进行打包后通过DMA传到ASW使用。
五、实现
对external ECU 的can通讯重新调整,依据循环帧ID 越大优先级越低或者其他标志位,判定收到的object完整后进行打包。
5.1 配置
5.2 code
该代码基于EB工具链生成,Vector工具链生成的代码略有区别,请自行区分。
Sdc_CoreConfigPtr->CanControllerMsgRAMMapConfigPtr[3].CanControllerMsgRAMMap[CAN_17_MCMCAN_RBSA];/*找到canbuffer*/
CONST( CanIf_CbkFctPtrTblType, CANIF_APPL_CONST ) CanIf_CbkFctPtrTbl[] =
{
{
/* PDUR */
&PduR_CanIfRxIndication,
&PduR_CanIfTxConfirmation,
},
{
/* CAN_TP */
&CanTp_RxIndication,
&CanTp_TxConfirmation,
},
{
/* CDD */
&Xcp_CanIfRxIndication,
&Xcp_CanIfTxConfirmation,
},
{
/* CAN_TSYN */
&CanTSyn_RxIndication,
&CanTSyn_TxConfirmation,
},
{
/* CAN_NM */
&CanNm_RxIndication,
&CanNm_TxConfirmation,
},
{
/* uerdefien */
&uerdefine_CanRxIndication,/*函数内部用户实现*/
NULL_PTR,
},
};
用户代码请根据自身需求修改和实现。