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

Davinci代码是如何实现Autosar-CanTsyn模块功能的

写在前面:
入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!!


ok,时间同步离不开Tsyn模块。以CanTsyn模块代码为研究对象,梳理下它都实现了什么功能。

0.时间同步原理

因为报文填充到报文发送出去是需要时间的,上图目的是为了将额外所需的时间计算出来,尽可能减少Master和Slave之间的偏差。

上图怎么理解呢?(我也不清楚为啥T3 T4是反着的)

  • T0时刻Master通过StbM模块获取此时全局时间t0,填充到Sync报文里。(我想立即发送,但我做不到。)
  • T1时刻,这条Sync报文被Master发送出去了,此时全局时间是t1。
  • T2时刻,Slave接收到这条Sync报文,报文中包含信息:t0。同时Slave也能获得此刻本地时间t2。
  • T4时刻,Master将本地计算的t1-t0,通过Fup报文发出去。
  • T3时刻,Slave接收到这条Fup报文,报文中包含信息:t1-t0。同时Slave也能获得此刻本地时间t3。

那么如果此刻作为Slave,以上信息是足够我计算了。在不考虑报文传输时间的情况下

T2时刻全局时间 = t1 = t0+(t1-t0)

T3时刻全局时间 = T2时刻全局时间 + (t3-t2) = t0+(t1-t0)+ (t3-t2) = t3-t2+t1。

1.Sync和Fup报文格式

2.作为Master应该做什么?

基于上图流程,作为Master我应该按一定时间间隔依次发送Sync、Fup报文,并通过StbM模块获取所需的时间填充到报文中。

这时我们知道,如果想要Slave能够计算得到全局时间,同时需要Sync报文和Fup报文,那么就有必要规定下他俩之间的时间间隔。以及需要考虑当Sync报文发出后,一定时间内若Fup报文没有发生成功,是否需要重新发生Sync报文。我们通过CanTSynGlobalTimeTxPeriod来定义Sync和Fup报文的时间间隔,通过TxConfirmationTimeoutCounterOfMasterState来定义Fup报文发送超时时间

那么看代码实现:

通过CanTSyn_Tx_Update实现Master发送Sync、Fup报文。

2.1Master状态机

作为Master会存在一个状态机:

2.2如何发送Sync报文
2.2.1TxPeriodCounterOfMasterState

由于Sync、Fup报文使用同一个CAN ID,那么需要保证单一类型报文发送周期是固定的。

代码中使用TxPeriodCounterOfMasterState,判断TxPeriodCounterOfMasterState == 0,决定是否发送Sync报文。


当每次周期函数调用CanTSyn_Tx_Update时,会将TxPeriodCounterOfMasterState--
同时当Sync报文发送成功后,会调用CanTSyn_Tx_ResetTxPeriodCounter函数重置TxPeriodCounterOfMasterState。只要当上次成功发送Sync报文距离现在时间间隔超过规定时间时,才会允许发送下一帧Sync报文。

2.2.2获取CurrentTime

解决完报文发送周期,接下来看一下报文是怎么填充的。

在函数CanTSyn_Tx_GetTimeSync中调用StbM_BusGetCurrentTime,获取当前时刻的全局时间t0,以及当前时刻VirtualLocalTime:localTimeT0Vlt,储存起来。

2.2.3更新SequenceCounter

为了Slave判断接受到的Sync、Fup是否是同一对。每一对Sync、Fup报文中SequenceCounter是一致的。在CanTSyn_Tx_IncrementTxSequenceCounter中实现SequenceCounter递增。

2.2.4发送报文&赋值TxConfirmationTimeoutCounterOfMasterState

函数CanTSyn_Tx_AssembleSyncMsg完成bit填充,CanIf_Transmit发送Can报文。之后会赋值参数TxConfirmationTimeoutCounterOfMasterState,判断Fup报文是否会在规定时间内发送出去。若发送失败,则状态机跳转,重新发送Sync报文。

2.2.5CanTSyn_TxConfirmation

报文发送成功后,会进入回调函数CanTSyn_TxConfirmation,当Sync报文发送成功,会调用StbM_GetCurrentVirtualLocalTime再次读取当前时刻VirtualLocalTime:localTimeT1Vlt,由此可以计算localTimeT1Vlt-localTimeT0Vlt.

2.3如何发送Fup报文
2.3.1填充报文内容

状态机跳转到CANTSYN_STATE_SEND_WAITING_FOR_FOLLOW_UP_SEND后,开始进入Fup报文发送工作。填充localTimeT1Vlt-localTimeT0Vlt以及SequenceCounter,并发送报文。

2.3.2CanTSyn_TxConfirmation

发送成功后在函数内切换状态机。

3.作为Slave应该做什么?

todo

http://www.jsqmd.com/news/652567/

相关文章:

  • 如何使用ONNX Simplifier优化模型:生产环境部署的完整指南
  • 别再手动调亮度了!用Python+OpenCV直方图均衡化,5分钟让模糊图片变清晰(附完整代码)
  • 探索ComfyUI-WanVideoWrapper:解密AI视频生成的核心架构与实战应用
  • 避坑指南:ESP32连接多个I2C传感器(OLED、BH1750)的常见问题与解决方法
  • TongWeb应用部署实战:从单机到集群的路径选择与避坑指南
  • 别让Simulink生成的代码拖慢你的嵌入式系统:手把手教你配置这7个关键优化选项
  • OV5640摄像头模组选型与二次开发避坑指南:DVP vs MIPI接口到底怎么选?
  • 从时序到中断:手把手教你用C51单片机定时器实现一个精准的1秒LED闪烁
  • 如何利用Bootstrap实现高效用户体验监控:从行为收集到数据分析的完整指南
  • 别再问工厂要什么文件了!用Altium Designer 19生成Gerber文件,这份保姆级教程一次讲透
  • 微信小程序下载PDF的‘隐藏’路径揭秘:wx.env.USER_DATA_PATH到底存哪了?怎么删?
  • 手把手教你打造个性化动态彩色二维码生成工具(GUI版)
  • 别再死记硬背LTL公式了!用Python+Spot库5分钟搞定互斥锁与进程公平性验证
  • 终极指南:Mantine TypeScript集成实现类型安全组件开发全流程
  • 敬老院管理|基于springboot + vue敬老院管理系统(源码+数据库+文档)
  • XUnity.AutoTranslator深度解析:如何用5层架构重构Unity游戏本地化体验
  • 如何快速掌握Mint语言编译原理:从源码到JavaScript的转换全过程
  • 嵌入式Linux--全志V3s--NOR Flash分区与文件系统实战(一)
  • 计算机毕业设计:Python海洋与淡水渔业资源监控大屏 Flask框架 数据分析 可视化 数据大屏 大数据 机器学习 深度学习(建议收藏)✅
  • 如何利用TypeScript提升clean-code-javascript项目质量:静态类型检查的7大优势
  • 终极指南:PMD与元编程集成如何实现代码生成质量管控
  • Python 爬虫实战:批量抓取免费代理IP地址,提升网络爬虫效率与匿名性
  • 避坑指南:在安卓Termux里用QEMU装Win11最容易踩的5个雷(附解决方案)
  • 镜像视界·普陀研究院:厘米级无感定位,开启全域无设备空间智能革命
  • wxBot数据库集成终极指南:实现消息持久化与历史记录管理
  • Navicat Premium 16最新版SQL文件导入实战(附UTF-8编码最佳实践)
  • 您的AI助手为何总是“看不懂“网页?一个前缀让大语言模型真正理解网络世界
  • 终极指南:Yii2 FecShop社区生态与未来发展——开源电商系统的演进之路
  • ART库装饰功能详解:218种装饰让你的文本脱颖而出
  • Gumbo-Parser编译优化终极指南:如何平衡性能与代码体积