AutoSar Com模块

文章目录

  • Com模块功能
  • 通信传输控制
  • 整体 communication 结构
  • Signal 发送流程
    • 设置信号的 UpdateBit
    • 信号的超时处理
    • 信号的传输方式
  • Signal 发送时序图
  • Signal 接收流程
    • 接收信号的 UpdateBit
  • Signal 接收时序图
  • Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源
  • Com_TxSigGrpInfo / Com_RxSigGrpInfo
    • 1. Signal Group 概念
    • 2. Com_TxSigGrpInfo / Com_RxSigGrpInfo
  • I-PDU、N-PDU、L-PDU关系

Com模块功能

Com 模块为汽车控制单元中的应用软件提供了一个统一的通信环境, 为内部和外部通信定义了公共的软件通信接口, 增强了汽车控制单元中应用软件模块的可移植性。

通信传输控制

Com 模块控制 I-Pdu 数据的接收和发送, 在系统网络状态激活以后可由 BswMCDD 模块调用 Com 提供的 Com_IpduGroupControl 服务函数控制 I-PduGroup 是否需要激活, 只有在 I-PduGroup 的状态为激活 状态时, 对应的 I-Pdu 才能进行数据的接收和发送。

通信传输控制主要实现以下功能点:

  1. 可将 I-Pdu 按照不同的功能或者不同的通道划分到不同的 I-PduGroup 中, 在启动 I-PduGroup 时对应该组内的所有 I-Pdu 才能进行数据的接收和发送。
  2. 可通过调用 Com_IpduGroupControl 服务函数将信号缓存数据设置为初始值。
  3. 可通过调用 Com_SetIpduGroup 服务函数控制单个 I-PduGroup 的激活状态。
  4. 可通过调用 Com_ClearIpduGroupVector 服务函数将所有的 I-PduGroup 状态设置为未激活状态, 停止报文的接收和发送处理。

整体 communication 结构

communication 自上到下,数据的传递过程是:

ASW –> RTE–> COM –> PDUR –> CANTP –> CAN Interface –> CAN Driver –> CAN controller –> CAN transceiver –> CAN BUS Line

  1. Com 模块获取应用层的信号(Signal),经一定处理封装为 IPDUInteraction Layer Protocol Data Unit)发送到 PduR 模块;

  2. PduR 根据路由协议中所指定的 I-PDU 目标接收模块,将接收到的 I-PDU 经一定处理后发送给 CanIfPduR 也可以将部分I-PDU 发送给 CAN TP 模块,处理之后再发送给 CANIf

  3. CanIf 将信号以 L-PDUData Link Layer Protocol Data Unit)的形式发送给 CAN 驱动模块;

  4. CAN 驱动模块将 Message 报文发送给 CAN controller

  5. CAN controller 与外部硬件的 CAN transceiverCAN 收发器) 进行 CAN 报文的收发;

  6. 外部硬件 CAN 收发器– CAN Transceiver Hardware主要工作内容为,接收 CAN bus 上的网络信息(通常叫做 CAN Frame)相关的信号电平并将其转化为逻辑信息电平转发给CAN Controller , 接收从CAN Controller 传输过来的逻辑电平信息并将其转化为信号电平传从到 CAN bus 上。CAN Transceiver 有两条线,一条连CAN 总线的高电平,一条低电平;

请添加图片描述

Signal 发送流程

NeuSar 为例,梳理 signal 更新发送流程:

  1. NeuSar 中,每一个 signal 都有一个 buffer 用来存储数据
  2. 调用 Rte_Write_XXX_XXX 更新 RTE Signal 的全局变量,并调用 Com 层接口
  3. 调用 Com_SendSignal(SignalId, SignalDataPtr) -> Com_SendSignal_Process(SignalId, SignalDataPtr) ; 将需要发送的信号值,保存到相应 signalbuffer
  4. task 中周期调用 Com_MainFunctionTx(void) -> Com_PduTxProcess(com_astPdu) ,在 Com_PduTxProcess 中根据 PDU 的发送触发方式,进行相应处理
  5. 以 周期 触发为例,调用 Com_PduPeriodicTxProcess(PduInfo, PduCycle) -> Com_PduCycleSend(PduInfo, PduCycle) -> Com_OnePduSend(PduInfo) -> Com_PduTxSetVal(PduInfo) ,调用 Com_PduTxSetVal ( PduInfo ) 把信号值放入 PDU 中(Com_TxPduInfo[txSigInfoPtr->acPduId].dataraw 这个指针指向存储 PDU 数据的地址)
  6. 调用 PduR_ComTransmit(PduId, PduInfo) -> PduR_UpTransmit(PduId, PduInfo) -> PduR_Route_LoTransmit(dstPduPtr, pduInfoPtr) ,在调用 PduR_Route_LoTransmit 中,根据路由通道不同,可以选择 CanIf 或者 CanTp 两种方式。
  7. CanTp 为例:CanTp_Transmit(CanTpTxSduId, CanTpTxInfoPtr) -> CanTp_Transmit_WithData(CanTpTxSduId, CanTpTxInfoPtr, ErrorId), 在 CanTp_Transmit_WithData 函数中,将 I-PDU 数据封装成 N-PDU 数据(增加 帧类型、长度、目的地址等信息)
  8. CanTp_TxStateTask(CanTpTxSduId, TRUE:代表使用数据) , 调用 CanTp_TxStateTask 发送数据,根据 CAN 类型不同,选择 Can 2.0 或者 CanFd,继续封装 N-PDU 信息
  9. CanIf_Transmit(CanIfTxSduId, CanIfTxInfoPtr) -> CanIf_Transmit_Process(txPduPtr, pduInfoPtr) -> CanIf_TxQueueFilling(txPduPtr, pduInfoPtr, sduLen, canId) ,在 CanIf_TxQueueFilling 中将待发送的数据写入 Can Driver 的数据缓冲区内
  10. Can Driver 成功发送报文,通过 CanIf_TxConfirmation 函数回调通知 CanIf
  11. CanIf 通过调用 PduR_CanIfTxConfirmation -> PduR_LoTxConfirmation 回调通知 PduR 发送成功
  12. PduR 调用 PduR_Route_UpTxConfirmation -> Com_TxConfirmation 通知 Com 层发送成功
  13. Com 通过发送消息确认来调用 Com_TxPduClearUb_Process 清除更新位。如果该 signal 绑定了回调函数,则执行回调函数,执行相关操作

设置信号的 UpdateBit

Update BitCom 信号或信号组数据更新位, 在通信矩阵中以一个信号形式存在, 占用 1 个 bit, 当信号数据发送时将 Update Bit 值设置为 1, 发送完成后将 Update Bit 设置为 0。

UpdateBit 作为判断信号或信号组数据是否被更新的标志,可通过配置项 ComUpdateBitPosition 进行配置 UpdateBit 在该 I-Pdu 所在的位置,用户在调用 Com 提供的发送服务接口函数时将信号对应的 Update Bit 设置为更新状态。

信号对应 UpdateBit 的清除, 根据该信号所在的 I-Pdu 配置项 ComTxIPduClearUpdateBit 配置的清除方式进行清除。
UpdateBit 的清除方式如下:

  1. Confirmation: 在 Com 模块调用 PduR 提供的 I-Pdu 发送服务接口函数 PduR_ComTransmit 时, 且收到发送完成确认(Com_TxConfirmation) 后进行清除。
  2. Transmit: 在 Com 模块调用 PduR 提供的 I-Pdu 发送服务接口函数 PduR_ComTransmit 时, 且发送成功后进行清除。
  3. TriggerTransmitPduR 模块调用 Com 提供的回调函数 Com_TriggerTransmit, 在调用成功后进行清除。

信号的超时处理

Com 发送信号的超时监控, 用于监控信号是否在配置的超时时间内发送完成。 在一个 I-Pdu 内的所有信号如果配置不同的超时监控时间, 则根据该 I-Pdu 内信号配置的最小超时时间进行计算。

I-Pdu 的超时监控在调用 PduR 发送数据服务接口函数时启动, 在接收到发送完成确认后该周期的 I-Pdu 发送超时监控结束, 如果 Com 监控到 I-Pdu 发送超时, 可根据信号配置的 ComTimeoutNotification 回调函数将超时状态通知给 Rte 层。

信号的传输方式

Com 模块可通过 ComTransferProperty 配置项配置发送模式, 详细模式配置如下:

发送模块PERIODIC(周期)DIRECT(触发)MIXED
PENDING当用户请求信号的发送时, 不会立即触发对应的 I-Pdu 发送, 只能根据 I-Pdu 配置的发送周期进行周期性发送。
TRIGGEREDI-Pdu 进 行 周 期发送在信号有发送请求时, I-Pdu 会触发发送一次。 如果ComTxModeNumberOfRepetitions配置了重复发送次数, 且配置ComTxModeRepetitionPerio 重复发送周期, 则进行周期触发发送I-Pdu 进行周期和触发发送
TRIGGERED_WITHOUT_REPETITIONI-Pdu 进 行 周 期发送I-Pdu 只会触发发送一次I-Pdu 触发发送一次,然后继续按照周期进行发送
TRIGGERED_ON_CHANGEI-Pdu 进 行 周 期发送当信号数据与上次发送的信号数据的值或长度不同时, 触发发送一次。 如果 ComTxModeNumberOfRepetitions 配置了重复发送次数, 且配置ComTxModeRepetitionPerio 重复发送周期, 则进行周期触发发送I-Pdu 进行周期和触发发送
TRIGGERED_ON_CHANGE_WITHOUT_REPETITIONI-Pdu 进 行 周 期发送当信号数据与上次发送的信号值或长度不同时, 触发发送一次I-Pdu 进行周期和触发发送

Signal 发送时序图

时序图较大,查看时可以在图片上右键选择 “在新标签页中打开图片”

请添加图片描述

Signal 接收流程

NeuSar 为例,梳理 signal 接收流程:

  1. Can 驱动模块接收到报文会调用接口 CanIf_RxIndication 通知 CanIf 模块
  2. 在通过所有过滤器和验证检查后,成功接收到发送给 CanIfCAN Rx LPDU ,调用 CanIf_RxIndication_ProcessPDU 进行解析
  3. CanIf 调用 PduR_CanIfRxIndication -> PduR_LoRxIndication 回调函数,将数据上传到 PduR
  4. 调用 PduR_Route_UpRxIndication ,表示收到下层通信接口模块的 I-PDU。即,当 PduR_<Lo>RxIndication 被调用时,PDU Router 模块将为每个目的上层模块调用 <Up>_RxIndication
  5. 调用 Com_RxIndication ,通知 Com ,表示收到下层通信接口模块的 I-PDU
  6. 调用 Com_RxIndicationProcess 处理 I-PDU 数据
  7. 调用 Com_RxSignalAnalysis_Process 解析信号,调用 Com_RxSigRead_Normal 获取解析出来的 Signal 值,再根据数据类型调用 Com_RxSigUbInvFilterProcessI8 或其他对应函数将接收到的数据存储在 Com_RxSignalInfo[sigIdx].sigRTEValue
  8. 调用 Com_RxSigNotification_Handle 回调函数,通知 RTE 接收完成,更新 RTE 层的 全局变量
  9. 通过 RTE 接口调用 Rte_Read_XXX_XXX 函数,内部再调用 Com_ReceiveSignal -> Com_ReceiveSignal_Process ,将存储在 RX BuffSignal 值赋给 RTE 中的全局变量

接收信号的 UpdateBit

如果接收的信号或者信号组配置有对应的 UpdateBit 数据更新位, Com 先解析对应 UpdedateBit 对应的信号数据, 如果 UpdedateBit 为 1, 代表对应的信号数据有更新并进行解析。

Signal 接收时序图

请添加图片描述

Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源

配置 COM 模块,需要导入 DBC 文件

一般来说,一个 DBC 文件中含有多个 Node;一个 PDU 相当于一个 message,而 COM 模块由多少个 PDU ,与导入 DBC 时选择的 Main Node 有关。

在这里插入图片描述
BMS 节点为例:
请添加图片描述

Node Tx Messages 有10个,Rx Messages 有2个,所以

extern CONST(COM_TxPduInfo_st, COM_CONFIG_DATA) Com_TxPduInfo[COM_TXPDU_NUM]; // COM_TXPDU_NUM = 10
extern CONST(COM_RxPduInfo_st, COM_CONFIG_DATA) Com_RxPduInfo[COM_RXPDU_NUM]; // COM_RXPDU_NUM = 10

Node 下,Tx Messages 共有 29 个 signalRx Messages 共有 4 个 signal,所以

extern CONST(COM_TxSignalInfo_st, COM_CONFIG_DATA) Com_TxSignalInfo[COM_TXSIG_NUM];  // COM_TXSIG_NUM = 29
extern CONST(COM_RxSignalInfo_st, COM_CONFIG_DATA) Com_RxSignalInfo[COM_RXSIG_NUM]; // COM_RXSIG_NUM = 4

Com_TxSigGrpInfo / Com_RxSigGrpInfo

在这里插入图片描述

1. Signal Group 概念

Com 模块控制 I-Pdu 数据的接收和发送, 在系统网络状态激活以后可由 BswMCDD 模块调用 Com 提供的 Com_IpduGroupControl 服务函数控制 I-PduGroup 是否需要激活, 只有在 I-PduGroup 的状态为激活状态时, 对应的 I-Pdu 才能进行数据的接收和发送。

多个 Signal 可以组成一个 Signal Group。一个 Signal Group 中只能包含同一消息中的 Signal

从下面可以看出,信号组和普通信号的图标不同

在这里插入图片描述

下面问答参考:https://www.elecfans.com/d/1936426.html

  1. 问题1:什么是Signal Group,为什么要用Signal Group?
  • 答:为了支持复杂数据类型的AUTOSAR概念,AUTOSAR COM提供了信号组的解决方案。AUTOSAR COM模块一致地发送和接收信号组,为复杂数据类型提供必要的一致性。通俗的来讲,Signal Group就是一个IPDU里面的几个Signal的集合,这几个Signal的操作需要保持一致性(也就是如果外部发送方有对这几个数据中一个或多个数据有改动,那么接收方也需要同时更新,比如车道线的一阶参数、二阶参数、三阶参数、常数项是4个不同的Signal,这4个Signal就需要保持一致性,不然到最后仪表上画出来的车道线就会偶发的和实际不一样)。
  1. 问题2:什么是Shadow buffer,Shadow buffer机制为什么能保证数据的一致性?
  • 答:本来COM模块为每个Rx SignalRx Signal都设有一个Signal Buffer的,Signal数据的收发都通过这个Signal来实现。如果Signal GroupCOM模块为每个Signal Group又额外设置了一片Signal Group Buffer,这片Buffer就是所谓的Shadow buffer。在发送Signal Group的时候,将Signal Group拷贝到IPDU Buffer的时候是原子操作(也就是拷贝前关闭全局中断,拷贝后打开全局中断,保证拷贝过程不被中断干扰)保证了Signal Group数据的一致性。
  1. 问题5:RTE在获取一个Signal时,如果这个Signal属于一个Signal Group,那么Signal的值从Signal的buffer获取还是Shadow buffer获取?
  • 答:从Shadow buffer中获取。

2. Com_TxSigGrpInfo / Com_RxSigGrpInfo

COM_TXGRP_NUMCOM_RXGRP_NUM 分别表示发送和接收信号组的个数

extern CONST(COM_TxSigGrpInfo_st, COM_CONFIG_DATA) Com_TxSigGrpInfo[COM_TXGRP_NUM + 1U];
extern CONST(COM_RxSigGrpInfo_st, COM_CONFIG_DATA) Com_RxSigGrpInfo[COM_RXGRP_NUM + 1U];

I-PDU、N-PDU、L-PDU关系

更多参考:https://blog.csdn.net/initiallizer/article/details/130040286

  • L-PDU:对应链路层的PDU,一般来说,我们称接口层(Interface,XX_If)为链路层,比如:CanIf、FlexrayIf等。更确切地说是 Driver和Interface 构成链路层。

  • N-PDU:网络层对应的 PDU,一般来说,我们称传输层(Transport,XX_Tp)为网络层,比如:CanTp、FlexrayTp等。

  • I-PDU:交互层(表示层)对应的 PDU

XX_If以上模块的信息交互依赖 I-PDUXX_IfXX_Tp模块的交互依赖 N-PDU

一般来说,小数据传输时,用XX_If;大数据传输时,用XX_Tp所以,在诊断的多帧传输时,XX_Tp层会将多个N-PDU缓存,直到一个完整的I-PDU接收完,之后通过 PduR送给DCM ,即:I-PDU = n * N-PDU(n是大于1的正整数)。

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

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

相关文章

RabbitMQ基础

目录 MQ MQ概述 MQ 的优势 1.应用解耦 2.异步提速 3.削峰填谷 MQ 的劣势 1.系统可用性降低 2.系统复杂度提高 3.一致性问题 使用 MQ 需要满足什么条件呢&#xff1f; RabbitMQ 简介 ​编辑RabbitMQ 中的相关概念 RabbitMQ 提供了 6 种工作模式 JMS java实现Ra…

成都睿趣科技:现在开一家抖音小店还来得及吗

随着社交媒体的迅猛发展&#xff0c;抖音已经成为了一个全球范围内广受欢迎的社交平台。在这个短视频应用上&#xff0c;人们分享着各种各样的内容&#xff0c;从搞笑段子到美食教程&#xff0c;再到时尚搭配和手工艺品制作。随着用户数量的不断增长&#xff0c;很多人都在思考…

python基础运用例子

python基础运用例子 1、⼀⾏代码交换 a , b &#xff1a;a, b b, a2、⼀⾏代码反转列表 l[::-1]3、合并两个字典 res {**dict1, **dict2}**操作符合并两个字典for循环合并dict(a, **b) 的方式dict(a.items() b.items()) 的方式dict.update(other_dict) 的方式 4、⼀⾏代码列…

软件生命周期及流程

软件生命周期&#xff1a; 软件生命周期(SDLC&#xff0c;Systems Development Life Cycle)是软件开始研制到最终被废弃不用所经历的各个阶段. 需求分析阶段--输出需求规格说明书&#xff08;原型图&#xff09; 测试介入的晚--回溯成本高 敏捷开发模型&#xff1a; 从1990年…

【AWS实验】 使用 Lake Formation 设置数据湖

文章目录 实验概览目标实验环境任务 1&#xff1a;探索实验环境任务 1.1&#xff1a;在 S3 存储桶中创建文件夹任务 1.2&#xff1a;加载 AWS Cloud9 IDE任务 1.3&#xff1a;将数据复制到 S3 存储桶 任务 2&#xff1a;设置 AWS Lake Formation任务 2.1&#xff1a;注册 Amazo…

基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析 准备说明配置过滤解密分析 准备 1&#xff09;nRF52840 Dongle 2&#xff09;Mesh节点 3&#xff09;手机作为配网器&#xff08;苹果手机安装nRF Mesh APP&#xff09; 说明 1&#xff09;节点使用的例程目录&#xff1a;nrf5sdkformeshv500src\examples\…

MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s)

0x0. 前言 我的 ChatRWKV 学习笔记和使用指南 这篇文章是学习RWKV的第一步&#xff0c;然后学习了一下之后决定自己应该做一些什么。所以就在RWKV社区看到了这个将RWKV World系列模型通过MLC-LLM部署在各种硬件平台的需求&#xff0c;然后我就开始了解MLC-LLM的编译部署流程和…

4.正则提取html中的img标签的src内容

我们以百度贴吧的1吧举例 目录 1 把网页搞下来 2 收集url 3 处理url 4 空的src 5 容错 6 不使用数字作为文件名 7 并不是所有的图片都用img标签表示 8 img标签中src请求下来不一定正确 9 分页 1 把网页搞下来 搞下来之后&#xff0c;双击打开是这样的 2 收…

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

智能合约安全,著名的区块链漏洞:双花攻击

智能合约安全&#xff0c;著名的区块链漏洞&#xff1a;双花攻击 介绍: 区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。但是&#xff0c;与任何技术一样&#xff0c;它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。在本文中&#xff0c;我们将深入研究…

论文阅读:SERE: Exploring Feature Self-relation for Self-supervised Transformer

Related Work Self-supervised 学习目的是在无人工标注的情况下通过自定制的任务&#xff08;hand-crafted pretext tasks&#xff09;学习丰富的表示。 Abstract 使用自监督学习为卷积网络&#xff08;CNN&#xff09;学习表示已经被验证对视觉任务有效。作为CNN的一种替代…

Bootstrap的行、列布局设计(网络系统设计)

目录 00-基础知识01-等宽列布局02-指定某一列的宽度03-根据内容自动改变列的宽度04-五种预定义列宽度 .col、.col-sm-*、.col-md-*、.col-lg-*、.col-xl-*05-不同视口宽度按不同的分列方案划分06-删除列内容的盒模型的外边距07-超过12列怎么办&#xff1f;08-重新排列各列的顺序…

无人化在线静电监控系统的组成

无人化在线静电监控系统是一种用于检测和监控静电情况的系统&#xff0c;它可以自动地实时监测各个区域的静电水平&#xff0c;并在出现异常情况时发出报警信号。静电监控报警器则是该系统中的一个重要组成部分&#xff0c;用于接收和传达报警信号。 无人化在线静电监控系统通…

使用【宝塔+docker】在云服务器上部署基于SpringBoot 和 Dubbo RPC 的项目:踩坑记录

待部署的项目包括&#xff1a;前端front&#xff0c;服务提供者backend&#xff0c;服务消费者gateway&#xff0c;注册中心nacos 服务器信息&#xff1a;腾讯云入门级服务器2核2G&#xff08;后续有对服务器进行升级&#xff09; 部署工具&#xff1a;前端使用宝塔部署&#x…

风土是如何影响葡萄酒的?

风土的概念已经伴随我们几个世纪了&#xff0c;它有助于我们理解葡萄酒的生长条件和影响它的质量的因素有哪些。虽然这个术语在葡萄酒中已经存在了1000多年&#xff0c;但在葡萄酒爱好者中仍然被误解&#xff0c;接下来让我们来解释一下有关风土的文化与知识吧。 来自云仓酒庄雷…

K8S的介绍和架构

仅供入门 K8S的介绍和架构 一. 什么是kubernetes二、Kubernetes架构和组件 2.1 核心组件 2.1.1 Kubernetes Master控制组件&#xff0c;调度管理整个系统&#xff08;集群&#xff09;&#xff0c;包含如下组件: a、Kubernetes API Serverb、Kubernetes Schedulerc、Kubernet…

代码随想录笔记--二叉树篇

目录 1--递归遍历 1-1--前序遍历 1-2--中序遍历 1-3--后序遍历 2--迭代遍历 2-1--前序遍历 2-2--后序遍历 2-3--中序遍历 3--二叉树的层序遍历 4--翻转二叉树 5--对称二叉树 6--二叉树最大深度 7--二叉树的最小深度 8--完全二叉树节点的数量 9--平衡二叉树 10-…

CS420 课程笔记 P5 - 内存编辑 数据类型

文章目录 IntroductionData typesBooleansNegative numbers (Signed integers)Floating-point numbers (fractional numbers) Unknown value scansHealth findingFloat finding (Player position hack / Teleport hack) Additional things Introduction 这节课将结束数据类型并…

用Airtest快速实现手机文件读写与删除功能

1. 前言 前几天有同学留言&#xff0c;能不能安排“读写手机文件”的示例。我们今天就来实现这个小功能。 当然&#xff0c;熟悉adb的同学&#xff0c;看到这个需求&#xff0c;肯定很开心&#xff0c;不就是一个 adb push 和 adb pull 嘛&#xff0c;非常简单呀。 确实如此…

行业追踪,2023-08-31

自动复盘 2023-08-31 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…