Autosar Xcp移植

2023-05-16

前言:
可能有兄弟胸中有点疑问, Vector ETAS等软件包都有XCP,你移植个吊,但是我的MICORSAR BSW中没发现XCP静态代码,倒是在CFG中发现了XCP配置选项,难道这部分代码全是动态生成?
好吧,不论如何现在也不知道怎么在工具里配置XCP,先移植Vector Xcp Basic, 顺便读下代码, 加深一下理解。这个软件包大家可以在网上找找,或者Vector官网找找, 免费的,可以满足基本的标定/测量需求。
本篇文章的主要目的是从配置和代码角度学习一下XCP协议,至于能否直接用于项目请君自行斟酌。
首先说明我们配置的是Xcp on CAN, 所以必须你的MCU要能收发标准CAN消息,当然只要你搞清楚了移植步骤,之后迁移到Xcp on CAN FD 或者 on Tcp/ip都是可以的。
Mcu 的CanDrv 至少要提供像CanTransmit(Canid, DLC, void * data)这样的函数, CAN接收到的MSG 需要传入XcpCommand((vuint32*)&XcpRequest[0])进行处理;所以即使你是STM32+FreeRtos这样的组合也是可以移植Xcp协议的。

  • 环境 硬件->NXP S32K148EVB 软件->Vector Davinci套件
  • 工具配置
    所以我们先新建立一个工程, 命名为XcpDemo, 我们把工程中BSW部分,MCAL部分都已经配置好了,我们这里只讨论如何添加Xcp这一个模块。
    我们首先要改下DBC文件,这样导入CFG中就能生成基本的通信配置
BU_: INCA MyECU


BO_ 1920 XcpResponse: 8 MyECU
 SG_ XcpRes : 0|64@1+ (1,0) [0|1.84467440737096E+019] ""  INCA

BO_ 1888 XcpRequest: 8 INCA
 SG_ XcpReq : 0|64@1+ (1,0) [0|1.84467440737096E+019] ""  MyECU

通过CANdb++添加如下两个Nodes, Msgs, Sigs CANID Master -> Slave 0x760
Slave->Master 0x780 两帧MSG各包含一个Signal SG_XcpRes和SG_XcpReq, 都占8Bytes。
打开Developer

在这里插入图片描述
新建如图所示两个SWCs 其中TestSWC是用来对标定和测量变量做测试的,内容如下。

#include "Dio.h"

#pragma default_variable_attributes = @ ".caliConst_Ram"

static uint16 cali_test1 = 3000;

#pragma default_variable_attributes =

#pragma default_variable_attributes = @ ".monitorRam"

static uint8 moni_u8 = 3;
static uint16 moni_u16 = 0;
static float32 moni_float = 1.2F;
static uint32 moni_u32 = 0;

#pragma default_variable_attributes = 
FUNC(void, TestSWC_CODE) Runnable_Test(void) /* PRQA S 0850 */ /* MD_MSR_19.8 */
{
/**********************************************************************************************************************
 * DO NOT CHANGE THIS COMMENT!           << Start of runnable implementation >>             DO NOT CHANGE THIS COMMENT!
 * Symbol: Runnable_Test
 *********************************************************************************************************************/
    if(cali_test1 > 3000){
        LedOn();
    }else{
        LedOff();
    }
    if(moni_u8 >= 255){
        moni_u8 = 0;
    }
    if(moni_u16 >= 255){
        moni_u16 = 0;
    }
    if(moni_u32 > 1000){
        moni_u32 = 0;
    }
    if(moni_float > 100.0F){
        moni_float = 0.0F;
    }

    moni_u8++;
    moni_u16++;
    moni_u32++;
    moni_float = moni_float + 1.0F;
/**********************************************************************************************************************
 * DO NOT CHANGE THIS COMMENT!           << End of runnable implementation >>               DO NOT CHANGE THIS COMMENT!
 *********************************************************************************************************************/
}

可以看到我们定义了一个标定变量和四个观测变量(后面自己手动加上去的,如果用Simulink自动生成代码的话,可以将标定和测量变量都生成到同一个文件), 至于"#pragma default_variable_attributes = .monitorRam" 是IAR编译器特定的宏,同时需要修改链接文件.icf,定义flash和ram分区, 将标定和观测变量放到自己的分区中去,这里不展开讨论。
XcpIf这个SWC是Xcp接口
在这里插入图片描述在XcpIf 中定义3个Runable 它们的Trigger 分别为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于Xcp需要使用BSW中ComM的接口, 所以需要定义一个Service Port, 并引用默认存在的ComM接口(C/S类型)
在这里插入图片描述
同时定义两个引用S/RInterface 的端口(Pport 向外发送Xcp Response, Rp 接收Tester发送的Xcp Request)
在这里插入图片描述
将两个SWC拖入ECU_Compoment中, 将XcpIf 的两个端口右键
在这里插入图片描述
在这里插入图片描述
代表这两个端口不做内部连接, 而是需要和外部其他ECU进行Sender/Reciver交互的, Rte 会自动识别并将这个两个Port的Read/Write操作转化为Com_ReadSignal/Com_SendSignal, 当然既然是Signal还有做DataMapping
在这里插入图片描述
这是Mapping好的Port中的Data Element 和对应的CAN Signal
在这里插入图片描述
想要RTE生成正确的代码还需要再CFG中将SWC和内部BSW建立连接
才能生成如下代码

#  define Rte_Read_Rp_XcpRequest_De_XcpRequest Rte_Read_XcpIf_Rp_XcpRequest_De_XcpRequest
#  define Rte_Read_XcpIf_Rp_XcpRequest_De_XcpRequest(data) (Com_ReceiveSignal(ComConf_ComSignal_XcpReq_oXcpRequest_oCAN_42940af5_Rx, (data))) /* PRQA S 3453 */ /* MD_MSR_19.7 */
#  define Rte_Call_ComM_UserRequest_RequestComMode(arg1) (ComM_RequestComMode((ComM_UserHandleType)0, arg1)) /* PRQA S 3453 */ /* MD_MSR_19.7 */

XcpDAQHandler为DAQ功能周期发送DTO,触发周期为1ms, 但是上位机可以通过Prescaler分别控制每个DAQList的上传周期。比如DAQList0->Prescaler = 10,那么XcpDAQHandler里会对DAQList0->Prescaler自减, 当其为0才真正通过CAN将DTO发送出去。
XcpRxHandler 触发为接收到ID 为0X760(Master->Slave)MSG

FUNC(void, RTE_CODE) Rte_COMCbk_XcpReq_oXcpRequest_oCAN_42940af5_Rx(void) /* PRQA S 0850 */ /* MD_MSR_19.8 */
{

  if (Rte_InitState == RTE_STATE_INIT)
  {
    /* scheduled trigger for runnables: XcpRxHandler */
    (void)SetEvent(OsTask_Xcp, Rte_Ev_Run_XcpIf_XcpRxHandler); /* PRQA S 3417 */ /* MD_Rte_Os */
  }
} /* PRQA S 6010, 6050 */ /* MD_MSR_STPTH, MD_MSR_STCAL */

可以看到这个CallBack是RTE自动生成的,会在CAN控制器接收到0x760消息的回调函数里进行匹配和逐级调用
XcpIfInit是协议初始化
在这里插入图片描述
3个Runables 需要Map到Task中去才能运行起来

TASK(OsTask_Xcp) /* PRQA S 3408, 1503 */ /* MD_Rte_3408, MD_MSR_14.1 */
{
  EventMaskType ev;


  /* call runnable */
  XcpIfInit();

  for(;;)
  {
    (void)WaitEvent(Rte_Ev_Run_XcpIf_XcpDAQHandler | Rte_Ev_Run_XcpIf_XcpRxHandler); /* PRQA S 3417 */ /* MD_Rte_Os */
    (void)GetEvent(OsTask_Xcp, &ev); /* PRQA S 3417 */ /* MD_Rte_Os */
    (void)ClearEvent(ev & (Rte_Ev_Run_XcpIf_XcpDAQHandler | Rte_Ev_Run_XcpIf_XcpRxHandler)); /* PRQA S 3417 */ /* MD_Rte_Os */

    if ((ev & Rte_Ev_Run_XcpIf_XcpDAQHandler) != (EventMaskType)0)
    {
      /* call runnable */
      XcpDAQHandler();
    }

    if ((ev & Rte_Ev_Run_XcpIf_XcpRxHandler) != (EventMaskType)0)
    {
      /* call runnable */
      XcpRxHandler();
    }
  }
} /* PRQA S 6010, 60

在生成的XcpIf模板中进行代码编写

FUNC(void, XcpIf_CODE) XcpDAQHandler(void) /* PRQA S 0850 */ /* MD_MSR_19.8 */
{
    uint8 i = 0;
    for (i = 0; i < xcp.Daq.DaqCount; i++)
    {
        vuint8 event = xcp.Daq.u.DaqList[i].eventChannel;
        XcpEvent(event);
    }
}
FUNC(void, XcpIf_CODE) XcpIfInit(void) /* PRQA S 0850 */ /* MD_MSR_19.8 */
{
    Rte_Call_ComM_UserRequest_RequestComMode(COMM_FULL_COMMUNICATION);
    XcpInit();
}

FUNC(void, XcpIf_CODE) XcpRxHandler(void) /* PRQA S 0850 */ /* MD_MSR_19.8 */
{
    uint8 XcpRequest[8] = {0};
    Rte_Read_Rp_XcpRequest_De_XcpRequest(XcpRequest); /*将CMD读到XcpRequest中*/
    XcpCommand((vuint32*)&XcpRequest[0]);
}
对三个Runable进行代码添加
其中XcpCommand XcpInit xcp.Daq.u.DaqList 等都是在Vector 提供的XcpBaic 代码包中定义和实现的,这里只需正确使用。
#include "Appl_Cbk.h"
#include "CanIf.h"
#include "XcpBasic.h"
#include "Os.h"

这是XcpIf.c 自己添加的头文件

#define XCP_RESPONSE_CANIF_PDUID 0
static vuint8 xcpResourceMask = 0;

void Xcp_Cbk_XcpResponseTxSuccess(void)
{
    XcpSendCallBack();
}

void ApplXcpSend( vuint8 len, BYTEPTR msg )
{
    PduInfoType PduInfoPtr;
    if(len > 8){
      len = 8;
    }
    PduInfoPtr.SduLength = len;
    PduInfoPtr.SduDataPtr = msg;
    CanIf_Transmit(XCP_RESPONSE_CANIF_PDUID, &PduInfoPtr);
}

void ApplXcpSendFlush(void)
{
  
}

void ApplXcpInit()
{

}

vuint8 ApplXcpGetSeed( vuint8 resourceMask, vuint8 *seed )
{
  /*RM_CAL_PAG|RM_DAQ|RM_PGM|RM_STIM 可分别返回不同SEED*/
  xcpResourceMask = resourceMask;
  seed[0] = 0;
  seed[1] = 1;
  seed[2] = 2;
  seed[3] = 3;
  seed[4] = 4;
  seed[5] = 5;
  return 6;
}

vuint8 ApplXcpUnlock( const vuint8 * key, vuint8 length )
{
  /* Ckeck the key */
  if((length == 2) && (key[0] == 0xBE) && (key[1] == 0xEF)){
    xcp.ProtectionStatus &= ~xcpResourceMask; /* Reset the appropriate resource protection mask bit */
    return 1;
  }else{
    return 0; /*Key not correct*/
  }
}

MTABYTEPTR ApplXcpGetPointer( vuint8 addr_ext, vuint32 addr ) {

  addr_ext = addr_ext;
  // /*S32K为小端格式*/
  // vuint32 new_addr = ( ((addr & 0XFF000000) >> 24)  | ((addr & 0X00FF0000) >> 8) |
  //                     ((addr & 0X0000FF00) << 8) | ((addr & 0X000000FF) << 24));
  /*如果上位机默认按小端格式传输则下位机无需更改字节序*/
  return (MTABYTEPTR)addr;
}

void ApplXcpInterruptDisable()
{
  SuspendAllInterrupts();
}

void ApplXcpInterruptEnable( void )
{
  ResumeAllInterrupts();
}

ApplXcpSend 这一类函数都是在XcpBasic.h中申明,但是没有具体实现,需要用户自己实现的函数,它们只在Xcp协议内部使用,大家可以参考代码包中的例程。
这里说下为啥ApplXcpSend 调用CanIf_Transmit 而不是之前生成的
Rte_Write_XcpIf_Pp_XcpResponse_De_XcpResponse(uint64 data);
因为这个函数实际会调用Com_SendSignal , 如果发送Response走Com->PduR->CanIf->CanDrv
的话Com中的Signal DLC是事先定好的,比如8Bytes那么每次都会发8Bytes,而Xcp Response 是需要根据不同响应动态改变DLC的,且Com发送PDU是有Periodic 和 Trigger两种模式,前一种模式是按照DBC中设定的周期周期发送,后一种无需计算周期直接发送,这里不如直接用CanIf层进行发送来的方便, 但是在Com中需配置
在这里插入图片描述
也就是SG_XcpRes 发送成功的Notification函数Xcp_Cbk_XcpResponseTxSuccess
在里面放上XcpBasic.c中实现的XcpSendCallBack才正确。
配置就说这么多,这样框架就搭好了,大家自行琢磨。

  • 代码

在这里插入图片描述
我们可以看到这是Vector 提供的代码, 其主要逻辑就是在XcpBasic.c中实现,大家可以把它们集成到自己的工程中去,进行编译。

我们来理一下Xcp协议栈的运行步骤
Tester-> send msg 0x760 + 8bytes -> ECU CAN Transiver -> Ecu CAN Interrupt -> CanIf_RxIndication -> PduR_RxIndication -> Com_RxIndication -> 对Signal XcpRequest 进行解包并拷贝至信号的缓存区-> 调用Rte_COMCbk_XcpReq_oXcpRequest_oCAN_42940af5_Rx callback激活Task(Xcp_Task) -> 调用Runable XcpRxHandler() -> Rte_Read_Rp_XcpRequest_De_XcpRequest 将缓存区的Signal 数据读出并传入XcpCommand -> Xcp 协议栈进行响应-> 如需向Tester 发出Response, 调用ApplXcpSend接口。
那么我们首先应该分析XcpCommand这个最重要的函数, 它其实就是一个状态机

void XcpCommand( const vuint32* pCommand )
{
  const tXcpCto* pCmd = (const tXcpCto*) pCommand; /* PRQA S 0310 */ /* MD_Xcp_0310 */
  vuint8 err;
  if (CRO_CMD==CC_CONNECT)
  {

    CRM_CMD = 0xFF; /* No Error */
    xcp.CrmLen = 1; /* Length = 1 */

#if defined ( XCP_ENABLE_DAQ )
    if ( (xcp.SessionStatus & (SessionStatusType)SS_RESUME) == 0 )
    {
      XcpFreeDaq();
  #if defined ( XCP_ENABLE_SEND_QUEUE )
      xcp.SendStatus = 0; /* Clear all transmission flags */
  #endif
    }
#endif /* XCP_ENABLE_DAQ */

#if defined ( XCP_ENABLE_SEED_KEY )
    /* Lock all resources. */
    xcp.ProtectionStatus = (vuint8)RM_CAL_PAG|RM_DAQ|RM_PGM|RM_STIM;
#endif
    xcp.SessionStatus = (SessionStatusType)SS_CONNECTED;
    xcp.CrmLen = CRM_CONNECT_LEN;

    /* Versions of the XCP Protocol Layer and Transport Layer Specifications. */
    CRM_CONNECT_TRANSPORT_VERSION = (vuint8)( (vuint16)XCP_TRANSPORT_LAYER_VERSION >> 8 );
    CRM_CONNECT_PROTOCOL_VERSION =  (vuint8)( (vuint16)XCP_VERSION >> 8 );

    CRM_CONNECT_MAX_CTO_SIZE = kXcpMaxCTO;
    CRM_CONNECT_MAX_DTO_SIZE_WRITE(kXcpMaxDTO); /* PRQA S 3109 */ /* MD_MSR_14.3 */

#if defined ( XCP_ENABLE_CALIBRATION_PAGE )
    CRM_CONNECT_RESOURCE = RM_CAL_PAG;            /* Calibration */
#else
    CRM_CONNECT_RESOURCE = 0x00;                  /* Reset resource mask */
#endif
#if defined ( XCP_ENABLE_DAQ )
    CRM_CONNECT_RESOURCE |= (vuint8)RM_DAQ;       /* Data Acquisition */
#endif

    CRM_CONNECT_COMM_BASIC = 0;
#if defined ( XCP_ENABLE_COMM_MODE_INFO )
    CRM_CONNECT_COMM_BASIC |= (vuint8)CMB_OPTIONAL;
#endif
#if defined ( XCP_CPUTYPE_BIGENDIAN )
    CRM_CONNECT_COMM_BASIC |= (vuint8)PI_MOTOROLA;
#endif
    goto positive_response;
  }

  else{

    if ( (xcp.SessionStatus & (SessionStatusType)SS_CONNECTED) != 0 ){

#if defined ( XCP_ENABLE_SEND_QUEUE )
      if ( (xcp.SendStatus & (vuint8)(XCP_CRM_PENDING|XCP_CRM_REQUEST)) != 0 )
      {
        xcp.SessionStatus |= (SessionStatusType)SS_ERROR; 
        END_PROFILE(1); /* Timingtest */

        /* No response */
        return;
      }
#endif

#if defined ( XCP_ENABLE_GET_SESSION_STATUS_API )
        xcp.SessionStatus |= (SessionStatusType)SS_POLLING;
#endif

      CRM_CMD = 0xFF; /* No Error */
      xcp.CrmLen = 1; /* Length = 1 */

      switch (CRO_CMD){

          case CC_SYNC:
            xcp.CrmLen = CRM_SYNCH_LEN;
            CRM_CMD    = PID_ERR;
            CRM_ERR    = CRC_CMD_SYNCH;
            break;

#if defined ( XCP_ENABLE_COMM_MODE_INFO )
          case CC_GET_COMM_MODE_INFO:
            {
              xcp.CrmLen = CRM_GET_COMM_MODE_INFO_LEN;
              CRM_GET_COMM_MODE_INFO_DRIVER_VERSION = (vuint8)( ((CP_XCP_VERSION & 0x0F00) >> 4) |
                                                                (CP_XCP_VERSION & 0x000F)         );
              CRM_GET_COMM_MODE_INFO_COMM_OPTIONAL = 0;
              CRM_GET_COMM_MODE_INFO_QUEUE_SIZE = 0;
              CRM_GET_COMM_MODE_INFO_MAX_BS = 0;
              CRM_GET_COMM_MODE_INFO_MIN_ST = 0; /*查UDS相关概念*/
            }
            break;
#endif 

          case CC_DISCONNECT:
            xcp.CrmLen = CRM_DISCONNECT_LEN;
            XcpDisconnect();
            break;
    ...代码太多就不拷贝了
    大家可以仔细阅读
}

这里总结下Xcp 标定/测量的流程
首先肯定要建立连接
M->S FF 00 00 00 00 00 00 00 请求建立连接
S->M FF 连接成功
M->S F8 00 01 00 00 00 00 00 解锁RM_CAL_PAG 标定权限
S->M FF 06 01 02 03 04 05 06 Slave发回6Bytes 种子
M->S F7 02 BE EF 00 00 00 00 发回KEY进行解锁
S-M FF 解锁成功,可以标定
M->S SET_MTA 传入需要标定变量的地址(Master根据A2L文件)
M->S Download Size+Data 这样存在RAM中的标定变量就可以被改写了

测量的话分为Polling 和 DAQ, 其中Polling较为简单,但效率较低,不适合速度快一点的采集,DAQ模式较为复杂,这里就不具体分析代码了,只有弄明白什么是DAQList,Odt ,OdtEntryAddress, OdtEntrySize以及它们在这套代码中是如何分配内存的就可以了
需注意由于这里采用CAN通信,一个DTO最多发送8个字节, 其中第一个字节是Odt编号,也就说真正用于发送Data的只有7个字节,而Xcp不像UDS或Tcp那样可以发连续帧,有FlowCtrl
一个Dto发送一个Odt包含这个Odt中所有EntryAddres中存放的EntrtySize大小的数据
所以一个Odt中最多可包含MaxDto-1个Entry 并且要Size 都为1Bytes
也就说我有4个 uint32 moni_vars 那么一个Odt肯定放不下, 需要四个Odt
DAQ 简要的流程是 FreeDAQ -> Allocate DAQList -> Allocate Odt -> Allocate Entry ->
WriteDAQ (为每个Entry 写上变量的具体地址和大小,比如 uint32 moni_var1 adress:0x1FFF8000 size:4bytes)-> Start DAQ(这里可以分别为每个DAQList 设置Prescaler, 即采样周期)
相当于先在ECU中建立好一张采样表,并设定周期开始采样。

其他需要注意的是一定要打开XCP_ENABLE_SEND_QUEUE这个宏,否则DAQ会丢帧,另外根据工具(上位机)的不同需要注意一下上位机传数据的大小段格式。
附上Xcp_Cfg.h

#if !defined(__XCP_CFG_H__)
#define __XCP_CFG_H__


/* define here configuration parameters for customizing XcpBasic driver */
#define V_MEMROM0
#define kXcpMaxCTO     8
#define kXcpMaxDTO     8
#define V_MEMROM0
#define XCP_DISABLE_COMM_MODE_INFO
#define XCP_DISABLE_SERV_TEXT
#define XCP_DISABLE_SERV_TEXT_PUTCHAR
#define XCP_DISABLE_SERV_TEXT_PRINT
#define XCP_DISABLE_CALIBRATION_PAGE
#define XCP_TRANSPORT_LAYER_VERSION 0x100
#define XCP_DISABLE_UNALIGNED_MEM_ACCESS
#define XCP_ENABLE_USE_BYTE_ACCESS
#define XCP_CPUTYPE_LITTLEENDIAN
#define XCP_ENABLE_SEND_EVENT /*send event支持*/
#define XCP_ENABLE_CALIBRATION
#define XCP_ENABLE_PARAMETER_CHECK
#define XCP_ENABLE_SEED_KEY
#define XCP_ENABLE_DAQ
#define XCP_DISABLE_DAQ_HDR_ODT_DAQ
#define XCP_ENABLE_DAQ_PROCESSOR_INFO
#define XCP_ENABLE_DAQ_RESOLUTION_INFO
#define XCP_ENABLE_DAQ_PRESCALER
#define XCP_ENABLE_DAQ_OVERRUN_INDICATION
#define XCP_ENABLE_SEND_QUEUE
#define kXcpDaqMemSize (1024*2)


#endif /* __XCP_CFG_H__ */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autosar Xcp移植 的相关文章

  • Adaptive AutoSAR 标准介绍

    关于自适应AutoSAR 平台 自适应autosar 平台实现了adaptive applications的运营环境 它提供了两种接口 xff0c 一种是service 一种是API 平台功能分成两部分 xff1a service部分和ad
  • AUTOSAR——AUTOSAR基础

    一 AUTOSAR AUTOSAR全称为 AUTomotive Open System ARchitecture xff0c 译为 汽车开放系统体系结构 二 AUTOSAR核心思想 1 xff09 提倡 在标准上合作 xff0c 在实现上竞
  • 1、AUTOSAR简介

    AUTOSAR xff08 AUTotmotive Open System ARchitecture xff09 汽车开放系统架构是由全球各大汽车整车厂 汽车零部件供应商 汽车电子软件系统公司联合建立的一套标准协议 xff0c 是对汽车技术
  • 【AUTOSAR】【信息安全】CSM

    目录 一 概述 二 依赖模块 三 功能描述 3 1 基本体系结构 3 2 通用行为 3 2 1 正常操作 3 2 2 设计说明 3 3 错误分类 3 3 1 开发错误 3 3 2 运行时错误 四 API接口 4 1 通用接口 4 2 加密接
  • AUTOSAR和ROS有哪些联系和区别

    AUTOSAR和ROS有哪些联系和区别 xff1f AUTOSAR和ROS有哪些联系和区别 xff1f 用ROS可以实现AUTOSAR的功能吗 xff1f 从Linux和Ros系统转向AP该如何转 xff1f 为什么需要转 xff1f AP
  • 从工程师的角度看AUTOSAR

    软件定义汽车 的火热带动了工程师们对于汽车电子软件热烈地讨论 不曾想到 xff0c 隐藏在控制器内部 xff0c 默默地发挥着作用的汽车电子软件 xff0c 如今备受瞩目 本人毕业到现在 xff0c 一直在汽车行业做软件 xff0c 切身感
  • 从Adaptive AUTOSAR的角度看SOA

    前言 身处汽车行业的我们深知 xff0c 新技术的应用或者新概念的提出 xff0c 一定是事出有因的 通常是为了抢夺新技术高地 xff0c 让汽车更好地满足未来的需求 那么 xff0c 汽车电子电气架构领域掀起的这股SOA热潮是由什么导致的
  • Adaptive AUTOSAR----Adaptive studio

    Adaptive studio Adaptive Studio 是包含在 RTA VRTE SK 中的 AUTOSAR 编辑器 Adaptive studio 通过高级抽象支持所有 adaptives autosar arxml 元素的配置
  • 浅谈AP autosar 之 runtime 基础

    AP Autosar Architecture overview AP autosar在SOC 中的位置 xff0c 起到的作用 下面图可以看出 xff0c AP autosar封装了操作系统的接口 xff0c 封装了功能安全 xff0c
  • Adaptive AUTOSAR——Execution Management(VRTE 3.0 R21-11)

    ChatGPT回答 xff1a Adaptive AUTOSAR Execution Management 模块是用于管理软件执行的模块 xff0c 其主要功能包括 xff1a 任务调度 xff1a 支持对任务进行调度和执行 xff0c 以
  • Adaptive AUTOSAR 文档官方如何阅读

    目前很多关于 Adaptive AUTOSAR 的文章都是官方文档的简化翻译 xff0c 不如直接看官方文档更全面深入 Adaptive AUTOSAR 文档官方下载地址 Adaptive Platform AUTOSAR https ww
  • 【AUTOSAR】【以太网】TCPIP

    目录 一 概述 二 约束和假设 三 依赖模块 3 1 EthIf 3 2 EthSM 3 3 SoAd 3 4 KeyM 3 5 CSM 四 功能说明 4 1 系统扩展性 4 2 IPv4 4 2 1 IPv4 4 2 2 ARP 4 2
  • PHY- PHY芯片概述

    1 PHY概述 关于Internet Protocal的分层模型可以参考文章 Internet Protocal OSI模型中的网络分层模型 下面我们讲讲底层以太网控制器和收发器的知识 其主要是处理OSI模型中的物理层和链路层的事情 在CA
  • 【读懂Autosar代码】-1-概述

    点击返回 Autosar从入门到精通 实战篇 总目录 案例背景 共5页精讲 聊一聊这些封装中关键字宏的命名是如何构成的 FUNC FUNC P2CONST FUNC P2VAR P2VAR P2CONST CONSTP2VAR CONSTP
  • AUTOSAR-自旋锁(spinlock)与互斥锁

    AUTOSAR多核OS为实现核间资源互斥 保证数据一致性 设计了自旋锁机制 该机制适用于核间资源互斥 对于多核概念 需要一种新的机制来支持不同内核上任务的互斥 这种新机制不应在同一内核上的 TASK 之间使用 因为它没有意义 在这种情况下
  • 移动端安全通信的利器——端到端加密(E2EE)技术详解

    前言 端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在 采用端到端加密 又称脱线加密或包加密 时消息在被传输时到达终点之前不进行解密 因为消息在整个传输过程中均受到保护 所以即使有节点被损坏也不会使消息泄露 端到端加密系统与链
  • SOTA机制详解

    1 SOTA的定义 SOTA即软件在线升级 Software updates Over The Air 是指在不连接烧写器的情况下 通过CAN UART或其它通讯方式 实现应用程序的更新 在进行SOTA时 需要把旧的应用程序擦除 把新的应用
  • 协议数据单元PDU和服务数据单元SDU

    关注汽车工程师谈技术 一起学习技术 目录 1 协议数据单元PDU和服务数据单元SDU 2 AutoSAR中PDU和SDU的应用 3 总结 返回总目录 协议数据单元PDU 大家在AutoSAR开发过程中 特别是通信和诊断开发中 应该会经常碰到
  • Autosar软件架构

    软件架构 应用层通过 Simulink模型实现 模型的代码生成使用统一配置脚本 底层软件模块满足AUTOSAR 4 2 1标准要求 其软件架构如下图所示 软件架构 2 2 2 Com通信模块配置 BCU通过唤醒信号控制相应CAN消息的通信使
  • 【AUTOSAR】CCP协议的代码分析与解读(二)----CCP协议格式和命令代码

    CCP协议介绍 CCP的全称是CAN Calibration Protocol CAN标定协议 是基于CAN总线的ECU标定协议规范 CCP协议遵从CAN2 0通信规范 支持11位标准与29位扩展标识符 CCP通信方式 CCP协议采用主从通

随机推荐

  • linux下网络设备驱动开发

    一 xff0c 网络OSI参考模型分为 从上到下 应 xff0c 表 xff0c 会 xff0c 传 xff0c 网 xff0c 数链 xff0c 物 物理层 gt 数据链路层 gt 网络层 gt 传输层 gt 会话层 gt 表示层 gt
  • freeRTOS系统静态与动态建立任务

    一 xff0c 静态建立任务 1 xff0c 定义任务函数 xff08 一个无限循环且不带返回值的函数 xff09 任务必须是死循环 xff0c 否则任务将经过 LR 返回 xff0c 如果 LR 指向了非法内存就会产生HardFault
  • Ubuntu18.04安装Ceres1.14

    Ubuntu18 04安装Ceres1 14 1 下载Ceres2 安装依赖项3 编译4 安装 1 下载Ceres 链接Github下载地址 2 安装依赖项 sudo apt get install liblapack dev libsui
  • SSH登录出现REMOTE HOST IDENTIFICATION HAS CHANGED故障的解决办法

    今天登录一台交换机 xff0c 出现如图错误 xff1a 原因 该IP分配给过另一台交换机 xff0c 在knows hosts文件中保留了当时的rsa信息 xff0c 将这个IP有分配给新设备 xff0c SSH登录时会提示RSA key
  • 外贸函电常用词汇

    外贸函电常用词汇 xff1a xff08 1 xff09 贵函 Your letter Your favour your esteemed letter Your esteemed favour Your valued letter You
  • 匿名拓空者Pro开源飞控使用介绍-1-飞控特点

    匿名团队 是一个爱好技术 xff0c 爱好创新的团队 做自己 xff0c 发现兴趣 xff0c 追随兴趣 xff0c 分享兴趣 非常欢迎大家关注我们匿名 xff0c 交流群 xff1a 190169595 匿名拓空者Pro 飞控 xff0c
  • 匿名拓空者Pro开源飞控使用介绍-2-硬件配置及拓展接口

    硬件配置 主控 STM32F407 xff1a 1M FLASH xff0c 192K RAM xff0c 运行频率168MHz xff1b 惯性传感器 icm20602 xff1a 3轴陀螺 43 3轴加速度 43 恒温设计 xff08
  • 匿名拓空者Pro开源飞控使用介绍-3-连接上位机及基本测试

    飞控连接上位机方法 飞控可以通过底板上的USB端口连接上位机 xff0c 使用USB线连接飞控和电脑 xff0c 飞控买家版程序会将USB端口初始化成HID设备 xff0c 免安装驱动程序 xff0c 只要打开匿名上位机 xff0c 打开程
  • 匿名拓空者Pro开源飞控使用介绍-4-飞控安装及坐标系定义

    飞控安装 将机架组装好 xff0c 电机安装于机架上 xff0c 飞控安装于机架重心位置 xff08 一般为机架中心板中心位置 xff0c 也就是两条电机对角线交点 注意 xff0c 飞控尽量水平安装于机架上 xff0c 飞行效果最好 xf
  • 匿名拓空者Pro开源飞控使用介绍-5-接收机连接

    确定使用何种接收机连接方式 匿名拓空者PRO飞控支持SBUS PPM PWM型接收机 xff0c 根据推荐程度依次为SBUS gt PPM gt PWM SBUS PPM均可以实现1根信号线传输多通道遥控数据的功能 xff0c SBUS为串
  • 匿名科创--匿名拓空者PRO—TI版全开源飞控使用入门—TM4C123

    1 飞控介绍 匿名团队针对TI芯片的强烈学习需求 xff0c 推出了匿名拓空者PRO飞控的TI版 使用TI公司的 TM4C123G 主控芯片 xff0c 打造了一款完全开源的飞控产品 xff0c 提供完全开源的飞控整体工程文件 xff0c
  • 匿名科创--ANO_OPENMV视觉开发板介绍

    1 ANO OPENMV介绍 官方OPENMV体积大 xff1f 在飞行器上不方便安装 xff1f 串口通过杜邦线容易接触不良 xff1f 不可否认 xff0c OPENMV为大家提供了一个非常方便 易用的视觉开发环境 xff0c 但是在实
  • 匿名科创--匿名拓空者PRO--开源光流融合算法使用教程

    1 总体介绍 为了更好的支持匿名TI飞控买家 xff0c 匿名团队开源了基于优象光流模块的飞控算法 xff0c 光流传感器直接连接至匿名拓空者PRO TI版飞控 xff0c 由飞控读取原始光流传感器的光流数据 xff0c 结合高度传感器以及
  • Linux 设备驱动开发实例

    编译和运行 驱动编译要用到kernel的Makefile文件 也就是源码树的编译系统 因此 xff0c 源码需要被配置和编译 xff0c 以ubuntu自带的源码为例 xff1a 编译外部模块 ko 的编译命令是 xff1a make C
  • 匿名科创-匿名光流V3版对天安装介绍

    安装介绍 光流模块对天安装时 xff0c 方向参考上图 注意 xff0c 只有光流模块对上安装 xff0c 激光或超声波测距模块仍然对地安装 配置介绍 如需使用对天模式 xff0c 硬件安装好后 xff0c USB线连接光流模块至上位机 x
  • 从 C51+uCos-II 近距离了解操作系统任务切换原理

    前言 从 C51 43 uCos II 简单介绍下任务切换的原理 方便大家更形象的理解多任务怎么切换 为后续写 x86 43 Linux 任务切换做铺垫练手吧 参考资料如下 xff1a uCos II 源码 单片机原理与应用及 C51 编程
  • Keil+Simulink生成Xcp标定协议A2L文件

    Keil 43 Simulink生成Xcp标定协议A2L文件 由于最近要为ECU移植XCP协议 xff0c 所以记录一下 xff0c 我使用的MCU为NXP S32K144 IDE选用MDK 官方IDE S32DS无代码联想功能 xff0c
  • 记录一下关于MPC5744P CAN总线学习

    记录一下关于MPC5744P CAN总线学习 主要是针对开发出BUSOFF管理 xff0c NXP感觉都是一个套路 xff0c 无论powerpc xff0c 还是arm m status t span class token functi
  • 通过.map文件填写XCP标定需要的A2L文件

    首先你得有一个模板 xff0c 通过python脚本打开编译后的 map文件自动填写到A2L文件对应位置 xff0c 目前只实现了填写Mesurement 区域 xff0c 但是这个填写主要是更新变量名和对应的ECU ADRRESS 因为
  • Autosar Xcp移植

    前言 xff1a 可能有兄弟胸中有点疑问 Vector ETAS等软件包都有XCP xff0c 你移植个吊 xff0c 但是我的MICORSAR BSW中没发现XCP静态代码 xff0c 倒是在CFG中发现了XCP配置选项 xff0c 难道