转载:VIM vs VS:关公战秦琼

By ganquan, 2009年08月31日 13:58

前辈的话太有力量了。那个搬弄是非的小屁孩[1][2]压根就是一个没有任何眼界的末流学生,极其肤浅地认为开发都是在本地进行,开发都是需要GUI的。又见到一个拿无知当个性的人。可悲。

VIM vs VS:关公战秦琼

作者:程序员老头

作为程序员,我们应该对开发环境和工具软件有着严肃的态度,真正弄明白各类工具的用法和用途,好歹这些是我们吃饭的家伙,是不是?不会使用各种开发工具的程序员,不是个好程序员:你拖了团队的后腿,减少了大家的工具选项,降低了团队的开发水准。另一方面,不知道该在什么项目中采用什么开发工具的,也不是好 的team leader,眼界太窄,更可能影响开发的成败。强大的开发工具并不是在各方面都强大,尺有所短,寸有所长。

不想当将军的士兵不是好士兵,在我眼你,不愿意研究开发工具的人也不是个好程序员,这样的人很多很多,浮躁而不自知,自大而不自信,不尊重自己的工作,也 不知道尊重前辈的知识。就这么浑浑噩噩在开发圈子里混着,一年两年,逐渐对自身的待遇不满,也逐渐不能胜任工作的要求。

10年前,正是互联网泡沫第一次开始破灭的开端,一家家公司接连倒闭,很多刚入职几个月的计算机专业的学生很快又得再次求职……程序员的贬值,程序员队伍整体水平的滑坡,正是从那时开始的。回忆当时,一般的程序员还真不敢自称高手。

作为一个断续做了6年windows开发,断续做了11年Linux开发(中间有重合的交集)的老程序员,我换过若干家公司,经历过一些不同性质的项 目,windows下mfc的,纯sdk的,数据库的,c/s、b/s的,ddk的(有早期的vxd,也有后来的wdm)经历过,linux下的小驱动, 通讯设备研发,媒体设备研发也做过不少,还有业余做的php、ror项目,现在更是专职在做大流量高并发的……在线游戏后台,为玩家们提供坚固的精神鸦片 支撑。用过的语言和工具比较多了,从在校学习的tc2、bc++3开始,到自学的vc、delphi、bcb,还有些忘了名,但第一份工作用的工具vc。 从vc4开始的,后来一直升级,到最近的vs2008,我甚至业余做过VS和BCB的插件。另一方面,自己笔记本上始终安装的是linux,最初是 redhat后来是slackware,debian,ubuntu,arch。也尝鲜过一些别的发行版,其他os这里就不提了。长期做嵌入,自然长期用 GNU/Linux (这是正式的名称)。我想不管是对于windows还是对于linux下的各种工具,我自认了解程度和使用经验,应该为比《别碰我,VIM》的作者要更 多。我就倚老卖老吧,希望作者能听几句老家伙的废话。

作为程序员,我们应该对开发环境和工具软件有着严肃的态度,真正弄明白各类工具的用法和用途,好歹这些是我们吃饭的家伙,是不是?不会使用各种开发工具的 程序员,不是个好程序员:你拖了团队的后腿,减少了大家的工具选项,降低了团队的开发水准。另一方面,不知道该在什么项目中采用什么开发工具的,也不是好 的team leader,眼界太窄,更可能影响开发的成败。强大的开发工具并不是在各方面都强大,尺有所短,寸有所长。说到这里,相信你也明白钻研的重要性了吧,更 不要轻视业界都依赖的重要软件。你是非常聪明的,大家的智商也不会有多低下。一个如此差劲的软件偏偏那么多人喜欢去用,事出反常必有妖,这里的怪异之处, 难道不值得去仔细思考吗?

接下来我说说《别碰我,VIM》里的一些小问题,希望作者,也希望有兴趣的围观者能有点小收获。都是些常识话,主要是说给有志于软件开发事业的人,可能比较无聊,而且刺耳。无兴趣就不要看了。

软件间依赖性问题称为耦合,这是包管理器自动完成的事情,对用户而言是自动的,透明的,使用者没有必要去关心这些,而开发者自然应该知道这些。这实在不该 是指责某个软件的理由。linux的工具是相当精干的,工具间相互配合,胜任各种复杂任务,我看不出这是什么缺点。如果有一个开发软件,很庞大,不依赖别 的什么软件,自身就可以完成全部开发所需的功能,这样的软件就是好的吗?记住一句常识吧:不要重复发明轮子。当然这在windows下是不可能的,因为 windows系统根本就没有开发用的任何轮子,所以,各个开发商,必须自备轮子。以至于很多人已经习惯了自备车轮,该换个角度思考问题了。

接下来说说效率问题,编程不等于打字,程序员总会有更多独特的要求。写过很多程序,维护过很多程序之后,你就会明白为什么vim比vs更好用了,这是用了 才能体验的事情。我感觉在和你讨论“子非鱼,安知鱼之乐”了。哎,vim对coder们的体贴之处,怎么是几句话能说清的呢?总而言之:快捷键,正则式、 以及!执行等等功能,对程序员而言,都是相当重要的,这些vim有而vs没有的功能,让我极大的感觉到vim的爽,以及vs的不便之处,只写hello world是无法了解这一点的。程序员们热爱vim到什么程度了呢?firefox都有vim插件,让我们能够以vim的操作方式看网页。用久了vim, 你会上瘾。一个能让人上瘾的软件,绝不是会是你眼中的废品。当然另外一面,如果你不是长期写程序,没有那些特殊的需求,你就不会觉得vim有任何的好处。 如果只准我用vs会有什么感觉呢?就像一个专业的车手,不让开赛车,让我用强大而舒适的自动波,那是很郁闷的。作为程序员,本着对工作负责的态度,不管开 发工具有多糟糕多难用,你也应该掌握,这是本职所在。况且效率上vim其实更高,而现在不专业的你,还没学会,完全对vim没有应具备的认知。

懒惰使世界进步,所以我们我们用使工作效率更高的软件,而不是相反。公司对效率的追求是没有止境的,程序员绝对不是个舒适的职业,你可以想办法更省事的完 成任务,但绝不要笨鸟还不飞。懒惰到一定程度,连什么工具干活更快更省都不清楚,那就有生存危机了。你也许觉得写程序,大部分时间都在思考,打字速度无所 谓。但很多公司的程序员试用期都会考核英文打字速度,这就是对效率的追求,绝不是无聊。在校学生,职场新人,都要有这个心理准备,不要以为编程的工作多轻 松。

至于compiz什么的我不多说,这与程序员无关。我是用compiz + cairo-dock的,只是为了养眼,没有提高或者降低工作效率。

再说Eclipse,这是很多公司的标准开发环境,不管你是不是喜欢,不管你的VS用得多好,都要面对这个现实。说些废话:我接触的用Eclipse的薪 资水平比用VS的基本上要高,用VIM的又更高一点。国人浮躁,用金钱衡量价值显得权威一些,如果我说技术水平……大家不服气,呵呵。就冲着RMB,大家 还是多掌握些手艺吧。二者的优劣,我不想多说,这是见仁见智的问题。VS就像IE,Eclipse就像Firefox,跨平台,功能要靠扩展的,当然我个 人是更喜欢Eclipse。

至于开源模式。这个话题相当有分量,我不认为这是现在的你能谈论的。什么是开源什么是自由软件?什么叫分布式协同开发,什么叫持续集成滚动更新什么叫永远 的beta版?Agile是什么Scrum是什么?呵呵,相信我,这只能是做过很多个不同模式的项目管理的人,才能有体验的。软件架构和开发模式,目前离 你都比较远,没有实践而探讨,就成了空话。你真的应该相信长者,去看前人的经验和教训的总结,《大教堂与集市》这样的文章,真不是垃圾。

就我所知道的,业余参与GNU项目的,大部分都是公司的牛人,而专职的自由软件开发者,基本上都是业界的顶尖人物。如果连你都轻易的发现他们的开发模式错 了,那全球软件行业还真是脑残集中营了。否决这么一大票牛人还真是需要勇气的。

LaTeX可以直接用,也可以用来实现可见即所得的编辑器,攻击排版软件的基石也需要极大的勇气啊。Openoffice.org很好用,甚至国产的 WPS Office也都很好,为什么要花那么多钱买Office呢。我的windows里安装的还是Openoffice.org,公司采购的是WPS。在 Linux里,大部分时间我是用简单的abi的,对我够用了,用不着那么多复杂功能。

世界上好玩的东西很多,不是什么东西都可以弄精通的,但吃饭的家伙还真得精通。厨师不能靠意念炒菜、司机不能靠意念开车,你也不能靠意念写程序,人不能活 在想象之中,电脑帮我们写程序的科幻时代还没到来。学不好,是你没刻苦努力,与你的才智无关。我从小就很普通,父母说我呆,同学说我笨,从小学到大学习成 绩都不太好,大学挂掉n门课,但这并没妨碍我把VIM弄精通了,把GCC弄精通了,把GDB弄精通了,把几个专用的嵌入式操作系统弄精通了。只要功夫深, 铁杵磨成针,大道理不多说,你别总给自己找借口,这些软件都是你应该精通的。这些其实也都是很无聊的,并不是什么有趣的东西。学习它掌握它,精通它,是你 的责任,不管是不是有兴趣都要去做到。

最后说场合问题:无GUI的环境永远会存在,不是所有的设备都必须连接键盘鼠标。服务器永远都不需要GUI,这与时代进步无关。做windows开发用 VS是天经地义,做服务器、嵌入式、Linux或者跨平台开发,用VIM也是很适合的选择。我不明白为什么作者要把两个在工作中很难有交集的东西做对比, 这就是本文标题的由来了。如果硬要做对比的话,我要说,windows 开发真tmd不爽(个人喜好,请勿模仿),我就是不喜欢不对我公开的东西,就是不喜欢难调试的东西,就是不喜欢开发速度慢的东西,就是不喜欢负载能力低下 的东西……个人情绪宣泄而已,就是这样。不要上纲上线的谈tmd什么模式、技术水平,这是我个人的情绪和喜好,没有理由。

不想当将军的士兵不是好士兵,在我眼你,不愿意研究开发工具的人也不是个好程序员,这样的人很多很多,浮躁而不自知,自大而不自信,不尊重自己的工作,也 不知道尊重前辈的知识。就这么浑浑噩噩在开发圈子里混着,一年两年,逐渐对自身的待遇不满,也逐渐不能胜任工作的要求,逐渐一个个消失在开发界。而我这样 的老家伙们,渐渐的成了你所不能理解的人。

mini2440 button驱动分析

By ganquan, 2009年08月25日 01:34

基本上读懂了,有些几个地方还不明白。

由于wp-syntax插件显示代码实在让我看着眼睛难受,我决定换一种方式贴代码。点击下面的链接试试:

mini2440 button驱动注释

mini2440 leds驱动注释

天涯

By ganquan, 2009年08月23日 23:24

今天看按键驱动,有些地方被卡了一下。心情不是很好,感觉很累,所以就进度不好,质量也不行。

晚上索性不打算再看,明天状态好一点之后再看,依旧要把代码全部注释好了贴出来。

找个休息的方式,我习惯于去天涯逛逛。刚刚看完一个红脸贴,好几十页了,还在更新中。追贴真的比较痛苦,和追美剧差不多。还好越狱已经彻底完结。而Lost我也放弃了,不再追下去。只有无聊的时候或者没事情干,就去天涯逛。天涯之大,无奇不有。

现在突然想出去喝点酒再回来睡觉。不过外面卖酒的地方都应该关门了吧。。。。

volatile关键字

By ganquan, 2009年08月23日 11:47

用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。在嵌入式系统中,用来作为硬件动作的结果。

例如,通过一个串口接收到一个字符,结果串口状态寄存器更新,这完全在程序流程之外发生。最好就把该寄存器声明为volatile,编译器不会试图优化一个volatile寄存器,而是每次重载它。所以在嵌入式设备的程序中,将所有外设寄存器声明为volatile是一个好习惯。

回忆

By ganquan, 2009年08月22日 18:49

昨晚睡得迟,凌晨2点多了才睡。

今天中午才起来,一直没出去,就宅在宿舍看驱动程序。直到刚才出去买晚饭,看到来报到的09级新生,人潮涌动,思绪一下子就回到了06年的8月。

我是自己一个人来报到的,下飞机后坐机场大巴到了高新区,然后问了一下,得知到老校区不远了。我就拖着箱子一路走一路问,不一会就到了老校区北门。穿过老校区,走到科技楼下,我踏上开往新区的校车时,刚好只剩最后一排最后一个座位,我坐下后就开车了。

一路兴奋好奇,没有一丝疲惫,在车上安静的望着车窗外的一切都在后退,没多久就到了新区。我是提早来报到的,到了新区后还没有人山人海的热闹。在校门口下车,在竹园餐厅下的一排蓝色帐篷中找到计算机学院的据点,办理一下入学手续,拿着一些票据向宿舍方向走去。我拖着箱子走到竹园餐厅和老综合楼之间的那个十字路口时,有个学姐主动走来问我是否需要她帮忙,我谢绝了她的好意,自己继续拖着箱子向前走。

路上问了一个学长,他主动把我带到我的宿舍楼下,他是山东人,姓曹。我后来在元旦节前还给他发信息说元旦快乐,直到后来丢了他的手机号,再也没有联系。

顺利办理入住手续,进了宿舍对住宿环境很满意,一切都是全新的,物业已经在床上铺好了全新的被褥,把另外一套还没有拆封的被罩,床单和枕巾放在枕头上。还有我挑了一个满意的床位然后开始收拾行李,擦干净衣柜,把衣物放进去。

整理好之后出去办了手机卡,接下来才给爸爸妈妈打个电话报平安。

在校园里面转悠,熟悉环境,就这样过了到校的第一天。晚上回到宿舍,只有我一个人,睡得很好。

…………

时间太块,自己来报到的情形还依旧清晰,但却将要离开这个学校,眨眼就是四年。越发的感觉到时间的宝贵,回头看自己的大一大二,不知虚度了多少宝贵光阴!

又是一年新生到,不到一年的时间我就要离开学校,现在不会像过去那样对学校有很多愤怒不满,无奈中也慢慢的习惯了,便没有了那么多的抱怨。上了大四以来,越来越感觉匆忙,发现自己不懂的太多了。珍惜后面的时间,让自己在大学的最后一段时间过得充实,过得有意义!

mini2440 LED驱动详解

By ganquan, 2009年08月21日 21:22

从最简单的LED驱动入手,彻底细致的分析一遍mini2440的LED驱动。

官方手册上写,mini2440的四个LED与CPU的GPIO相连,LED1, LED2, LED3, LED4分别对应的
是GPB5, GPB6, GPB7, GPB8。那什么是GPIO呢?

GPIO是通用输入输出口的简称,只需要设置相应的CPU寄存器,就可以改变引脚的用途。
控制硬件,其实就是控制对应的寄存器。

四个LED的采用GPBCON寄存器上的4组2bit位来配置对应引脚的状态。4组2bit位的功能都
一样:00表示输入,01表示输出,10为特殊功能,11是保留的。
LED1对应的是GPB5, GPB5使用[11:10]位
LED2对应的是GPB6, GPB6使用[12:13]位
LED3对应的是GPB7, GPB7使用[14:15]位
LED4对应的是GPB8, GPB8使用[16:17]位
驱动需要先设置LED为输出状态,也就是要把对应的GPBX设置为01。

四个LED采用CPBDAT寄存器来对应4个LED的数值状态,GPBDAT5就对应GPB5,GPBDAT6就对
应GPB6,以此类推。手册上写低电平有效,就是说当GPBDAT寄存器位置为0时,LED就发光。

在三星官方的手册S3C2440.pdf中描述的寄存器状态如下:
GPB8 [17:16] 00 = Input 01 = Output
10 = nXDREQ1 11 = Reserved
GPB7 [15:14] 00 = Input 01 = Output
10 = nXDACK1 11 = Reserved
GPB6 [13:12] 00 = Input 01 = Output
10 = nXBREQ 11 = reserved
GPB5 [11:10] 00 = Input 01 = Output
10 = nXBACK 11 = reserved

GPBDAT Bit Description
GPB[10:0] [10:0] When the port is configured as input port, the corresponding
bit is the pin state. When the port is configured as output port, the pin state is the same
as the corresponding bit. When the port is configured as functional pin, the
undefined value will be read.

贴出添加注释后的代码,非常简单的驱动。

#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
 
#define DEVICE_NAME "leds" /* /dev目录下的设备名 */
 
/* GPBX */
static unsigned long led_table [] = {
	S3C2410_GPB5,
	S3C2410_GPB6,
	S3C2410_GPB7,
	S3C2410_GPB8,
};
/* GPBX的输出状态 */
static unsigned int led_cfg_table [] = {
	S3C2410_GPB5_OUTP,
	S3C2410_GPB6_OUTP,
	S3C2410_GPB7_OUTP,
	S3C2410_GPB8_OUTP,
};
 
/* 驱动接口函数
* ioctl的内核空间版本和用户控件的版本不同
* 内核版为:
* int (*ioctl)( struct inode *inode, struct file *file, unsigned int
* cmd, unsigned long arg);
* */
static int sbc2440_leds_ioctl(
	struct inode *inode,
	struct file *file,
	unsigned int cmd,
	unsigned long arg)
{
	switch(cmd) {
	case 0:
	case 1:
		if (arg &gt; 4) {
			return -EINVAL; /* Invalid argument,非法参数 */
		}
       /* 设置数据寄存器GPBDAT
		* 低电平有效,用户程序传来的cmd取反
		* */
		s3c2410_gpio_setpin(led_table[arg], !cmd);
		return 0;
	default:
		return -EINVAL;
	}
}
 
/* 接口对象 */
static struct file_operations dev_fops = {
	.owner	=	THIS_MODULE,
	.ioctl	=	sbc2440_leds_ioctl,
};
 
/* 设备对象 */
static struct miscdevice misc = {
	.minor = MISC_DYNAMIC_MINOR, /* 动态设备号 */
	.name = DEVICE_NAME, /* 将在/dev目录生成led设备 */
	.fops = &amp;dev_fops, /* 驱动接口 */
};
 
static int __init dev_init(void)
{
	int ret;
 
	int i;
 
	for (i = 0; i &lt; 4; i++) {
		/*设置GPIO对应的配置寄存器GPIOCON为输出状态*/
		s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
 
		/*设置GPIO对应的数据寄存器GPIODAT为低电平
		 *在模块加载结束后,四个LED应该是全部都是发光状态*/
		s3c2410_gpio_setpin(led_table[i], 0);
	}
 
	ret = misc_register(&amp;misc); /* 注册设备 */
 
	printk (DEVICE_NAME"\tinitialized\n"); /* dmesg */
 
	return ret;
}
 
static void __exit dev_exit(void)
{
	misc_deregister(&amp;misc);                     /* 注销设备 */
}
 
module_init(dev_init); /* 声明加载模块初始化函数 */
module_exit(dev_exit); /* 声明卸载模块清除函数 */
MODULE_LICENSE("GPL"); /* 许可证声明 */
MODULE_AUTHOR("FriendlyARM Inc."); /* 作者信息 */

NFS开发环境建立

By ganquan, 2009年08月19日 23:55

晚上在学校里转了好几个卖电脑配件的地方,都没有卖usb转串口线的,继续找,最后在老综合楼复印店找到了,只剩最后一个,35元。既然是最后一个,就肯定讲不了价,我和店家商量如果系统不能识别就退货,他同意了,咬牙拿下。

回到宿舍赶紧接上开发板,然后火速装上minicom,立即测试,太爽了,一切OK。这下就可以NFS开发了。

基本步骤如下,比较容易,后面有时间再细致的补一下笔记。

1.debian上安装nfs-kernel-server,配置好nfs-server

2.按照手册上的方法把环境配出来

3.配置好minicom,用minicom进入板子的shell

4.在板子上挂载笔记本上的开发目录

5.运行程序不用下载到板子了,在minicom中./myapp就可以了

对Linux很亲热,所以很顺手。感慨一下,Linux这个东西真的太猛了,这么多方便的方式给我选择:

a.可以在笔记本上开发,编译链接得到elf之后用U盘拷贝到板子

b.用串口下载到板子

c.用ftp上传到板子

d.用NFS方式,都不用下载到板子了,这样相当于把板子的FLASH扩大了,因为是用笔记本的硬盘当FLASH,这个是最佳方式。

上述3个方式中,windows不装linux虚拟机的情况下可以使用前三个。还是原生使用linux爽啊,以后就用最佳方式NFS了。

misc设备

By ganquan, 2009年08月19日 19:28

手册上说LED是misc设备,我在开发板上看/dev/leds,给出的是字符设备,这就奇怪了。我以前只知道有字符设备,块设备,对misc没有一点概念。赶紧google一下:

杂项设备(misc device)
杂项设备也是在嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include\linux目录下有Miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的。

也就是说,misc设备其实也就是特殊的字符设备。

在mini2440上的helloworld

By ganquan, 2009年08月18日 22:07

搭建开发环境很容易,跟着手册做,官方是在fedora上搭建的,我在debian上也非常顺利。第一个程序,拍照纪念。

img_2986

Linux目录

By ganquan, 2009年08月16日 23:00

今天看到一份英文的,相比以前看的中文资料,可谓是言简意赅。值得收藏。

/bin   basic programs (Programs that are absolutly needed, shell and commands only)
/boot  initialization files (Required to actually boot your computer)
/dev   device files (Describe physical stuff like hard disks and partitions)
/etc   configuration files
/home  users’ home directories
/lib   basic libraries (Required by the basic programs)
/media mount points for removable media
/mnt   mount points (For system admins who need to temporarily mount a filesystem)
/opt   third-party programs
/proc  proc filesystem (Describe processes and status info, not stored on disk)
/root  system administrator’s files
/sbin  basic administration programs (Like bin, but only usable by administators)
/srv   service-specific files
/sys   sys filesystem (Similar to proc, stored in memory based filesytem: tempfs)
/tmp   temporary files (Files not kept between boots, often in tempfs)
/usr   most programs (Another bin, etc, lib, sbin, but for less important files)
/var   varible data (Similar to tmp, but preserved between reboots

/bin   basic programs (Programs that are absolutly needed, shell and commands only)

/boot  initialization files (Required to actually boot your computer)

/dev   device files (Describe physical stuff like hard disks and partitions)

/etc   configuration files

/home  users’ home directories

/lib   basic libraries (Required by the basic programs)

/media mount points for removable media

/mnt   mount points (For system admins who need to temporarily mount a filesystem)

/opt   third-party programs

/proc  proc filesystem (Describe processes and status info, not stored on disk)

/root  system administrator’s files

/sbin  basic administration programs (Like bin, but only usable by administators)

/srv   service-specific files

/sys   sys filesystem (Similar to proc, stored in memory based filesytem: tempfs)

/tmp   temporary files (Files not kept between boots, often in tempfs)

/usr   most programs (Another bin, etc, lib, sbin, but for less important files)

/var   varible data (Similar to tmp, but preserved between reboots

Panorama Theme by Themocracy