AutoSAR CANIF层配置代码分析

CAN物理控制单元

   配置:

生成的代码:

CanIf_CtrlStates 解析

   类型:

typedef union CanIf_CtrlStatesUTag
{CanIf_CtrlStatesType raw[3];CanIf_CtrlStatesStructSType str;
}CanIf_CtrlStatesUType;typedef struct sCanIf_CtrlStatesType
{CanIf_ControllerModeType CtrlMode;CanIf_PduGetModeType PduMode;CanIf_NotifStatusType TxConfState;
}CanIf_CtrlStatesType;typedef struct CanIf_CtrlStatesStructSTag
{CanIf_CtrlStatesType ADSCAN;CanIf_CtrlStatesType BCAN;CanIf_CtrlStatesType PCAN;
}CanIf_CtrlStatesStructSType;

CAN控制器模式:

typedef enum 
{CANIF_CS_UNINIT = 0u,CANIF_CS_STOPPED,CANIF_CS_STARTED,CANIF_CS_SLEEP
} CanIf_ControllerModeType;

PDU模式:

     只允许在对应的控制器模式等于CAN_CS_STARTED时,更改PDU通道模式,在初始化期间,CanIf应该将每个通道切换到CANIF_OFFLINE。如果调用CanIf_SetControllerMode(),则CanIf会将对应通道的PDU通道模式设置为CANIF_OFFLINE。

     如果调用CanIf_SetControllerMode()或CanIf_ControllerBusOff(),则CanIf应将相应通道的PDU通道模式设置为CANIF_TX_OFFLINE。

    示意图:

发送状态:

typedef enum
{CANIF_NO_NOTIFICATION = 0u,CANIF_TX_RX_NOTIFICATION
} CanIf_NotifStatusType;

CanIf_TxPduConfig

typedef struct sCanIf_TxPduConfigType
{CanIf_UpperLayerTxPduIdOfTxPduConfigType UpperLayerTxPduId;uint16 CanId;boolean IsDataChecksumTxPdu;boolean IsTxPduTruncation;CanIf_ControllerType CtrlStatesIdx;uint8 MailBoxConfigIdx;CanIf_TxConfFctListIdxType TxConfirmationFctListIdx;uint8 TxPduLength;
}CanIf_TxPduConfigType;
  • CtrlStatesIdx: CAN控制器的通道

配置:

  • CanId: canid 有四种配置 扩展CAN 、标准CAN、扩展CANFD、标准CANFD。

  • IsDataChecksumTxPdu :数据校验

配置:

代码位置:

  • IsTxPduTruncation: 为TRUE时,配置最大长度。

上位机配置:

代码位置:

  • UpperLayerTxPduId: PDU 的ID

示例:

    

代码:

  • MailBoxConfigIdx :CANIF 信箱,后面介绍
  • TxConfirmationFctListIdx:CanIf_TxConfirmationFctList[]数组下标

发送确认回调函数

CONST(CanIf_TxConfirmationFctType, CANIF_VAR_NOINIT) CanIf_TxConfirmationFctList[2] = {CAN_NM_CanIfTxConfirmation,PDUR_CanIfTxConfirmation,
};
  • TxPduLength: 发送PDU长度

上位机配置:

CanIf_MailBoxConfig

   mailbox 涉及的数据结构挺多的,主要是CAN控制器发送的缓存buffer fifo之类的

CanIf_CanIfCtrlId2MappedTxBuffersConfig

 /* Get all HTHs with configured Tx-buffer of affected CAN-channel */for(idx2MappedTxBufferCfg = CanIf_CanIfCtrlId2MappedTxBuffersConfig[ControllerId].StartIdx;idx2MappedTxBufferCfg < CanIf_CanIfCtrlId2MappedTxBuffersConfig[ControllerId].EndIdx;idx2MappedTxBufferCfg++ )

从上面的代码可以得出,主要是为每个CAN控制器所配置的TX buffer

CONST(CanIf_CanIfCtrlId2MappedTxBuffersConfigType, CANIF_VAR_NOINIT) CanIf_CanIfCtrlId2MappedTxBuffersConfig[1] = {{ 3u, 0u },
};
typedef struct sCanIf_CanIfCtrlId2MappedTxBuffersConfigType
{uint8 EndIdx;uint8 StartIdx;
}CanIf_CanIfCtrlId2MappedTxBuffersConfigType;

CanIf_MappedTxBuffersConfig

hth = CanIf_MappedTxBuffersConfig[idx2MappedTxBufferCfg].MailBoxConfigIdx;typedef struct sCanIf_MappedTxBuffersConfigType
{uint8 MailBoxConfigIdx;
}CanIf_MappedTxBuffersConfigType;
CONST(CanIf_MappedTxBuffersConfigType, CANIF_VAR_NOINIT) CanIf_MappedTxBuffersConfig[3] = {{ 1u },{ 2u },{ 5u },
};

主要是此变量主要是去映射到CanIf_MailBoxConfig的配置。

CanIf_MailBoxConfig

定义:

 

typedef struct sCanIf_MailBoxConfigType
{uint8 CtrlStatesIdx;uint8 PduIdFirst;uint8 PduIdLast;uint8 TxBufferCfgIdx;uint8 TxBufferHandlingType;CanIf_MailBoxTypeType MailBoxType;
}CanIf_MailBoxConfigType;CONST(CanIf_MailBoxConfigType, CANIF_VAR_NOINIT) CanIf_MailBoxConfig[6] = {{ 0u, 0u, 1u, 255u,  CANIF_TXBUFFER_HANDLINGTYPE_NONE, CANIF_UnusedCANMailbox },{ 0u, 0u, 0u, 0u,  CANIF_TXBUFFER_HANDLINGTYPE_FIFO, CANIF_TxBasicCANMailbox },{ 1u, 0u, 0u, 2u,  CANIF_TXBUFFER_HANDLINGTYPE_FIFO, CANIF_TxBasicCANMailbox },{ 1u, 2u, 47u, 255u,  CANIF_TXBUFFER_HANDLINGTYPE_NONE, CANIF_UnusedCANMailbox },{ 2u, 49u, 50u, 255u,  CANIF_TXBUFFER_HANDLINGTYPE_NONE, CANIF_UnusedCANMailbox },{ 2u, 0u, 0u, 1u,  CANIF_TXBUFFER_HANDLINGTYPE_FIFO, CANIF_TxBasicCANMailbox },
};

这里面有个TxBufferCfgIdx,是CanIf_TxBufferFifoConfig的下标。

CanIf_TxBufferFifoConfig

  主要是TXBuffer位置的配置

typedef struct sCanIf_TxBufferFifoConfigType
{uint16 TxFifoQueueDataEndIdx;uint16 TxFifoQueueDataStartIdx;uint8 SizeOfOnePayloadEl;uint8 TxBufferFifoBaseIdx;uint16 TxFifoQueueBaseEndIdx;uint8 TxFifoQueueBaseLength;uint16 TxFifoQueueBaseStartIdx;
}CanIf_TxBufferFifoConfigType;CONST(CanIf_TxBufferFifoConfigType, CANIF_VAR_NOINIT) CanIf_TxBufferFifoConfig[3] = {{ 800u, 0u, 8u, 0u, 100u, 100u, 0u },{ 1600u, 800u, 8u, 1u, 200u, 100u, 100u },{ 2400u, 1600u, 8u, 2u, 300u, 100u, 200u },
};

    其中的8为单位递增单元,0、800、1600、为3个buff开始的位置,3个100 对应的是 800 除以8,TxFifoQueueBaseEndIdx的结构没有用到,与之对应的结构是CanIf_TxFifoQueueData。

    其中TxBufferFifoBaseIdx为 CanIf_TxBufferFifoBase.raw数组的下标。其中TxFifoQueueBaseLength 为100是上位机配置的:

   

CanIf_TxBufferFifoBase

typedef union CanIf_TxBufferFifoBaseUTag
{CanIf_TxBufferFifoBaseType raw[3];CanIf_TxBufferFifoBaseStructSType str;
}CanIf_TxBufferFifoBaseUType;

   在CanIf_ClearQueue函数中进行初始化的

switch (CanIf_MailBoxConfig[hth].TxBufferHandlingType){case CANIF_TXBUFFER_HANDLINGTYPE_FIFO:/* Clearing of FIFO */txBufferFifoBaseIdx = CanIf_TxBufferFifoConfig[txBufferCfgIdx].TxBufferFifoBaseIdx;/* Set ReadIdx, WriteIdx and QueueCounter to 0 */CanIf_TxBufferFifoBase.raw[txBufferFifoBaseIdx].eWriteIdx = 0;CanIf_TxBufferFifoBase.raw[txBufferFifoBaseIdx].eReadIdx = 0;CanIf_TxBufferFifoBase.raw[txBufferFifoBaseIdx].eQueueCounter = 0;break;default:break;}

CanIf_TxFifoQueueData 

typedef union CanIf_TxFifoQueueDataUTag
{uint8 raw[2400];CanIf_TxFifoQueueDataStructSType str;
}CanIf_TxFifoQueueDataUType;

CanIf_TransmitSubWrite API 介绍

 定义:

CANIF_LOCAL_INLINE FUNC(Std_ReturnType, CANIF_CODE) CanIf_TransmitSubWrite(P2CONST(Can_PduType, AUTOMATIC, AUTOMATIC) localPduPtr)

此函数传递的参数为PDU,数据结构为:

typedef struct Can_PduTypeTag
{Can_IdType id;uint8 length;Can_SduPtrType sdu;PduIdType swPduHandle;
} Can_PduType;

    此函数主要判断CAN控制器的模式是否使能,PDU是否使能,以及PDU的校验,之后调用CanIf_TransmitSubWrite 函数。

CanIf_TransmitSubWrite

      在此函数中判断此PDU的发送方式是否为FIFO,如果为FIFO则判断FIFO是否为空,为空则直接调用Can_Write().

相关代码:

if(CanIf_MailBoxConfig[CanIf_TxPduConfig[localPduPtr->swPduHandle].MailBoxConfigIdx].TxBufferHandlingType == CANIF_TXBUFFER_HANDLINGTYPE_FIFO){/* If Tx-PDU is mapped to Tx-buffer of handling type FIFO it must only be transmitted directly if FIFO is empty */doCanWrite = CanIf_TransmitSubCheckFiFoQueueEmpty(localPduPtr->swPduHandle);}if(doCanWrite == TRUE){//txResult = Can_Write((CanIf_HwHandleType)CanIf_TxPduConfig[localPduPtr->swPduHandle].MailBoxConfigIdx, (P2CONST(Can_PduType, AUTOMATIC, CANIF_VAR_STACK))localPduPtr);}

否则调用CanIf_TransmitSubHandleTxResBusy,缓存到队列 buffer中。

CanIf_TransmitSubHandleTxResBusy

   此函数主要是将PDU的数据拷贝到缓冲区,也就是TX buffer中。

/* Evaluate FIFO-WriteIdx */txFifoQueueBaseStartIdx = CanIf_TxBufferFifoConfig[txBufferCfgIdx].TxFifoQueueBaseStartIdx;writeIdx = CanIf_TxBufferFifoBase.raw[txBufferFifoBaseIdx].eWriteIdx;/* Store length of Tx-PDU at FIFO-WriteIdx */CanIf_TxFifoQueueBase.raw[writeIdx + txFifoQueueBaseStartIdx].eBaseParams.eSduLength = localPduPtr->length;/* Store the PDU ID of the Tx-PDU at FIFO-WriteIdx */CanIf_TxFifoQueueBase.raw[writeIdx + txFifoQueueBaseStartIdx].eTxPduId = localPduPtr->swPduHandle;

其中txFifoQueueBaseStartIdx为0,100,200 乘以8 就是每个buff开始写的位置。0,800,1600.

后面的是用CanIf_TxFifoQueueBase保存PDU的长度和PDU 的ID。

queueDataStartIdx = ((uint32_least)writeIdx * (uint32_least)CanIf_TxBufferFifoConfig[txBufferCfgIdx].SizeOfOnePayloadEl) + CanIf_TxBufferFifoConfig[txBufferCfgIdx].TxFifoQueueDataStartIdx;/* Store data of Tx-PDU at FIFO-WriteIdx */memcpy(&CanIf_TxFifoQueueData.raw[queueDataStartIdx], localPduPtr->sdu, localPduPtr->length);/* Increment the FIFO-counter */CanIf_TxBufferFifoBase.raw[txBufferFifoBaseIdx].eQueueCounter++;

将PDU的数据拷贝的缓冲区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陪诊系统搭建部署和功能,让就医更便捷和舒适

陪诊系统是一种基于智能手机平台的专门为就医提供陪伴服务的软件。该应用程序包含多种功能&#xff0c;包括提供的医疗知识、行为规范和陪伴服务。它不仅可以帮助用户规划就医时间、预约医生、清楚病情、解答疑问等&#xff0c;还可以在就医时为用户提供实时的陪伴和指导&#…

论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models

Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型&#xff0c;擅长将文本输入转换为数字表示&#xff0c;捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发&#xff0c;从创建高质量的成对&#xff08;pairwi…

WEB 自动化神器 TestCafe(一)—安装和入门篇

今天小编给大家带来WEB 自动化神器 TestCafe(一) —安装和入门篇 一、TestCafe 介绍&#xff1a; TestCafe 是一款基于 Node.js 的端到端 Web 自动化测试框架&#xff0c;支持 TypeScript 或 JavaScript 来编写测试用例&#xff0c;运行用例&#xff0c;并生成自动化测试报告。…

Navicat DML 操作

在表格种插入 列信息 -- 修改数据 update 表名 set 列名 值1, 列名值2,[where 条件]; -- 注意&#xff1a;如果update语句没有加where 表里对应行的全部信息都会被改; -- 删除数据 delecte from 表名 [where 条件]; 未删除前&#xff1a; 执行删除后为&#xff1a; DQL - 条…

【已解决】移动号码在移动网上营业厅更换为8元保号套餐

有很多人的副卡基本是为了接收银行卡短信&#xff0c;平时基本不打电话和用流量&#xff0c;每个月固定消费在18-30左右&#xff0c;很浪费。今天发现在网上营业厅就可以修改8元保号套餐&#xff0c;分享给大家。 保号套餐 有以下两种&#xff1a; 解决办法&#xff1a; 1、…

1688API接口接入|阿里1688-B类电商基础链路专业化体验升级

新挑战&#xff0c;新契机&#xff01; 当下整个互联网的竞争环境的变化为我们带来新的机遇和挑战。1688作为连接中小生产商、贸易商和零售商的源头货源首选平台&#xff0c;持续不断地为B类买家提供更专业的服务和更优质的源头厂货供给&#xff0c;打造核心竞争力。 面对新的…

客户端性能优化实践

背景 双十一大促时&#xff0c;客户客服那边反馈商品信息加载卡顿&#xff0c;在不断有订单咨询时&#xff0c;甚至出现了商品信息一直处于加载状态的情况&#xff0c;显然&#xff0c;在这种高峰期接待客户时&#xff0c;是没法进行正常的接待工作的。 起初&#xff0c;页面一…

计算机视觉与机器学习D1

计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有&#xff1a; 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力&#xff1b;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…

客服中心的客户关系管理核心功能

根据国外的调查&#xff0c;拥有客服中心的运营机构&#xff0c;可以保持85%左右的客户忠诚度&#xff0c;而接受过专业培训的客户中心可以将客户忠诚度提高到99%。客服中心作为客户关系管理的前沿&#xff0c;通过提供服务、实时沟通、搜集与分析客户信息、预测客户需求来提升…

数据结构与算法-生成树与最小生成树

生成树与最小生成树 &#x1f388;1.生成树与最小生成树&#x1f52d;1.1生成树与最小生成树的概念&#x1f52d;1.2最小生成树的生成准则&#x1f52d;1.3两种最小生成树算法&#x1f3c6;1.3.1Kruskal算法&#x1f3c6;1.3.2Prim算法 &#x1f388;2.有向无环图及其应用&…

virtuoso 后仿 ADE L error

ADE后仿时出现error ERROR (SFE-23): "input.scs" 299: The instance _57_D32_noxref is referencing an undefined model or subcircuit, parasitic_nwd. Either include the file containing the definition of parasitic_nwd, or define parasitic_nwd before run…

iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端

根据苹果网站上介绍&#xff0c;bash是 macOS Mojave 及更早版本中的默认Shell&#xff0c;从 macOS Catalina 开始&#xff0c;zsh(Z shell) 是所有新建用户帐户的默认Shell。 1. 安装Oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzs…

选择java商城开发商需要注意哪些方面?

Java商城开发是一项庞大而复杂的任务&#xff0c;选择一家合适的开发商至关重要。那么&#xff0c;我们在选择Java商城开发商时&#xff0c;需要注意哪些方面呢&#xff1f; 1、专业经验 选择具有丰富经验的开发商是至关重要的。开发商应该拥有多年的Java开发经验&#xff0c;…

【MATLAB源码-第82期】基于matlab的OFDM系统载波频移偏差(CFO)估计,对比三种不同的方法。

操作环境&#xff1a; MATLAB 2013b 1、算法描述 正交频分复用&#xff08;OFDM&#xff09;系统中的载波频率偏移&#xff08;CFO&#xff09;估计是一项关键技术&#xff0c;用于确保数据传输的准确性和效率。CFO通常由于振荡器频率不匹配和多普勒频移引起。不同的CFO估计…

DP1332E/DP1363F国产多协议NFC读写器芯片支持ISO15693/ISO18092

目录 ISO/IEC 15693与ISO/IEC 18092协议标准差异DP1363F与DP1332E对比共同点主要差异点 ISO/IEC 15693与ISO/IEC 18092协议标准差异 ISO/IEC 15693是用于近距离无线通信中的射频识别&#xff08;RFID&#xff09;技术的标准协议&#xff0c;它定义了与读写器之间的通信协议。这…

LeetCode热题100——图论

图论 1. 岛屿的数量2. 腐烂的橘子 1. 岛屿的数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆…

微信、支付宝、携程等多款app任意文件读取漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞描述 微信、支付宝、小米浏览器、携程应用等国内主流软件均存…

C编译环境和预处理(非常详细,建议收藏)

C编译环境和预处理&#xff08;非常详细&#xff0c;建议收藏&#xff09; 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么&#xff1f; 2.2 运行环境 三、预处理详解3.1 预定义…

斐波那契数列,剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff08;动态规划&#xff09;&#xff1a; 代码实现&#xff1a; 补充说明&#xff1a; 代码&#xff08;优化&#xff09;&…