【MCAL】TC397+EB-tresos之CAN配置实战 - (CAN/CANFD)

本篇文章介绍了在TC397平台使用EB-tresos对CAN驱动模块进行配置的实战过程,不仅介绍了标准CAN的发送与接收,还介绍了CANFD的实现与调试以及扩展帧的使用。M_CAN是德国博世公司开发的IP,因为英飞凌的芯片完整的集成了这个IP,所以整体的配置都比较符合通用的芯片配置使用规范,如果读者有在其他平台实现CAN通信的经验,应该很容易就能上手本篇文章描述的配置实现过程。

目录

概述

环境与目标 

EB-tresos配置

Port配置

CAN配置 

CanGeneral

CanController

CanControllerBaudrateConfig

CanControllerFdBaudrateConfig(CANFD配置)

CanHardwareObject 

CanHwFilter 

IRQ配置

MCU配置

ResourceM配置 

CAN驱动调试 

标准CAN测试代码与结果

CANFD测试代码与结果

扩展帧测试代码与结果


概述

英飞凌公司AURIX™ TC397芯片内部集成了三路MCMCAN(CAN0,CAN1,CAN2),每路CAN支持4个node,MCMCAN使用了Bosch公司M_CAN的IP,其具有以下的功能特点。

  • 可配置的消息RAM,用于存储要发送或接收的消息。
  • 基于定时器的CAN帧传输和接收CAN帧的超时。
  • 通过中断压缩单元分组和发送中断信号。
  • 通过BPI访问保护。

英飞凌提供的CAN驱动程序负责提供符合AUTOSAR 4.2.2/4.4.0指定标准的CAN通信服务。M_CAN单元是底层CAN硬件单元,它由包含多个共享消息RAM(在AUTOSAR中称为硬件对象)的节点组成(在AUTOSAR中成为控制器)。CAN驱动程序提供服务为:

  • 初始化CAN控制器以控制CAN控制器的行为和状态。
  • 设置和修改CAN控制器的波特率配置。
  • 支持CAN和CANFD帧传输和接收。
  • 支持在轮询和中断模式下,帧成功传输通知以及专用FIFO消息的接收和总线其他事件通知。
  • 数据接收使用接收FIFO作为缓存。
  • Pretended网络模式处理。
  • 支持多次读/写周期功能。
  • 使用Tx队列进行多路传输。

每个CAN节点针对下列事件提供单独的中断线进行处理:

  • Bus-off事件。
  • 发送事件。
  • 专用消息接收事件处理。
  • FIFO0/1的溢出报警以及FIFO全事件处理。
  • 针对发送与接收的混合模式处理。

CAN驱动程序作为Post-Build的变体(未明确定义)来提供使用。因此,驱动程序支持带有预编译和符合Post-Build(构建后)配置结构体的配置参数。CAN驱动程序提供的API是具有防重入等多核特性,这意味着可以同时从多个核心调用使用它们。

下图为CAN驱动涉及的软硬件接口图(HSI):

英飞凌提供的CAN驱动程序使用使用M_CAN并遵守ISO 11898-1进行通信。此外,M_CAN还支持符合CANFD协议规范1.0的通信。驱动程序涉及的硬件特性如下:

  • M_CAN的IP中所有的CAN控制器以及消息RAM硬件资源都被用于实现CAN驱动程序。
  • CANFD最多支持64个字节的数据。
  • 多达64个专用的接收缓冲区。
  • 多达32个专用的发送缓冲区。
  • 两个可配置的接收FIFO。
  • 可配置的发送队列。
  • 每个控制器可以配置四个单独的中断,分别为Rx,Rx FIFOs,Tx,bus-off。

不支持的M_CAN特性如下:

  • 事件同步时间触发通信。
  • CAN错误记录。
  • 消息优先级。

CAN驱动程序使用M_CAN IP核中的以下的硬件事件:

  • CAN /CANFD帧的成功传输由标志(IR寄存器中的相关位)与中断通知。CAN驱动程序使用 FIFO新条目的TxEvent来处理对上层的通知。
  • 成功接收到CAN /CANFD帧将通过标志(IR寄存器中的相关位)和中断通知。CAN驱动程序使用接收中断通知上层。
  • 总线断开事件由标志(IR寄存器中的相关位)和中断通知。CAN驱动程序接收中断通知并通知上层。
  • Rx FIFO0溢出报警、RxFIFOO Full、RxFIFO1溢出报警、RxFIFO1 Full事件都路由到同一个ISR。通过FIFO处理接收到的数据,所有列出的标志都在CAN驱动程序中经过处理。

环境与目标 

本文使用的为英飞凌提供的开发板KIT_A2G_TC397XA_TFT,收发器采用TLE9251V(CAN FDcapable),板卡上选焊的是P10.2与P10.3与TC387相连。

涉及的软件如下。

  • EB-tresos:用于生成动态代码,具体工程搭建参考《【AUTOSAR MCAL】MCAL基础与EB tresos工程新建》。
  • HighTech:用于编译生成elf文件,具体的工程搭建参考《【MCAL】HighTec集成TC3xx对应MCAL的Demo》。
  • UDE 5.2:用于下载和调试程序。

涉及的参考文档如下表。

序号参考资料内容
1《Infineon-AURIX_TC39x-UserManual-v02_00-EN》英飞凌TC39x用户手册
2《ApplicationKitManual-TC3X7-ADAS-V21.pdf》开发板KIT_A2G_TC397XA_TFT说明
3《MC-ISAR_TC3xx_UM_Can_17_McmCan.pdf》英飞凌提供的TC3xx芯片CAN用户手册

 配置目标如下:

  1. 正常收发标准CAN报文。
  2. 正常收发CANFD报文。
  3. 正常收发扩展帧报文。

EB-tresos配置

MCAL的配置主要涉及以下四个部分。

  • Port配置:根据连接的TC397引脚,配置相应的CAN收发引脚复用功能。
  • MCU配置:配置CAN时钟。
  • CAN配置:主要完成CAN控制器相关的所有配置,控制器通用配置,波特率等。
  • IRQ配置:完成中断相关配置。


Port配置

根据刚才提到开发板原理,我们使用了P10.2作为CANRX,P10.3作为CANTX。查找芯片手册,可得CAN发送需要通过RXDE来关联,CAN发送需要配置成ALT6。可以看出我们使用的是node是CAN02。

下图为P10.2的配置。

下图为P10.3的配置。


CAN配置 

CanGeneral

该容器包含与每个CAN驱动单元相关的参数。主要需要关心的配置项如下。

  • CanDevErrorDetection:打开或关闭默认错误跟踪程序 (Det) 检测和通知。
  • CanMultiCoreErrorDetect  :打开或关闭多核默认错误跟踪器 (Det) 检测和通知。
  • CanMainFunctionModePeriod:该参数描述循环调用Can_MainFunction_Mode的周期。单位为秒。轮询调度才有效果,在这里不可以配置,在后面才可以配置。
  • CanTimeoutDuration:指定在检测到超时之前阻塞函数的最大时间。单位为秒。


CanController

这里边重要的配置比较多,对应的是一个CAN控制器的配置。

  • CanBusoffProcessing:Busoff处理用中断还是轮询的选择。
  • CanControllerLoopbackEnable:指定控制器是否启用内部回环模式(发送与接收内部连接,用作测试)。
  • CanRxInputSelection:接收输入线端口引脚选择,根据上面Port配置提到的P10.2对应RXDE。
  • CanControllerBaseAddress:CAN控制器的基址。因为我们使用的是CAN02,则基地址查询手册可知为0xF0208900。

  • CanRxProcessing:接收方式是中断还是轮询。
  • CanTxProcessing:发送方式是中断还是轮询。
  • CanWakeupProcessing:唤醒方式是中断还是轮询。
  • CanControllerDefaultBaudrate:参考为CAN控制器配置的波特率配置的容器。
  • CanPeripheralBusClockRef:参考为CPU外设总线时钟的配置,该配置在 MCU 驱动程序配置中设置。


CanControllerBaudrateConfig

该容器包含CAN控制器的位时序相关配置参数。在介绍相关的参数前我们先介绍以下采样点的概念,如下图所示,采样点是can控制器对can线上电平单bit数据采样的时刻。

  • CanControllerBaudRate :控制器的波特率,单位为Kbps。
  • CanControllerPropSeg:指定以时间量子(最小时间单位)表示的传播延迟,对应上图的Delay。
  • CanControllerSeg1:在时间量子中指定相位段1。
  • CanControllerSeg2:在时间量子中指定相位段2。
  • CanControllerSyncJumpWidth:由于再同步,相位 SEG1 可能会延长或相位 SEG2 可能会缩短。相位缓冲器段的加长或缩短量由再同步跳变宽度(SJW)给出的上限。

网上有很多给出CAN控制输入频率,期待CAN波特率与采样点位置( (1+SEG1) / (1+SEG1+SEG2)),即可以输出对应的参数配置,如下图所示为针对ST芯片的一个计算参数的小工具,也可以根据公式进行手算。

MCAL配置如下图。


CanControllerFdBaudrateConfig(CANFD配置)

这个可选的容器包含CAN控制器CANFD帧可变速率的位时序相关配置参数,用于CANFD帧中控制场中的BRS位到ACK场之前(含CRC分界符)的传输速率。如果该容器存在,则控制器支持CANFD帧。需要关注的配置如下。

  • CanControllerTxBitRateSwitch:配置是否使用第二波特率(CANFD波特率)用于发送,这里我们取消勾选,因为我们需要在支持CANFD消息的网络中传输传统CAN 2.0消息。(例如:便于CAN的选择性唤醒。)在这些情况下,有必要支持CAN-FD消息和传统CAN消息交替传输。这问题可以通过在调用Can_17_McmCan_Write函数的时候,利用CanId参数中没有用到的高位,来使用哪种类型的帧,从而在数据帧的级别上实现交替发送。


CanHardwareObject 

在FullCAN架构(一个Buffer对应一个ID的报文)下,一个HWObject(Hardware Object)只能处理单个CanId,所以我们需要根据应用层接收以及发送报文数量建立相应的CanHardwareObject。

下面我们介绍一下各配置项的含义。

  •  CanHandleType:指定硬件对象的类型(FULL-CAN或BASIC-CAN)。由于FULL CAN特性是最常用的,所以CanHandleType配置参数的默认值设置为FULL。
  • CanHwObjectCount:用于实现一个HOH的硬件对象的数量。如果是HRH,这个参数定义硬件中元素的数量。FIFO或影子缓冲区的数量,在HTH的情况下,它定义了用于多路传输或用于FullCAN HTH的硬件FIFO的硬件对象的数量。
  • CanHwFIFOThreshold:指定触发中断以复制数据的Rx_FIFO缓冲区的阈值大小。
  • CanIdType:指定CanHwFilterCode值是否为标准帧ID(11位),扩展帧ID(29位),还是CANID可以为标准帧或者扩展帧。
  • CanObjectId:保存HRH()或HTH的句柄ID。这个参数的值在给定的CAN驱动程序中是唯一的,它应该从0开始,没有任何间隙。
  • CanObjectType:邮箱类型是接收还是发送。
  • CanControllerRef:HOH所关联的CAN控制器的参考。

我们需要先建立接收报文的HWObject,再建立发送的,下面是实验用到的整体配置。


CanHwFilter 

这个容器只对接收的HWObject(HRH)有效,包含硬件过滤器的配置(接收ID与ID_Mask)。发送的HWObject不需要配置。


IRQ配置

每个CAN节点一组,每组四个节点。

根据下图手册,找到CAN02对应的中断线。

对应的中断为一类中断和服务路由到CPU0(都为默认配置,不需要修改),最终中断配置如下。


MCU配置

配置CAN时钟源频率,需要注意的配置如下。

  • mcumcanclocksourcesselection:用于选择不同的时钟源,MCAN_CLOCK_SOURCE_MCANI_SEL1时钟源为fMCANI,MCAN_CLOCK_SOURCE_OSC_SEL2时钟源为Main oscillator。


ResourceM配置 

配置使用资源,分配核,在Core0中添加CAN,并关联CanController_0。


CAN驱动调试 

标准CAN测试代码与结果

测试代码如下,主要包含一个初始化的过程和以50ms为周期发送报文。

uint8 Buffer_TX0[8];
uint8 Buffer_RX0[8] ;
Can_PduType TestPduInfo[ ] =
{{0,8, 0x100, Buffer_RX0 },{0,8, 0x510, Buffer_TX0 },
};Can_ReturnType Can_Return = CAN_OK;void Can_DemoFunction(void)
{IrqCan_Init();SRC_CAN_CAN0_INT0.B.SRE = 1;SRC_CAN_CAN0_INT1.B.SRE = 1;SRC_CAN_CAN0_INT2.B.SRE = 1;SRC_CAN_CAN0_INT3.B.SRE = 1;Can_17_McmCan_Init(&Can_17_McmCan_Config);Can_17_McmCan_SetControllerMode(Can_17_McmCanConf_CanController_CanController_0, CAN_T_START);Can_17_McmCan_EnableControllerInterrupts(Can_17_McmCanConf_CanController_CanController_0);uint8 i;/*-----------------test the can   ---------------------*/for(i = 0; i < 8; i++){Buffer_TX0[i]= i;}TestPduInfo[1].id = 0x666;while(1){Can_Return = Can_17_McmCan_Write(Can_17_McmCanConf_CanHardwareObject_CanHardwareObject_StandTx, &TestPduInfo[1]);Delay(50);}
}

CAN帧ID为0x666的报文被以50ms正常发送。

接收结果测试则发送CANID为0x100,Data为0x11 0x22 0x33 0x00的CAN报文,通过调试器仿真在CanIf接收回调里打断点来查看是否接收成功如下图。


CANFD测试代码与结果

代码如下,与标准帧不同的地方在于数据为64字节,而CANID是或上了0x40000000,例如本例子的0x123就要设置为0x40000123,从而控制发送CANFD帧。

uint8 tx_data_Fd[64] =
{ 0x39, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x11, 0x22, 0x33,0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x01, 0x02, 0x15, 0x16, 0x17, 0x18, 0x91,0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98
};
/* CAN Frame PDU Info for FD */
Can_PduType PduInfo_FD[] =
{{2,  32, 0x40000123, tx_data_Fd },{2,  32, 0x40000111, tx_data_Fd },
};Can_ReturnType Can_Return = CAN_OK;void Can_DemoFunction(void)
{IrqCan_Init();SRC_CAN_CAN0_INT0.B.SRE = 1;SRC_CAN_CAN0_INT1.B.SRE = 1;SRC_CAN_CAN0_INT2.B.SRE = 1;SRC_CAN_CAN0_INT3.B.SRE = 1;Can_17_McmCan_Init(&Can_17_McmCan_Config);Can_17_McmCan_SetControllerMode(Can_17_McmCanConf_CanController_CanController_0, CAN_T_START);Can_17_McmCan_EnableControllerInterrupts(Can_17_McmCanConf_CanController_CanController_0);while(1){Can_Return = Can_17_McmCan_Write(Can_17_McmCanConf_CanHardwareObject_CanHardwareObject_CANFD, &PduInfo_FD[0]);Delay(50);}
}

测试需要的CANoe设置500k为控制器波特率,5000k为数据域波特率。

测试结果如下图 

扩展帧测试代码与结果

代码如下,注意ID是或上了一个0x80000000,表明发送的为扩展帧。

uint8 tx_data_1[8] = {0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98 };
Can_PduType PduInfo_ExtId[] =
{{0, 8, 0x9AAAAAAA, tx_data_1},{0, 8, 0x81111111, tx_data_1}
};Can_ReturnType Can_Return = CAN_OK;void Can_DemoFunction(void)
{IrqCan_Init();SRC_CAN_CAN0_INT0.B.SRE = 1;SRC_CAN_CAN0_INT1.B.SRE = 1;SRC_CAN_CAN0_INT2.B.SRE = 1;SRC_CAN_CAN0_INT3.B.SRE = 1;Can_17_McmCan_Init(&Can_17_McmCan_Config);Can_17_McmCan_SetControllerMode(Can_17_McmCanConf_CanController_CanController_0, CAN_T_START);Can_17_McmCan_EnableControllerInterrupts(Can_17_McmCanConf_CanController_CanController_0);while(1){Can_Return = Can_17_McmCan_Write(Can_17_McmCanConf_CanHardwareObject_CanHardwareObject_Extern, &PduInfo_ExtId[0]);Delay(50);}
}

测试结果如下。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

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

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

相关文章

4.关联式容器

关联式container STL中一些常见的容器&#xff1a; 序列式容器&#xff08;Sequence Containers&#xff09;&#xff1a; vector&#xff08;动态数组&#xff09;&#xff1a; 动态数组&#xff0c;支持随机访问和在尾部快速插入/删除。list&#xff08;链表&#xff09;&am…

【接口测试】常见HTTP面试题

目录 HTTP GET 和 POST 的区别 GET 和 POST 方法都是安全和幂等的吗 接口幂等实现方式 说说 post 请求的几种参数格式是什么样的&#xff1f; HTTP特性 HTTP&#xff08;1.1&#xff09; 的优点有哪些&#xff1f; HTTP&#xff08;1.1&#xff09; 的缺点有哪些&#x…

Nginx高级技巧:实现负载均衡和反向代理

文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…

会声会影2024中文官方网站https://wm.makeding.com/iclk/?zoneid=55677

会声会影2024在易用性方面做得非常出色&#xff0c;这也是它受到广大用户喜爱的一个重要原因。 首先&#xff0c;会声会影2024拥有直观的用户界面设计。软件的整体布局清晰明了&#xff0c;各个功能模块划分得十分合理。用户即使是第一次使用&#xff0c;也能够迅速找到所需的…

实战 | 使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)

导 读 本文主要介绍使用YOLOv8图像分割实现路面坑洞检测&#xff08;步骤 代码&#xff09;。 背 景 如上图所示&#xff0c;现实生活中路面坑洞对车辆和驾驶员安全来说存在巨大隐患&#xff0c;本文将介绍如何使用YoloV8图像分割技术来检测路面坑洞&#xff0c;从而提示驾…

【大数据Hive】hive 多字段分隔符使用详解

目录 一、前言 二、hive默认分隔符规则以及限制 2.1 正常示例&#xff1a;单字节分隔符数据加载示例 2.2 特殊格式的文本数据&#xff0c;分隔符为特殊字符 2.2.1 文本数据的字段中包含了分隔符 三、突破默认限制规则约束 3.1 数据加载不匹配情况 1 3.2 数据加载不匹配…

理解python3中的回调函数

百度百科说&#xff1a;回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该函数的实现方直接调用&#…

ctf_show笔记篇(web入门---php特性)

目录 php特性 89&#xff1a;直接数组绕过preg_match当遇到数组时会直接报错输出0 90&#xff1a;这里利用了intval的特性 91&#xff1a;这里需要细节一点 92-93&#xff1a;这两题的方法很多可以发散思维 94&#xff1a;还是利用小数绕过例如4476.0 95&#xff1a;这里…

【ArcGIS】统计格网中不同土地利用类型占比

基于ArcGIS统计格网中不同土地利用类型占比 数据准备ArcGIS操作步骤1、创建渔网&#xff08;Create Fishnet&#xff09;2、建立唯一标识3、选择格网4、提取不同类别土地利用类型5、各类用地面积计算 参考另&#xff1a;可能出现的问题总结Q1&#xff1a;ArcGIS获取唯一值&…

7.1.1 selenium介绍及安装chromedriver

目录 1. Selenium的用途 2. 安装Selenium库 3. 安装chromedriver 1. 查看谷歌版本号​编辑 2. 找到最新版本及下载 3. 配置环境变量 4. 检测是否配置成功 5. 用python初始化浏览器对象检测&#xff1a; 6. 参考链接 1. Selenium的用途 在前面我们提到&#xff1a;在我…

端智能:面向手机计算环境的端云协同AI技术创新

近年来&#xff0c;随着移动端设备软硬件能力的进步&#xff0c;移动端的算力有了很大提升&#xff0c;同时面向移动端的机器学习框架和模型轻量化技术越来越成熟&#xff0c;端上的AI能力逐渐进入大众视野&#xff0c;端智能在电商领域也开始逐步走向规模化应用。通过持续探索…

Leetcoder Day36| 动态规划part03

343. 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …

Day04:APP架构小程序H5+Vue语言Web封装原生开发Flutter

目录 常见APP开发架构 APP-开发架构-原生态-IDEA APP-开发架构-Web封装-平台 APP-开发架构-H5&Vue-HBuilderX WX小程序-开发架构-Web封装-平台 WX小程序-开发架构-H5&Vue-HBuilderX 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服…

ROS开发基础-Linux基础第四部(开发板设置本地IP)

一 、网线连接设备 使用网线连接jetson NX与机械臂&#xff0c;如下图所示&#xff1a; 二、 修改上位机IPV4 IP ①测试是否可连接。网线连接机械臂之后&#xff0c;在桌面打开终端输入命令“ping 192.168.1.18”,如不可正常通信&#xff0c;可按照下述步骤进行设置。 ②在U…

TypeScript08:在TS中使用模块化

前言&#xff1a;tsconfig.json中的配置 一、前端领域中的模块化标准 前端领域中的模块化标准有&#xff1a; ES6、commonjs、amd、umd、system、esnext 二、 TS中如何书写模块化语句 TS 中&#xff0c;导入和导出模块&#xff0c;统一使用 ES6 的模块化标准。 myModule.ts &a…

如何使用ArcGIS Pro创建最低成本路径

虽然两点之间直线最短&#xff0c;但是在实际运用中&#xff0c;还需要考虑地形、植被和土地利用类型等多种因素&#xff0c;需要加权计算最低成本路径&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

社区店商业计划书撰写指南:让你的项目脱颖而出

对于想要开实体店或创业的朋友们&#xff0c;撰写一份完整而有说服力的商业计划书是迈向成功的重要一步。 作为一名开鲜奶吧5年的创业者&#xff0c;我将分享一些关键的要点和技巧&#xff0c;帮助你撰写一份出色的社区店商业计划书。 1、项目概述&#xff1a; 在计划书的开头…

Java | Java中与文件同名的类的构造函数的调用

在Java的学习过程中遇到了这样一段代码&#xff1a; public class Test1 {int a1;public static void main(String []args){System.out.println("java");}public Test1(){System.out.println("构造函数");} }它的运行结果是这样的&#xff0c;构造函数中的…

第 1 章 微信小程序与云开发从入门到实践从零开始做小程序——开发认识微信小程序

小北的参考工具书 小程序开发的图书并不少&#xff0c;这本书仍然值得你拥有&#xff01; 首先&#xff0c;这是一本全栈小程序开发教程&#xff0c;循序渐进&#xff0c;由浅入深&#xff0c;介绍了小程序开发你想了解的方方面面&#xff0c;包括近其小程序开发的各种新技术应…

C++中的const总结

const修饰成员函数 用const修饰的成员函数时&#xff0c;const修饰this指针指向的内存区域&#xff0c;成员函数体内不可以修改 本类中的任何普通成员变量&#xff0c; 当成员变量类型符前用mutable修饰时例外。 int myFun(void) const //const修饰的是成员函数 2 {}//函数内…