20120126

整理书架子

整理书架子
从除夕那天,我开始整理书架子。有两年没整了,自从上次挪书架子,把书都卸下来,突然有什么任务,没有时间按类别放回去,后来的书有很多就直接堆起来。
混乱一旦开始,就会愈演愈烈,直到,最近决定全都重新整理一遍。
整理书架是个体力活,同时也是梳理知识结构和学习过程的思考。
这几年,似乎一共整理了四五次吧,一般是搬家以后,或者乱得自己受不了。最初的一批书,是大学毕业的时候幸存的几本,教材加上特别钟爱的,没有卖掉。由于我彼此那么痛恨自己的专业,以致于把绝大部分教材都扔掉了。过了很多年,或者说,越是到了后来,我越发现,本科的学习所形成的世界观和方法论,深入到了骨髓,深入到你自己都不知道它们在那里。一个不太好的比喻,就像有些小资口声声谈西方思想什么的,但是骨子里,如果你深挖,却发现他们比上位的那些人更加东方。这里的东方,丝毫不含神秘哲学或者我们的文化的褒义。
这第一批书,几乎都是理工类的。
再后来的一批书,是从旧书市场上买到的,有各种品相。大多暗黄了,书页卷曲。这些书,好多在购买前就已经看过了,有些知识甚至都已过时,尤其是小时候就特别想拥有的那种,虽然借着看过几遍,仍然买了珍藏。这第二批书,大部分是人文类的,持续了好多年,有一些和第三批书的购买时间重叠,甚至延续到那以后。
第三批书,是读研究生期间,到了期末,突然说是有一笔经费,可以买U盘,或者买书。我全都用来买书了。这一批书中最重要的是计算机网络方面的几本专著。当时,我仍然未能清楚地知道,网络和系统管理
(现在流行叫做系维)的知识结构和职业前途与程序员是完全不同的。最终,计算机网络与通信,130厘米左右;操作系统45厘米左右。
第三批书当中,包括我最初读的英文原著,Douglas E. Comer的 计算机网络与因特网,和 Andrew S.
Tanenbaum的现代操作系统,封皮上有马戏团的那个。如果不算文档和电子版,这两本是最初读物。
很多人读书需要心态,或者心情,或者油墨的清香,或者纸张的声音。那纯粹是家里有钱惯出的...特质。读书所需要的,不过是一个能站立或坐下的地方,然后,就是书本身。至于它的材质,是纸的,电子的,印刷质量如何,在能找到书就高呼万岁的时候,这些统统不必考虑。
那两本书,是在不上课的时候,一页一页慢慢看完的。我的英语那个时候极差,不是说现在有多么好,那时我差到除了英文文档,基本看不懂别的什么。英语老师建议的小说啦电影啦新闻啦,没一样能流畅看明白的。不能看懂四级阅读,但是能阅读英文文献,其实也没啥奇怪的,因为二者所需要的词汇量的范围大不相同。后来单词量增长的时候,我注意到,很多单词,我都是首先知道它在计算机领域的含义。
读书,我们所需要的,只是几个小时的时间。
以后的书,基本不是成批购买了,需要哪方面的,就添置点啥,逐渐多起来。软件工程的,175厘米左右;文学类的,大约两个175厘米。
就阅读的时间分配,我在软件工程方面分配的时间远多于文学类的,尽管文学类的量大约是软件工程的二倍。这也是个有意思的事情,为什么理工学生的工资要比文学类的高,因为第一理工类学生花费了更多的时间来学习。第二,如果仅仅是浏览观赏性地阅读的话,读文学类的书是一种休息,没有人应该为你休息付钱的。而即使是观赏地阅读理工类书籍,即使那最终确实是一种愉悦的话,也是一种劳累的愉悦--这跟在健身房的努力差不多。
我曾经计划读某小说好几年,后来几天就看完了。那是我第一次发现,啊,以完全没有注意到,原来这两种不同的作品的阅读速度差别如此之大。
上述关于文学类学生工资的讨论,不包括那种牛到可以指导别人观赏,或者创造出作品来供别人观赏的同学。不幸的是,从现在的影视作品或者评论来看,文学类同学应该可以达到更高的水平,而不仅是自己没事欣赏一下自己的快乐。
是的,我们的理工很糟烂,可能除了这个词,不足以形容我们目前的水平在世界的地位;文学类,如果用糟烂这个词来形容,是对糟烂这个词的侮辱。
整理书架子,也回顾了一些知识学习的艰辛。有90厘米纯粹各种计算机语言的书,还有同等长度的书,是用这些语言调用网络、API、MFC什么的。后者不包括数据库调用之类的,这些基本上只有电子文档,而没有书籍。当年为了学习网络编程
(不是指 web programming,是指socket)
,MFC和API,也着实花了不少工夫,但是俱往矣。这些知识一旦获取了,如果不需要进一步深入研究的话,它就只是知识,而不是方法。
一大悲哀。我们要花很多时间,才能知道,有一些东西,恰恰不是你想要的;而如果你不花上这么多时间,你根本无法知道那是什么,更不必说了解那是不是你的目标。
而那个时间,你往往找不到一个人能够和愿意告诉你。即使有那样一个人在你的身份,年少轻狂,你也不一定就会相信。
然后,很多个小时,很多年,就这样流逝。再也不会重来。
要整理书架子的一个原因,我发现如果书堆在那,根本就想不起来看它,甚至忘了它的存在,或者记得有这本书,但是却找不到它。很多年过去以后,我发现,很多书需要重读,一遍一遍重读,每一次,你可能会有新的收获。那些需要重读的书,恰恰与前面提到的api,mfc的使用那种书不同,它们是历久弥新的。每一次读,你都有不同的动机,又深入地了解了作者这么写这么说的原因。
就像锻炼身体,只有你亲自流汗,然后才能了解,为什么教练或书里说,要这样动作,要避免那样,为什么呼吸而不是别的,才是最重要的。
就像大三和弦是明亮的,小三和弦是暗淡的,甚至是蓝色的绿色的。你不亲自去听,跟你说了也是白扯。有很多书,很多特别好的话,在我这里,就这么白扯过去了。时常感叹,如果当年就能明白那些,该有多好啊。
同学们现在都喜欢看视频了,喜欢在网上找个贴子。但是,真正的知识,尤其是深刻的那些,且不说需要训练才能掌握的,往往不可能容纳在一个贴子的长度之中。这就是几十年来,也许更久
(?),学者们提到的浮噪。我们浮噪到马上就要看到结果,马上就要得益,马上就要看到作用。
我们在网络里跑来跑去,不断去点击5分钟以下的小视频。我们看各种大片的特效。我们不断地转移注意力。我们从成年人,退化为三五岁的孩子,注意力只能保持三五分钟,甚至更短。又或者,我们中的一些希望得到成年人权利的人,从来也没有成年过,无所谓退化。
迅速反应,而不沉思,这正是动物而非人类的特性。
我把那些读过的书,收在书架上。开始制定漫长的计划,很多,都要重读一遍。
我抚摸那些书页,回想我曾经阅读它们的时光。
有一本,C++ Primer。那一年除夕的晚上,我坐火车返回通化。整个车厢里只有三两个人,还包括列车员。我一直低头读这本平时没有时间看的大部头。从上次读到的地方开始,几个小时,我读了平时几天几个月的页数。
不能做实验,也不能上网。我只能用纸记下所有的疑问,记下所有的收获。
晚上十点左右,外面漆黑的天空开始亮起焰火,在车轮的隆隆声里,那些光亮此起彼伏。C++ Primer,就是在这时读完了最主要的部分。
有一本,ZigBee技术实践教程,包师弟借给我的。前两天的某夜,我独坐在桌旁,喝光了咖啡,次序翻过那些书页。不能做实验,也不能上网,猜测作者的意思,用纸记下疑问和收获。凌晨五点的时候,天边开始有了亮光,书还剩下一章。
这个时候,我们才知道,那些短暂就能获得的快乐,并非我们真正想要的,它们也会瞬间就消失。

20120117

音程示范歌曲,lilypond example

音程示范歌曲,lilypond example
下面的文件是音程示范歌曲,lilypond源代码,可以生成pdf文件,五线谱带歌词的。
音程,比如,用简谱表示1=C时,1和2的距离与5和6的距离是相等的,3和4的距离与7和1的距离是相等的。
lilypond [http://lilypond.org/]
是著名的音乐engraving程序。有人把engraving翻译成雕版,这也正是这个词的本意。在这里,并不特别强调采用这种工艺,而是表达一般地指美丽漂亮的印刷乐谱的工具。
希望对其他也跑调的同学有所帮助,也可以作为lilypond的示例文件,语法忘了的时候参考一段。
又想起了刘俐俐和张绍刚的事件。
有同学评论,大致意思是这样的:当Boss问到问题的时候,都是有动机的,你应该小心作答。比如,领导问,你爱好些什么啊。你千万别说什么英雄双行体,那表明你不合群。你应该说,我喜欢二人传,这表明你尊重民间艺术,或者品味低下;你应该说,我喜欢歌剧,这表明你品味高雅,或者崇洋媚外。
一个人喜欢什么,怎么可能会因为问的人不同而有所变化?唯一的可能就是假装,或者你无法判定他是不是假装[参见《士兵突击》中的成才同志。同志,呵呵。]。
的确,有些人喜欢下属 (如果有这么个阶级,并且因为经济基础而能决定上层建筑甚至人格的话)迎和--即,你说的内容并不重要,但是要对上级的胃口。很多对白都有背后的意思[参见《红楼梦》],虽然很累,但是揣摩有时必不可少。不过,这并非意味着你揣摩完了就一定要赞一个,即使从功利的角度看,也并非每个领导都好这一口。你注意到网上那些对张的反对的声音了么,并非每个看起来像愤怒青年的都是loser,很有一些是winner,这从行文风格和内容可以看出。你可以选择和这样的人合作。
所谓"求职",并不像这两个字求暗示的,是"求"什么人"求"什么东西,无论市场供需如何,那也只是"找"一份工作,而不是"乞求"。有些女士的态度在这时非常正确,她们说,"就是世界上只剩你一个男人了,也绝不嫁你。"
求职确实是有底线的,那就是尊严。如果现在我低头从你胯下钻过,那么,今后呢?我们可以表达对领导的尊重,毕竟工作中的事务的决定权需要尊重地执行,但是并非一定要向他们展示假的自己。有时,所要做的是,告诉他们,我的这些爱好,与工作无关。我只是来工作,又不是卖身为奴;我热爱我工作的内容,但是不必也同时热爱领导你。
说到这里想起博士面试的时候,主任问的一句话,"听说你们搞计算机的都喜欢玩游戏,你玩不?"
我心想,玩啊,很爱玩,不爱玩游戏的,而爱计算机的没几个啊。
我的答复是非常缓慢地说:偶尔。
我庆幸这个世界上有程序设计和自然科学,它们的评判者高于人类和权力。我庆幸这世界上有音乐这样的东西,它的美丑虽然可能大家各执一词,却都是纯净的。
关于程序设计,补充解释一句。人类思考的规则,是人类发现的,却并非由人类所规定。对不,偶像?
"安能摧眉折腰事权贵,使我不得开心颜。"这句话我以前引用过一次,当时在人事处工作,处长问,"杨啊,你有没有座佑铭",然后我傻了吧唧地答了这么一句。所以,对读这贴子里知道典故的老家伙们来说,现在再引用容易笑场。
我补充一句吧,那些用来威胁我的,我愿意全部放弃。而剩下的,编程序,就像自己写作,在心里唱歌,谁又能禁止得了。
让我们歌唱,由关注音律、法则、美,不要关心那些狗P"柯老师"们的看法。
\version "2.12.3"
\header{  title = "音程示范歌曲"}
% 鲜花曾告诉(3 4)我你怎样(1 2 1)走过 小二度 大二度 《同一首歌》
\markup {  上行}
\markup {  大二度 同一首歌}
{\time 4/4 \huge \set fontSize = #3 g2 c'4 d'4 | e'4. f'8 e'4
c'4_\thumb | d'2_\thumb c'4_\thumb a4 | c'1 |}\addlyrics { 鲜 花 曾 | 告 诉
我 你  | 怎 样 走 | 过 }
\markup {  小二度 同一首歌}
{\time 4/4 \huge \set fontSize = #3 g2 c'4 d'4 | e'4._\thumb
f'8_\thumb e'4 c'4 | d'2 c'4 a4 | c'1 |}\addlyrics { 鲜 花 曾 | 告 诉 我 你
| 怎 样 走 | 过 }

% 不要(5 6)问,不要说            大二度     《祝福》
\markup {  大二度 祝福}
{\time 4/4 \huge \set fontSize = #3 c'2.  g8_\thumb a8_\thumb | c'4
d'8 e'8 d'4 e'8 g'8}\addlyrics {你。 不 要 | 问 不 要 说 一 切 }
% 大风从坡上刮过(5 6)            大二度      《黄土高坡》
\markup {  大二度上行 黄土高坡}
{\time  4/4 \huge \set fontSize = #3 f'4 f'8. e'8 d'8 d'8  c'8_\thumb
d'8_\thumb}\addlyrics { 大 风 从 坡 上 刮 过 }
% 我们(3 5)坐在高高的谷堆旁边 小三度 《听妈妈讲那过去的事情》\markup {小三度上行 听妈妈讲那过去的事情}{\time
2/4 \huge \set fontSize = #3 e'8_\thumb g'8_\thumb a'8 g'8 c''4 b'8.
a'16 g'8 a'8 g'8 e'8 ~ e'1
}\addlyrics { 我 们 坐 在 高 高 的 谷 堆 旁 边 }

% 长亭外,古道(6 1[高])边        小三度     《送别》
\markup {小三度上行 送别}
{\time  4/4 \huge \set fontSize = #3 g'4 e'8 g'8 c''2 a'4 c''4_\thumb
g'2_\thumb}\addlyrics { 长 亭 - 外 古 道 边 }
% 明天你是否会想起(5 7)          大三度     《同桌的你》
\markup {大三度上行 同桌的你}
{\time  6/8 \huge \set fontSize = #3 g'8 g'8 g'8 g'8 e'8 f'8
g'4._\thumb b''4._\thumb}\addlyrics { 明 天 你 是 否 会 想 起 }
% 月亮在白(2 5)莲花般的云朵里    纯四度    《听妈妈讲那过去的事情》
\markup {纯四度上行 听妈妈讲那过去的事情}
{\time  2/4 \huge \set fontSize = #3 s4 a'4 | g'4. e'8 | d'8._\thumb
g'16_\thumb e'8 g'8 | d'8 c'8 a8 c'8|}\addlyrics { 月 亮 在 白 - 莲 花 般 的 云
朵 }
% 风中(3 6)有朵雨做的云 纯四度 《风中有朵雨做的云》
\markup {纯四度上行 风中有朵雨做的云}
{\time  4/4 \huge \set fontSize = #3 g'4_\thumb a'4_\thumb a'4 e'4 |
g'4 b'8 g'8 b'2 | }\addlyrics { 风 中 有 朵 雨 做 的 云 }
% 也温暖不了你的视线(6 2[高])   纯四度    《吻别》
\markup {纯四度上行 吻别}
{\time  3/4 \huge \set fontSize = #3 d' d'16 d'16 e'8 a16_\thumb
d'16_\thumb ~ d'4 r4 }\addlyrics { 不 了 你 的 视 线 }
% 天上的星星(3 6)               纯四度        《鲁冰花》
\markup {纯四度上行 鲁冰花}
{\time  4/4 \huge \set fontSize = #3 a'8 a'4 a'8 e'4_\thumb
a'4_\thumb}\addlyrics { 天 上 的 星 星 }
% 分给我快乐的往昔(6[低] 3)     纯五度       《睡在我上铺的兄弟》
\markup {纯五度 睡在我上铺的兄弟}
{\time  6/8 \huge \set fontSize = #3 b8 b8 b8 b8 b8 g8 | g4._\thumb
e'4._\thumb |}\addlyrics { 分 给 我 快 乐 的 往 昔 }
\markup {————————}
% ————————% 下行% 夜(1 7)色茫茫            小二度     《明月千里寄相思》
\markup {小二度下行 明月千里寄相思}
{\time  4/4 \huge \set fontSize = #3 s4 s4 s4 c''8_\thumb b'8_\thumb |
a'4. g'8 e'8 d'8 e'4 |}\addlyrics { 夜 - 色 - 茫 - 茫  }

% 难解百般愁相知爱意浓(1 7 6)    小二度     《相思风雨中》
\markup {小二度下行 大二度下行 相思风雨中}
{\time  4/4 \huge \set fontSize = #3 a4 e'8 b'8 e'4 a4 | b'8. b'16 a'8
c'8_\thumb b8_\thumb a2_\thumb}\addlyrics { 难 解 百 般 愁 相 知 爱 意 浓 }

% 月亮(6 5)在白莲花般的云朵里    大二度    《听妈妈讲那过去的事情》
\markup {大二度下行 听妈妈讲那过去的事情}
{\time  2/4 \huge \set fontSize = #3 s4 a'4_\thumb | g'4._\thumb e'8 |
d'8. g'16 e'8 g'8 | d'8 c'8 a8 c'8|}\addlyrics { 月 亮 在 白 - 莲 花 般 的 云 朵
}
% 愿心中永远留着我的笑容(1[高]6) 小三度    《祝福》
\markup {小三度下行 祝福}
{\time  4/4 \huge \set fontSize = #3 s2 s4 d'8 d'8 | c'4 d'8 e'8 g'8
a'8 g'8 a'8 | c''8._\thumb a'16_\thumb ~ a'2}\addlyrics { 愿 心 中 永 远 留
着 我 的 笑 容 }
% 高高的谷堆旁边(5 3)            小三度    《听妈妈讲那过去的事情》\markup {小三度下行
听妈妈讲那过去的事情}{\time  2/4 \huge \set fontSize = #3 e'8 g'8 a'8 g'8 c''4
b'8. a'16 g'8 a'8 g'8_\thumb e'8_\thumb ~ e'1}\addlyrics { 我 们 坐 在 高 高
的 谷 堆 旁 边 }
% 空独(7 5)眠的日子              大三度     《追梦人》\markup {大三度下行 追梦人}{\time  4/4
\huge \set fontSize = #3 b'8_\thumb g'8_\thumb g'16 a'16 b'8
a'4}\addlyrics { 空 独 眠 的 日 子 }

% 风中有朵(6 3)雨做的云          纯四度     《风中有朵雨做的云》
\markup {纯四度下行 风中有朵雨做的云}
{\time  4/4 \huge \set fontSize = #3 g'4 a'4 a'4_\thumb e'4_\thumb |
g'4 b'8 g'8 b'2 | }\addlyrics { 风 中 有 朵 雨 做 的 云 }
% 狼山起,江山北望(3 6[低])      纯五度          《精忠报国》
\markup {纯五度下行 精忠报国}
{\time  4/4 \huge \set fontSize = #3 a'4. g'8 e'4. b'8 | c'8 c'8 d'8
e'8_\thumb a2_\thumb | }\addlyrics { 狼 烟 起 - 江 山 北 - 望 }
% 上行% 鲜花曾告诉(3 4)我你怎样(1 2 1)走过 小二度 大二度 《同一首歌》% 不要(5 6)问,不要说
大二度     《祝福》 % 大风从坡上刮过(5 6)            大二度      《黄土高坡》% 我们(3
5)坐在高高的谷堆旁边 小三度 《听妈妈讲那过去的事情》% 长亭外,古道(6 1[高])边        小三度     《送别》%
明天你是否会想起(5 7)          大三度     《同桌的你》% 月亮在白(2 5)莲花般的云朵里    纯四度
《听妈妈讲那过去的事情》% 风中(3 6)有朵雨做的云 纯四度 《风中有朵雨做的云》% 也温暖不了你的视线(6 2[高])   纯四度
《吻别》% 天上的星星(3 6)               纯四度        《鲁冰花》% 分给我快乐的往昔(6[低] 3)
纯五度       《睡在我上铺的兄弟》
% ————————% 下行% 夜(1 7)色茫茫照四周            小二度     《明月千里寄相思》%
难解百般秋相知爱意浓(1 7 6)    小二度     《相思风雨中》% 月亮(6 5)在白莲花般的云朵里    大二度
《听妈妈讲那过去的事情》% 愿心中永远留着我的笑容(1[高]6) 小三度    《祝福》% 高高的谷堆旁边(5 3)
小三度    《听妈妈讲那过去的事情》% 空独(7 5)眠的日子              大三度     《追梦人》% 风中有朵(6
3)雨做的云          纯四度     《风中有朵雨做的云》% 狼山起,江山北望(3 6[低])      纯五度
《精忠报国》

% Local Variables:% coding: utf-8% End:% EOF

20120115

上位机与下位机的交流:编码与字节序的实验

上位机与下位机的交流:编码与字节序的实验
下午在南区的讨论班居然提前结束了,而且,到预定吃晚饭的时候还剩两个半小时,按包师弟的说法,真是个尴尬的时间啊。干做两个半小时,太无聊,如果赶回所编程序,似乎时间又不太够的样子。我甚至想提议去暴走吧,但是想到冷得冻肺子的天气,想到包师弟和我都正感冒,也就只是想想。
包师弟说:要编这程序的想法,真是搅得人...
我忘了他原来的措词,为避免他跑上来纠正,只好留了空白。大意是,热血沸腾啊,夜不能寐啊之类的。现场表现是坐立不安。
好吧。
我们迅速用了十来分钟重新回顾了一下以前做过的计划,然后跑出来打车去所里。
1. 实验计划及基本原理
我们要做的是一个原型实验,确定STM32某芯片 (意法半导体)
的浮点型变量的编码方案与PC[http://en.wikipedia.org/wiki/IEEE_754-2008]是相同的,且大小头
(Endianness) 也是一样的。
几天来,包师弟已经把下位机的板子都整完了,昨天半夜的时候邮件说USB芯片及驱动都整完了。
我们计划的技术路线是:由上位机通过USB向下位机发送一个浮点数的二进制形式,下位机接收到以后,写到串口,然后用PC从串口读了显示出来。
如果PC下发的和最后显示的如果不一致,即可判定STM32与PC使用了不同的浮点变量编码。我们希望一致。
为初学者同学们解释一下,这并非是为了验证PC-STM32-串口的链路是正常的,而是为了验证上位机与下位机使用相同的方式表示一个浮点。
上位机就是PC,下位机是单片机或者ARM芯片的机器。
有的同学可能会问:难道上位机和下位机表示同一个数,会使用不同的方式,不都是"3.14"这样的形式么?
可能不相同,一定不是"3.14"这样的形式。因为我们知道,计算机只接受二进制,而"3.14"显示不是二进制。所以"3.14"是以一种有点诡异的方式表示的。
(1) 编码
在上位机中,一个浮点数,比如3.14,需要经过归一化、求符号、求指数、求有效数字、求尾数……一系列的步骤,终于变成了下面的形式。
如果是32位系统,用十六进制表示就是: 4048F5C3
具体的步骤和4048F5C3中每个二进制位的含义略过,感兴趣的同学请去文后的两个地址自行观赏。
我和包师弟打算用实验确认,上位机与下位机使用了相同的计算方法,或者说,相同的编码方法。即,当上位机发送3.14的时候,它发送4048F5C3这四个字节;当下位机接收4048F5C3这四个字节的时候,它认为这是3.14。
上位机与下位机使用相同的语言,才能通信。如果一方对另一方一无所知,还要指导,情况就可能比较糟糕了。
比如下面的对话。
上位机:你最喜欢莎士比亚的什么作品。
请注意上位机知道莎士比亚是一个人,而是有作品的人,不是意法半导体生产的某个芯片型号。
下位机:英雄双行体。
上位机:……
如果上位机在日本动画里,估计会说"那呢?"。我文学基本白痴,以前从来只知道莎士比亚还写十四行诗,从来没听说过英雄双行体这种东西,不过上位机似乎更白痴一些,他似乎认定莎士比亚就只写过戏剧。
恩,我比较喜欢李清照的词。
上位机:你读过莎士比亚的哪部作品?
下位机:我演过麦克白中的巫婆。
上位机:你是演员?
上位机显然不知道,而不是在调笑,他不知道英文专业学习英文的重要方法之一,从高中的时候就是这样,就是表演英文经典名著或者非名著。每个学英语的好像还都有剧照什么的。
不幸的是,下位机也不知道上位机如此无知。
上位机:你英语这么好,为什么要学英语呢?
下位机:我们为什么要学汉语呢?
我补充一下:因为英语系根本不是学英语的,就像下位机的回答所暗示的,中文系不是学中文的,历史系不是学历史演义的,而计算机系也不是学计算机的。很多英语系还有个全称,叫英语言文学,中文系一般还有个名字,叫汉语言文学,历史系……历史系好像叫历史文化学院,计算机系则根本不学怎么修理计算机拆壳子什么的。
深入地研究一个东西,跟简单的使用,根本就是天壤之别。
有人可能误认为:上位机误会了自己的身份,那些指责只有BOSS们才有资格做。
不,不是这样。没有人有资格指责别人,尤其,尤其,尤其是你身居高位的时候。身为BOSS,被安排居高临下,你对看不惯的人唯一能说的话也就是:我们不适合你。被你指责的那个人,没有花钱请你做他的顾问。
上位机下位机,不过是为了称呼方便给的一个名字,你真以为自己就高人一等了,你当小资的时候口口声声赞扬的独立宣言里有一句"人生而平等"不知道是不是忘光了。你花钱买到的不过是劳动时间,并不包括人的尊严。
所以,如果编码不同,还是承认不同罢了,少扯别人低级自己高级什么的。
又,故做平易近人和蔼可亲低下头来和你说话这样的姿态的,也不是什么好鸟,因为他们假设自己高人一等。
(2)大小头
目前有两种Endianness在计算机中普遍存在,一种是,在内存里,4048F5C3就表示为4048F5C3,这个叫做 big endian,大头儿。
有同学说,还能有啥表示方法?
还有一种叫 little endian,小头儿,4048F5C3会表示成C3F54840,正好按逆序排列每个字节。
有同学可能说,居然还有小头儿这么诡异的表示方法。是啊,事实上,我们一般用的PC,x86体系的,都是小头儿,是诡异的那一方。而ARM,是大头那一方。
大头小头,这个名字来自格列弗游记,两个小人国战争的原因是,到底吃鸡蛋应该从大头还是小头先打碎。这个问题也困扰计算机网络,发送数据前,也可能需要重排一下字节的顺序。
说到这里插一句,有意思的是,在小头的x86体系中,浮点数恰恰很诡异地使用了大头方案。这是由于历史的原因,你看,我们已经是一门有历史的学科了。
以上,我和包师经要验证的是上位机 (并非多么尊贵) 与下位机 (并非理应谦卑)使用了相同的 (1)编码、 (2)大小头。
可能有的同学会说:查下手册不就完了么。大多数时候我乐意相信手册,不过昨天马利同学刚刚抱怨了Thinkphp手册之不咋地,还是小心为妙。
2. 实验环境
上位机一台,跑windows7,64位CPU。杨注:可能运行在32位模式,或者应用程序工作在32位模式。
上位机的应用程序包括:
* labview
* symbolink 可能是这个名字,不能确认了。windows驱动开发工具之一,用来显  示驱动提供用来读写的文件名的。
* 虚机里跑了个windows xp,里面有个visual studio.
* 下位机的交叉编译和烧写软件
* 串口通信工具,用来看下位机发到串口的东西
* bushond
下位机:
* 意法办导体STM32某芯片,USB驱动已完成,串口驱动已完成
其他的硬件环境包括:我和包师弟各据一个显示器,连接在同一台上位机上,两套鼠标两套键盘。
两套鼠标两套键盘的结对编程方式,是ZHUMAO同学最先采用的,我们两个似乎当时调的是个JAVA程序。两套输入设备,结对时就不必抢键盘了,只要说一句"放着我来",就行了。论起争执和争夺,嘴还是比手快。
其他的硬件环境,我在实验其间还征用了关同学的座机一会,用来拷出symbolink,包师弟其间用过他的笔记本一阵,查资料。
还用了一个不知道什么软件,为了计时工作,西红柿时间管理。一共两次迭代,第二次严重超时,刚好在最后一分钟结束所有工作。
2. 实验过程
* 下位机输出到串口,浮点变量
改下位机程序,把浮点数,比如3.14,忘记当时用的是什么了,输出到串口。用上位机的串口通信软件读,符合3.14。
这步是为了确认串口通信及下位机的浮点数格式化输出正确。
float a = 3.14;printf("%f", a);
我们观察到了单精度浮点数精度不够的情况,略。
* labview,不知道如何把浮点写下去
用labview,打算把浮点数对应的二进制四个字节写到USB口。遇到个问题,不知道应该怎么取得浮点数对应的二进制那四个字节。
这时,我们转到了另一个技术路线。
请某些同学注意,这里的另一个技术路线,原本就是我们计划的技术路线之一,而不是因为前一路线"可能"不通,而临时想到的。同时,我们非常确认另一条技术路线可能,而且我和包师弟各喜欢一条路线,所以才会转向。这与某些同学"一遇困难就转向,再遇困难再转回来,始终也不知道毛病在哪里,这个方法到底行不行"是完全不同的。事实上,我们基本确认labview有这样的能力,只是不打算再花时间。前面提过,我们原计划加交通也只有两个半小时。
* C,不知道symbolic link name
然后,开始用C写USB口,但是CreateFile的时候不知道驱动给提供的文件名(symbolic
link)是什么,因为正使用labview的驱动,不是我们自己写的那个版本。
自己马上写个驱动,也是方法,但是我们需要马上架起驱动开发的环境。原来有个驱动,但当前的这块板子vid,pid,endpoint设置全不一样。时间关系,也放到一边。请还是那部分同学注意,我们仍随时可以开始这一路线。
* 用symbolink (?) ,不能确定文件名是正确的,CreateFile没有发出数据
开关同学的机器,找到了能查驱动提供的文件名的工具。
这里有个插曲,我们拥有N多个虚拟机,以致于找到需要的那个,花了不少时间。后来全盘搜索才找到。
当时我想起了之前某次"结对"编程,我的身后有四位同学,包独坐一边,还是上面的硬件环境,我们把众多文件在真实的和虚拟的共达七台计算机间来回挪腾,最终一切都跑了起来。大家说,这很盗梦空间。
不过,这一次比较不幸,我按symbolikn查到的文件名发数据,下位机没有接收到。
* 包接受用C写用文件,然后用labview读
这时包提到一个之间的方案:我用C语言把float变量的二进制写到一个文件中,然后包用labview读进来,按字节读。
我说:咱们还是直接用手写吧。
* 用C输出float的4个字节
我们用C程序,把float变量对应的十六进制,显示在控制台上。这样:
#include <stdio.h>main(){    float a = 3.14;    printf("%x", *
(unsigned char*) &a);    printf("%x", * ((unsigned char*) &a + 1) );
printf("%x", * ((unsigned char*) &a + 2) );    printf("%x", *
((unsigned char*) &a + 3) );}
* 用bushound,而不是labview写到下位机
然后,我们没有用labview,而是用另一个更轻量级的工具,bushound,直接向usb的endpoint中写入了十六进制。
* 下位机,强制转换指针类型
在下位机中,我们按收到数据以后,把这四个字节十六进制转换成了浮点型变量,然后printf到串口。大致这样:
printf("%f", * (float*) buf);
* 上位机显示下位机串口
上位机显示,下位机的串口输出了 3.14。
我们又改了几个浮点数,由上位机把C算出来的十六进制通过USB口写给下位机,下位机又通过串口把这四个字节当成浮点型变量格式化输出。上位机显示下位机的串口输出,与我们预期的值是相同的。
* 然后,我们去东方肉馆吃肉去了。
虽然我的挂钩还疼着,尤其嚼脆骨的时候,不过心情不错。当你知道这个世界上有一些人与你用相同的语言交流,有些相同的习惯,比如大半夜的上网发贴子看贴子,怎么能心情不好。
就让那些 听不懂别人说话,还命令别人按自己的方式说话的 上位机孤独去吧。
3. 结论
浮点型单精度变量,PC与ARM使用了相同的编码和字节序。
参考文献:
[http://en.wikipedia.org/wiki/IEEE_754-2008][http://babbage.cs.qc.cuny.edu/IEEE-754/]