linuxcan程序write每次只能打一包

linuxcan程序write每次只能打一包,第1张

linux write 数据

linux write 数据,write每次最大能写多少字节的数据

北美黑胡桃

转载

关注

0点赞·576人阅读

背景

最近碰到一个线上的bug,具体情况是进程将24G左右的内存buffer写到磁盘上,但是每次write都写不完24G,然后重试导致磁盘写满,服务不可用。

在修这个bug的时候,对于到底write最大能写多少字节的数据产生了浓厚的兴趣,写了一个测试程序基本上每次最多写到2G多一点。

在研究了一段内核代码后一切霍然开朗。

write限制

write函数在以下三种情况下可能写入的字节数小于指定的字节数:

在底层的物理介质上没有足够的空间

RLIMIT_FSIZE的限制

写入被信号打断

从内核代码来看,count在大于MAX_RW_COUNT的情况下,会赋值为MAX_RW_COUNT

而MAX_RW_COUNT是一个宏,展开为:INT_MAX & PAGE_MASK

INT_MAX也是一个宏,展开为((int)(~0U>>1)),也就是无符号数0取反后右移一位转换成int类型,也就是2^31

PAGE_MASK也是一个宏,展开为(~(PAGE_SIZE-1)),而PAGE_SIZE展开为(_AC(1,UL) << PAGE_SHIFT),PAGE_SHIFT的值为12,也就是每页的大小是212,也就是说1左移12位,PAGE_SIZE的值为212,然后PAGE_SIZE-1取反

最后MAX_RW_COUNT的值为INT_MAX & PAGE_MASK,也就是说MAX_RW_COUNT的值是int的最大值最后12位屏蔽掉,保持4K地址对齐

所以理论上讲,每次write可写的buff大小是231-212=2147479552,这也是与实际的测试结果相一致

CAN标准中规定,设定的波特率与实际波特率偏差不得超过±1%。

对于真实的波特率大小可通过眼图测量来获取,如图1 1所示,可知该通信的位时间为4us,即波特率为250kbps。由于眼图是通过无数个位的真实波形叠加而成的,所以测出的数值可信度最高。

首先,请看这份恒润工程师写的论文《CAN总线系统测试技术》。

里面基本描述了CAN总线开发的流程,但主要侧重于CAN总线的测试,不过也能让你有所了解。

根据你的描述,假设你的要求是:能够基于某嵌入式平台(最好该平台在汽车ECU开发中被广泛使用),根据给定的通信协议(一般由通信矩阵描述),编写CAN接口代码,并能通过相关设备进行简单测试。

推荐的学习步骤为:

1 了解CAN基本知识

可以通过这个ppt,恒润的东西还是不错的。

CAN基础_百度文库

2 直观的了解CAN

这需要你购买或借用CAN总线检测设备,档次差很多。如果是你自己想玩,可以买个周立功的USB转CAN,淘宝也就几百块钱。如果是课题组采购,可以买个Kvaser的USBCAN,几千块吧。大致这个样子。

要是土豪的话,可以买Vector的VN1600,这个就好几万了。以上三种我都用过。一定要买双通道,然后一个口发,一个口接,可以自己接延长线通过示波器看信号了。尝试修改报文ID,数据,波特率等等,看示波器的变化,对理解第一部分的内容很有帮助

3 选择嵌入式平台,学习CAN接口的编程

飞思卡尔MC9S08DZ60MLH 8位汽车级CAN总线 开发板 学习板超

可以选择这个小板子练习一下,程序的写法都是差不多的。然后和第二部分的总线检测设备连在一起进行测试。

这一步需要详细了解信号转换的知识,特别是Big Endian和Little Endian的区别,factor和offset的作用,如何置1或置0,可以参考DBC_File_Format_DocumentaTIon_百度文库,很详细,看完就懂了。

4 如果有兴趣,可以看看J1939协议(用于商用车)或者CANOpen协议(用于现场控制,很多电机控制器使用)或者ISO 15031-5(用于OBD诊断)。

最后,希望你在了解CAN以后,不要花过多的精力在底层上,基本都是体力劳动。体现价值的还得是上层。请看看一汽技术中心的相关招聘要求:

工作职责

1设计新能源汽车网络拓扑和制定网络技术需求;

2制定新能源汽车网络通信需求、网络通信矩阵和网络数据库;

3设计和开发新能源汽车网络通信协议仿真试验、网络通信规范、网络线束规范;

4设计新能源汽车网关控制器及具有相同网络通信功能的接口控制器产品定义与技术规范;

5负责新能源汽车电子电气开发过程中的问题解决,配合生产和售后服务。来源:知乎 作者:Wang Yu

汽车CAN报文分析工作说白了就是汽车数据的翻译破解工作。为了完成这一工作目标,我们需要如下条件:1、汽车CAN报文分析者需要具备一定的CAN总线知识,如果自身不具备,那就需要邀请专门具备此项技能的工程师进行代劳了,毕竟这项工作是一个很考验专业技能的工作。2、合适的CAN分析仪工具,俗话说,巧妇难为无米之炊,有了专业的汽车CAN报文分析能力并不代表你就一定能做好这项工作,没有硬件CAN分析仪工具的支持,工业也难以开展下去。一般来说,此类CAN分析仪有单通道双通道多通道等不同种类,使用者应该根据具体的实际情况进行选择,而不是造成相应的资源浪费。

感谢题主的邀请,我来说下我的看法:

只要是需要电脑进行功能配置的CAN设备,它们基本都应该有一个USB接口,可能这个接口你从设备的外面就能够看到,而有的,则需要你打开设备的外壳,从电路板上找到。找到设备的USB接口以后,我们就可以通过USB线连接器与装有配置软件的电脑,完成相关程序的下载了。一般在程序配置完成以后,我们需要给设备重新上电才能应用配置的功能。现在你清楚了吗?如果您需要相关的can总线通讯模块的话,可以前往我们的网站进行具体的咨询,欢迎来访。

以上就是关于linuxcan程序write每次只能打一包全部的内容,包括:linuxcan程序write每次只能打一包、如何利用程序判断CAN总线的波特率/通讯协议、如何进行汽车 CAN 总线开发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9731522.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存