当前位置: 首页 > news >正文

[AutoSar]BSW_Com07 CAN报文接收流程的函数调用

目录

  • 关键词
  • 平台说明
  • 一、背景
  • 二、顺序总览
  • 三、函数说明
    • 3.1 Com_RxIndication()

  

关键词

嵌入式、C语言、autosar、OS、BSW

平台说明

项目Value
OSautosar OS
autosar厂商vector ,
芯片厂商TI 英飞凌
编程语言C,C++
编译器HighTec (GCC)
autosar版本4.3.1

在这里插入图片描述
>>>>>回到总目录<<<<<<

一、背景

  介绍了一个信号如何从底层传输到应用层的函数调用。note:该报文类型为应用报文
处理方式为轮询模式

二、顺序总览

  
在这里插入图片描述
  1.因为CAN_RX_PROCESSING is set to POLLING,中断模式的情况后续更新.所以由BSW 轮询调度Can_MainFunction_Read()。Can_MainFunction_Read()会获取can 控制器中的寄存器数据。它会查询当前所有MO或接收报文邮箱是否有报文被成功接收,如果有,则调用
CanIf_RxIndication 函数来向上层(PDUR)通知有报文被接收。一直通知到COM层。
  2.到了COM之后进行解包,APP 通过RTE_read_XX–>Com_ReceiveSignal() 从COM中获取数据。
  
  
  
  

三、函数说明

3.1 Com_RxIndication()

对数据进行解包。在这里插入图片描述

FUNC(void, COM_CODE) Com_RxIndication(PduIdType RxPduId, P2CONST(PduInfoType, AUTOMATIC, COM_APPL_DATA) PduInfoPtr)
{
(void) Com_RxIndication_Processing((Com_RxPduInfoIterType) RxPduId, PduInfoPtr);
}
FUNC(boolean, COM_CODE) Com_RxIndication_Processing(Com_RxPduInfoIterType rxPduId, P2CONST(PduInfoType, AUTOMATIC, COM_APPL_DATA) PduInfoPtr)
{Com_RxIndication_ProcessPdu(rxPduId, &PduInfoLocal);      /* SBSW_COM_FCTCALL_WITH_P2CONST */
}
COM_LOCAL_INLINE FUNC(void, COM_CODE) Com_RxIndication_ProcessPdu(Com_RxPduInfoIterType comRxPduInfoIdx, P2CONST(PduInfoType, AUTOMATIC, COM_APPL_DATA) PduInfoPtr)
{
# if (COM_EXISTS_DEFERRED_SIGNALPROCESSINGOFRXPDUINFO == STD_ON)/* #10 If the passed Rx ComIPdu is handled deferred */if(Com_IsHandleRxPduDeferredUsedOfRxPduInfo(comRxPduInfoIdx)) /* COV_COM_FEATURE_ALWAYS_TRUE_TX */{SchM_Enter_Com_COM_EXCLUSIVE_AREA_RX();
#  if (COM_RXDEFPDUBUFFERUSEDOFRXPDUINFO == STD_ON)switch (Com_GetTypeOfRxPduInfo(comRxPduInfoIdx)){
#   if(COM_EXISTS_NORMAL_TYPEOFRXPDUINFO == STD_ON)case COM_NORMAL_TYPEOFRXPDUINFO:/* #20 If the passed Rx ComIPdu is not a TP Pdu and no NULL_PTR, copy the passed Sdu data to the deferred Pdu buffer */if(PduInfoPtr->SduDataPtr != NULL_PTR){if(Com_IsRxDefPduBufferUsedOfRxPduInfo(comRxPduInfoIdx))      /* COV_COM_CSL03_ISUSED_OPTIONAL_INDIRECTION */{Com_RxDefPduBufferLengthOfRxPduInfoType numberOfBytes =((Com_GetRxDefPduBufferLengthOfRxPduInfo(comRxPduInfoIdx)) >PduInfoPtr->SduLength) ? (Com_RxDefPduBufferLengthOfRxPduInfoType) (PduInfoPtr->SduLength) : Com_GetRxDefPduBufferLengthOfRxPduInfo(comRxPduInfoIdx);VStdMemCpyRamToRam(Com_GetAddrRxDefPduBuffer(Com_GetRxDefPduBufferStartIdxOfRxPduInfo(comRxPduInfoIdx)), (P2CONST(uint8, AUTOMATIC, COM_APPL_DATA)) PduInfoPtr->SduDataPtr, numberOfBytes); /* PRQA S 0315 */ /* MD_MSR_VStdLibCopy */ /* SBSW_COM_MEM_CPY_2RAM */}}break;
#   endif
#   if(COM_RXTPINFOUSEDOFRXPDUINFO == STD_ON)case COM_TP_TYPEOFRXPDUINFO:break;
#   endifdefault: /* COV_COM_MISRA */break;}
#  endif
#  if (COM_RXDEFERREDEVENTCACHE == STD_ON)/* #30 If the passed ComIPdu is not cached yet, add the Rx ComIPdu to the deferred event cache */if(Com_GetHandleRxPduDeferred(Com_GetHandleRxPduDeferredIdxOfRxPduInfo(comRxPduInfoIdx)) == 0u)     /* COV_COM_RXDEFERRED_PROCESSING */{Com_RxIndication_CacheDeferredEvent(comRxPduInfoIdx);}
#  endif/* #40 Store the passed Sdu length in the handle deferred buffer */Com_SetHandleRxPduDeferred(Com_GetHandleRxPduDeferredIdxOfRxPduInfo(comRxPduInfoIdx), (PduInfoPtr->SduLength + 1u));        /* SBSW_COM_CSL03 */
#  if(COM_GWEVENTCACHE == STD_ON)Com_RxIndication_CacheDeferredDescriptionGwEvent(comRxPduInfoIdx);
#  endifSchM_Exit_Com_COM_EXCLUSIVE_AREA_RX();}
# endif
# if ((COM_EXISTS_DEFERRED_SIGNALPROCESSINGOFRXPDUINFO == STD_ON) && (COM_EXISTS_IMMEDIATE_SIGNALPROCESSINGOFRXPDUINFO == STD_ON))else
# endif
# if (COM_EXISTS_IMMEDIATE_SIGNALPROCESSINGOFRXPDUINFO == STD_ON)/* #50 Otherwise process the Rx ComIPdu immediate */{FctPtrCacheStrct immediateFctPtrCacheStrct;#  if (COM_RXIMMEDIATEFCTPTRCACHE == STD_ON)uint32 fctPtrCache[COM_RXIMMEDIATEFCTPTRCACHESIZE];immediateFctPtrCacheStrct.ptrToCache = fctPtrCache;immediateFctPtrCacheStrct.cacheSize = COM_RXIMMEDIATEFCTPTRCACHESIZE;immediateFctPtrCacheStrct.cacheIndex = 0;
#  elseimmediateFctPtrCacheStrct.ptrToCache = NULL_PTR;immediateFctPtrCacheStrct.cacheSize = 0;immediateFctPtrCacheStrct.cacheIndex = 0;
#  endifSchM_Enter_Com_COM_EXCLUSIVE_AREA_RX();
#  if (COM_RXSIGINFOENDIDXOFRXPDUINFO == STD_ON)/* #60 Do Rx ComSignal processing */Com_RxProcessing_RxPduSigEvent(comRxPduInfoIdx, PduInfoPtr, &immediateFctPtrCacheStrct);    /* SBSW_COM_FCTCALL_WITH_P2CONST_AND_FCTPTR_CACHE_PTR_1 */
#  endif
#  if (COM_RXSIGGRPINFOINDENDIDXOFRXPDUINFO == STD_ON)/* #70 Do Rx ComSignalGroup processing */Com_RxProcessing_RxPduSigGrpEvent(comRxPduInfoIdx, PduInfoPtr, &immediateFctPtrCacheStrct); /* SBSW_COM_FCTCALL_WITH_P2CONST_AND_FCTPTR_CACHE_PTR_1 */
#  endif
#  if (COM_GWTXPDUDESCRIPTIONINFOUSEDOFRXPDUINFO == STD_ON)/* #75 If rxPdu has any configured GwDescriptions, do gateway description processing */if(Com_IsGwTxPduDescriptionInfoUsedOfRxPduInfo(comRxPduInfoIdx))    /* COV_COM_FEATURE_ALWAYS_TRUE_TX */{SchM_Enter_Com_COM_EXCLUSIVE_AREA_TX();Com_GwDescriptionEvent(comRxPduInfoIdx,      /* SBSW_COM_FCTCALL_WITH_P2CONST */PduInfoPtr, FALSE);SchM_Exit_Com_COM_EXCLUSIVE_AREA_TX();}
#  endif#  if (COM_RXTOUTINFOUSEDOFRXPDUINFO == STD_ON)/* #80 If the passed Rx ComIPdu has a timeout, remove the timeout occurred flag */if(Com_IsRxTOutInfoUsedOfRxPduInfo(comRxPduInfoIdx))        /* COV_COM_FEATURE_ALWAYS_TRUE_TX */{Com_LMgt_RemoveOccurredFlag(Com_GetRxTOutInfoIdxOfRxPduInfo(comRxPduInfoIdx));    /* SBSW_COM_CSL02_CSL03 */}
#  endifSchM_Exit_Com_COM_EXCLUSIVE_AREA_RX();#  if (COM_RXIMMEDIATEFCTPTRCACHE == STD_ON)/* #90 Call all cached notification or invalid notifications and clear the immediate function pointer cache */Com_ProcessRxFctPtrCache(&immediateFctPtrCacheStrct);       /* SBSW_COM_FCTPTR_CACHE_PTR_1 */
#  endifCOM_DUMMY_STATEMENT(immediateFctPtrCacheStrct);     /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */ /* lint -e{438} */}     /* Immediate signal processing */
# endif
}       /* PRQA S 6050 */ /* MD_MSR_STCAL */
#endif
}

在这里插入图片描述
>>>>>回到总目录<<<<<<

相关文章:

  • MySQL 表的基本操作,结合项目的表自动初始化来讲
  • 详解字符串函数<string.h>(上)
  • 【学习记录】Resnet
  • 回溯 Leetcode 47 全排列II
  • SpringBoot接收参数的几种形式
  • docker (十二)-私有仓库
  • go垃圾回收
  • c++入门(2)
  • 代码随想录算法训练营第四十七天|198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III。
  • VR虚拟现实技术应用到猪抗原体检测的好处
  • 蓝桥杯第十四届电子类单片机组决赛程序设计
  • MySql安全加固:可信IP地址访问控制 设置密码复杂度
  • 蓝桥杯 信号覆盖
  • 安装 git 与查看 version
  • LeetCode #104 二叉树的最大深度
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CODING 缺陷管理功能正式开始公测
  • ECS应用管理最佳实践
  • Git 使用集
  • HTTP中的ETag在移动客户端的应用
  • IOS评论框不贴底(ios12新bug)
  • Just for fun——迅速写完快速排序
  • mac修复ab及siege安装
  • TCP拥塞控制
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 爱情 北京女病人
  • 老板让我十分钟上手nx-admin
  • 前端存储 - localStorage
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 网页视频流m3u8/ts视频下载
  • 赢得Docker挑战最佳实践
  • 2017年360最后一道编程题
  • Linux权限管理(week1_day5)--技术流ken
  • 通过调用文摘列表API获取文摘
  • ​MySQL主从复制一致性检测
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (arch)linux 转换文件编码格式
  • (C)一些题4
  • (Oracle)SQL优化技巧(一):分页查询
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (力扣)循环队列的实现与详解(C语言)
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ./configure,make,make install的作用
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Winform开发笔记(一)
  • .net/c# memcached 获取所有缓存键(keys)