2012年11月

Mac OS的另一面

我对Apple的了解,是在高中时从杂志中知道有IPod的mp3播放器开始。留在记忆中的,也只有那个被咬一口的苹果。显然,西北的少年对这家公司不太感冒。之后学习linux的这几年,知道Apple这个词不仅仅用来吃,还是一个公司的代表。第一次看到书上写着Apple家的Mac OS内核也是基于Unix,顿时觉得亲切了许多。Apple、代工、富士康、跳楼、环境污染、卖肾,这些词汇突然间充斥在各大媒体上,自此好感也渐渐淡了,多了几分反感。

后来,电影《Pirates of Silicon Valley》中对那段历史的描述,Jobs取代了Apple存储在我的大脑里。Apple、IPhone、IOS、IPad、AppleTV、Mac OS,相同的媒体用不同的词汇描述同一家公司。这次,不再纠结,只为寻找丢失在历史车轮下的残存事实。在Mac OS上附盖了太多的历史,应该品味下它们。

今天无意翻网页,看到这一系列文章,算是对历史的回顾。
以下文章转载自程序员网站

Mac OS X 背后的故事(一)力挽狂澜的Ellen Hancock
Mac OS X 背后的故事(二)——Linus Torvalds的短视
Mac OS X 背后的故事(三)Mach之父Avie Tevanian
Mac OS X 背后的故事(四)——政客的跨界
Mac OS X 背后的故事(五)Jean-Marie Hullot的Interface Builder神话
Mac OS X 背后的故事(六)Cordell Ratzlaff 引发的 Aqua 革命(上)
Mac OS X 背后的故事(七)Cordell Ratzlaff 引发的 Aqua 革命(下)
Mac OS X 背后的故事(八)三好学生Chris Lattner的LLVM编译工具链
Mac OS X 背后的故事(九)半导体的丰收(上)
Mac OS X 背后的故事(九)半导体的丰收(中)
Mac OS X 背后的故事(九)半导体的丰收(下)
Mac OS X背后的故事(十一)Mac OS X文件系统的来龙去脉(上)
Mac OS X背后的故事(十一)Mac OS X文件系统的来龙去脉(下)

My attitude

Tags: none

Twitter上看到有分享网易的“测试你的态度”,于是我也玩一把。下面是我的“态度”。测试链接如下:
http://news.163.com/special/votepage/
有点意思,不过想知道,我的宇宙还在银河系么

淡淡的疼

Tags: none

昨天,不,应该是前天。我用fstransfer想把/usr的xfs转换成ext4格式,结果当了小白鼠,error鸟。顿时,有种不详的预感,仔细看log,还好有backup,然后就很happy的mv去覆盖/usr。

悲剧的是今早给BOSS演示QT项目,擦,竟然编译不过,用armtools却可以编译,确保code没有问题。后来才想到,之前有动过/usr目录,看error也是

/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../include/c++/4.5.1/iosfwd:76:48: error: expected type-specifier before ‘char_traits’
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../include/c++/4.5.1/iosfwd:76:48: error: expected ‘>’ before ‘char_traits’
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../include/c++/4.5.1/iosfwd:79:48: error: expected type-specifier before ‘char_traits’

然后就想办法修复,最好的办法是重装,试了多次,终于找到是libstdc++-devel。
夜起,睡。

集显的悲剧

Tags: none

自从买来这个集显的本本,每次看flash视频时,CPU就会狂飚至99%左右,我只能说“再坚持一下,还有一集”。今天,这货竟然在全屏flash时出现白屏,每次都只能重启xserver。询问G哥,是flash是更新了,默认启用了硬件加速。F**k,我这集显本本还有什么可加速呀。现在只希望html5来得更猛烈些吧。
参考链接
http://www.gengu.org/20110721083205476.html

CAN通信调试记录

Tags: CAN总线

1.双方无法收发数据
手头有两块板子需要调试,RSB4210和mcf52259。之前,在loopback模式下都做了测试,是正常的。但两块连接后,就无法正常通信了。两块4210连接后调试是正常的,说明CAN收发器和驱动方面都是正常的。但与52259通信却不正常,从示波器上可以看到两块子的CAN发送数据都有相应的波形。与研华技术支持联系后,通加增加终端电阻也无法解决。后来,想到让两块板子发送相同数据来对比波形,看是否问题在CAN硬件部分。在公司硬件工程师的帮助下,发现两个波形的速度好像不一致,经过一番对比,发现是RSB4210的bitrate不准确,但又不知道换算关系。最终,多次测试后找到了50khz,与52259通信正常。

2.通信时出现一发多收的问题
mcf52259发一条,RSB4210却接受到上百条信息。最初遇到这个问题,冒然认为是RSB4210的驱动有问题。后来在BOSS的提醒下,对想到这个情况有可能是两双都有问题:
A.RSB4210的接收有问题,导致状态未清除,同一报文打印多次
B.mcf52259发送后,认为没有发送成功,然后就一直重新发送
刚开始,由于对CAN通信的原理不了解,导致问题的错误定位。看完CAN的通信原理后,当节点成功接受到一帧数据时,会发送一个ACK,是显性的。而发送节点检测到是显性位时,也就知道数据发送成功了。相反的情况时,发送节点就知道出现部问题,然后就会再次重发。这个问题的核心是,什么情况下RSB4210正确接受到多条信息,并且返回了正确的ACK,而MCF52259却认为的失败的数据?
通过对CAN通信的深入学习,终于找到了原因,mcf52259的flexcan位定时设置有问题。

总结:
1.明白所用工具的原理。刚开始在MQX系统上测试,后来总觉得有问题,就用裸机来测,这样是换个角度来确定问题。
2.深入原理。如今编程充斥着大量API,大家都在用接口,却对其原理知之甚少。想要合理使用,应该深入原理,才能扬长避短。
3.熟练使用常用工具。由于对示波器使用不熟,结果花了很长时间才找问题的本质。


参考文献
关于CAN报文中ACK应答错误的检测原理
CAN 总线中主动错误和被动错误的通俗解释
CAN总线的局限

多主通信之CAN总线

Tags: CAN总线

现在做的项目,有涉及到数据的采集,所以必然要用到传感器之类的。但是,工业中数据的采集点和管理点通常不在一个地点,远距离传输就是必须的了。之前常用是485总线,一主多从,比较适合集中控制和管理。项目中的采集点比较多,数据都要上传至管理器,也会下发各种命令来控制传感器和设备。最后,选择使用CAN总线。

CAN,Controler Area Network。20世纪80年代初,德国BOSCH公司为解决现代汽车中众多控制单元,测试仪器之间的实时数据交换而开发一种串行通行协议。CAN的物理连接使用两根线,称为CANH和CANL,传输时采用差分信号的方式,连接时CANH与CANH连,CANL与CANL连接即可。协议本身对节点个数没有限制,但通常由于线缆或其它干扰原因,有使用个数的限制。每个节点与总线的加入或断开,都是动态的,不会影响现有的其它节点通迅。总线上的数据是以广播的方式来发送的,这样连接在总线上的节点都可以收到同一数据。CAN总线的数据称为报文,区分报文是靠报文ID来确定,也是唯一的标识。实际使用时,并不是总有节点都会处理所有的数据,而是通过过滤器来选择需要处理的报文。

CAN transceiver在发送数据时,同时也会接收数据。完成这个功能,使用了非破坏性仲裁的载波侦听多路访问/冲突避免(CSMA/CA,Carrier Sense Multiple Access/Collision Avoidance)。
载波侦听(CS):各个节点在发送数据前都要侦听总线的发送状态。若有通信,则等待网络空闲;若空闲,则发送准备好的数据。
多路访问(MA):如果总线空闲,多个节点可以同时访问总线,向总线发送数据。
冲突避免(CA):节点在发送数据的过程中要不停地检测发送的数据,确定是否与其它节点发生冲突,并通过非破坏性仲裁机制避免冲突。

互联网通信是靠OSI/RM的七层模型,CAN通信也有类似的结构,有三层。物理层、链路层和应用层。
物理层:MDI(Medium Dependent Interface,介质相关接口),PMA(Physcial Medium Attachment,物理介质连接),PSL(Physical Singling Layer,物理信令子层)
链路层:MAC(Medium Access Control,媒介访问控制),LLC(Logical Link Control,逻辑链路控制)

CAN的标准有两个CAN2.0A和CAN2.0B,前一个规定了CAN的标准帧,后一个增加了扩展帧。
CAN的电平有三种,CANH为3.5v、CANL为1.5v和2.5v。逻辑电平有两个,0为dominant,1为recessive。在传输中,dominant比recessive的级别高。


参考文献
CAN http://hem.bredband.net/stafni/developer/CAN.htm
陈庆霆技术专栏
SocketCAN
Low Level CAN Framework
远距离CAN通讯终端电阻策略

计算CAN收发器的bit timing

Tags: CAN总线

在配置CAN transceiver的时候,有几个参数量要设置,这些量合在一起称为bit timing。由于CAN是异步且为多主结构,每个结点的transceiver在接收数据的时候,需要有一个参照标准,同时起到增强容错能力和减少传送的时间。

CAN传送数据是以Frame为单位,一个Frame里有多个bit组成。传送一个bit时需要一些周期,这段时间就称为bit timing。而bit timing又由多个TQ(Time Quantum,时间份额/量子)组成。

一个bit timing分为四个段,同步段(Sync_seg)、传播段(Prog_seg)、相位缓冲段1(Phase_seg1)、相位缓冲段2(Phase_seg2),单位为TQ,有8~25TQ。有些CAN把传播段和相位缓冲1合为一个段。
Sync_seg :用于同步总线上不同的节点,跳变沿在此段内产生
Prog_set :用于补偿网络内的物理延时时间,它是信号在总线传播的时间,输入比较器延时和输出驱动器延时总和的2倍
Phase_seg1 :用于补偿边沿阶段的误差,可通过重同步来加长或缩短
Phase_seg2 :补偿节点间晶振的误差

Sync_seg : 1TQ
Prog_seg : 1~8TQ
Phase_seg1 : 1~8TQ
Phase_seg2 : 2~8TQ

通过同步机制,可以消除相位误差带来的影响,保证信息正确解码。同步方式有硬同步和重同步。
硬同步:发生在报文开始时。在一个空亲期间,总线上的所有控制器在一个Sync_seg段从隐性位到显性位的跳变沿上,初始化自己的位周期定时,执行一次硬同步。
重同步:发生在报文位流发送期间,每一个隐性位到显性位跳变沿后。重同步根据引起同步边沿的相位误差,要么增加Tphase_seg1,或者减少Tphase_seg2,使采样点位于恰当的位置

了解了这些,最重要的问题是如何来配置这些参数,使CAN transceiver更好的工作。
1.计算CAN transceiver的工作周期及频率
物理器件的工作频率,要看芯片手册中时钟的相关内容,这样可以求出周期,单位是ns
Tsys = 1/fsys

2.计算BRP(Bit Rate Prescaler)
fsys/NBR = BRP
if BRP in (8, 25)
prescaler = BRP -1
else
BRP/prescaler in (8,25)

3.计算NBT(Nominal Bit Timing,位时间),单位ns
NBT = 1/NBR (NBR,Nominal Bit Rate,位速率)

4.计算TQ
TQ = Tsys*BRP (BRP,Bit Rate Prescaler,预分频因子)

5.计算同步段,单位TQ
同步段默认是1TQ,所以不需要计算了

6.计算传播段,单位TQ
TProg_seg = 2*(Delay_tranceiver + Delay_bus)
Prog_seg = Tprog_seg / TQ

7.计算Phase_seg1和Phase_seg2,单位TQ
if (NBT - Sync_seg - Prog_seg - 1)%2 == 0
Phase_seg1 = Phase_seg2 = (NBT - Sync_seg - Prog_seg -1)/2
then
Phase_seg1 = (NBT - Sync_seg - Prog_seg -1)/2
Phase_seg2 = Phase_seg1 + 1

8.计算RJW,单位TQ
RJW = min(4, Phase_seg1)

经过这七步,CAN收发器就可以工作了,但要有更稳定的工作状态,还要不断的调试,以确定最佳的参数。


CAN的bit rate可以理解为绝对值:不论can控制器的时钟频率为多少,1Mbps的bit rate的位时间就是1us,100Kbps的位时间就是10us。

两个CAN进行测试时,可以先通过固定bitrate和TQ个数来找到合适的参数,之后再适当调整优化。

参考文献
http://www.avrw.com/article/art_100_1903.htm
http://www.amobbs.com/thread-3937717-1-1.html
http://blog.21ic.com/user1/6291/archives/2010/67540.html
http://blog.163.com/dsp_lnint/blog/static/103167434200991210373137/
http://wenku.baidu.com/view/55d5deba960590c69ec376fa.html
http://longer.spaces.eepw.com.cn/articles/article/item/43570
http://blog.csdn.net/iamlaosong/article/details/6267076
SJA1000波特率计算器
CAN位定时和同步机制的分析
C8051F040单片机CAN控制器的波特率设置研究
CAN总线位定时控制的研究
CAN总线通迅速率设定
http://www.docin.com/p-145092724.html

http://wenku.baidu.com/view/55d5deba960590c69ec376fa.html

最新文章

最近回复

  • Blackrose: 感谢拍砖!嗯,那句话...
  • aa: “Raspberry...
  • Blackrose: 外部只是帮你把芯片启...
  • : 内部时钟比外部的频率...
  • Blackrose: 你这评论比正文更有内容么
  • 7hao: CR+LF ...
  • Blackrose: 可以是你更新软件源后...
  • sxk: 博主,我的系统是ub...
  • Blackrose: 你深得精髓么
  • qihao: 这篇文章的简单总结就...

分类

归档

其它