Archives for April 2007

向数据文件读写结构

如果遇到向数据文件读写结构的问题,会让很多编程人员都非常头疼。一般来说,最简单,最常用,最清晰的办法是用 fwrite() 来写一个结构 fwrite(&somestruct, sizeof somestruct, 1, fp); 对 应的 fread() 调用可以再把它读回来。但是这样写出的文件却不能移植。为什么呢?我们知道,结构中,各个成员在内存中的存放并不是紧挨着的,而是可能有一些空位,这些空 位的目的是为了填充,保持结构中后面的域的对齐,大多数情况下,这是必须的。为了高效的访问,许多处理器喜欢 (或要求) 多字节对象 (例如,结构中任何大于 char 的类型)不能处于随意的内存地址,而必须是2或4或对象大小的倍数。 正是因为这该死的原因,让我们无法很好得移植这种文件,比如如果结构包含任何指针,则只有指针值会被写入文件,当它们再次读回来的时候,很可能已经失效。 最好的解决办法,就是写一对函数,用可移植(可能甚至是人可读)的方式按域读写结构。尽管开始可能工作量稍大。 那么,我们如何确定域在结构中的字节偏移呢?ANSI C 在 中定义了offsetof() 宏,用 offsetof(struct s, f) 可以计算出域 f 在结构 s 中的偏移量。如果出于某种原因,你需要自己实现这个功能,可以使用下边这样的代码: #define offsetof(type, f) ((size_t) \ ((char *)&((type *)0)->f – (char *)(type *)0)) 当然请注意,这段代码并不是100%可移植的。

对于向嵌入式编程的c++化提出一些建议

嵌入式编程基本上都是c的天下,事实上,如果你尝试一下使用c++的话,会发现能省很多事情,程序也更加清晰。但为什么很多人都觉得c++不适合嵌入式编程呢?答案很简单,你用的特性太多了。 其实,即使在对即时性要求非常严格的嵌入式系统中,c++也能很好的工作,只是一般来说最好限制以下特性: – 少进行动态内存分配(new,delete,malloc,free) – 不进行run time type information(RTTI) – 不允许使用虚函数 – 不允许模板编程 这样可以增加程序的健壮性和速度。那么c++能够给我们带来的好处是: – 能够使用引用来代替指针,这样大大增强程序的健壮性 – 用类的方法来保证对模块内部变量的保护,减少非常容易出错的令人恼火的外部申明 – 能用构造来确保合适的初始化模块 其实c++最主要的缺陷就是对内存的占用稍微有些大,这主要是因为c++环境的初始化更加复杂。但是如果按照以上的原则的话,基本上是没有什么执行时期消耗的,写出来的程序目的很明晰,健壮,比如你做硬件接口的话,比用纯c效果要好得多。 欢迎讨论。

如何在linux中直接运行windows二进制程序

虽然大多数linux爱好者都不怎么使用windows,但是不少人还是习惯了某些windows下的软件,而不愿意从开源仓库中寻找替代品。当然,你可以 用拥有wine的GNU/Linux系统解决这个问题。但是还有令人感觉不如意的地方:每次想要启动这些程序时,你不得不输入 cd ~/.wine/drive_c/Program\ Files\My\ Windows\ App; wine My\ Windows\ App.exe 请注意,是每次。用shell脚本也不是什么很好的主意。有没有什么办法,能在xterm下直接通过My\ Windows\ App.exe来运行这些程序?

详解linux内存磁盘初始化技术

inux内存初始化技术(initrd)用于支持两阶段的系统引导过程,是在系统启动过程中被挂载的临时root文件系统(译者注:这里的root文件系统是指的根文件系统)。initrd包含很多可执行程序和驱动,并允许在临时的内存磁盘根文件系统被卸载,内存被释放后挂载真实的root文件系统。在许多嵌入式linux文件系统中,initrd是最终的根文件系统。这篇文章主要讲解了linux2.6内核的initrd技术,包括在内核中的创建及使用。

硬盘维修指南

似乎每次开博都要用这篇文章作为压宝,呵呵。在此前的一些时间,我的朋友若水也曾经写过一些关于硬盘存储器的文章。尔后的一些时间里他一直没有动笔,在这段时间里主要是对他自己的相关知识做一些总结和提炼,并且尽可能地进行了一些实际的动手操作和实验。 经过很长时间的酝酿和筹划,今天,他终于开始写这篇关于硬盘的文章。总体预计分为两个部分,一是硬盘工作的原理,另一则是典型故障的处理。可能这样会使得这篇文章显得略显晦涩,大家也急于看到故障处理方面的经验,但是还是坚持要将硬盘的原理放到前面来讲。硬盘是机电一体化、现代制造技术的典型产品,如果不能对其结构有一个基本的了解,即便是学会了修一两个盘,也不能做到举一反三。不论是对普通的DIYer还是维修从业者,都是没有好处的。

学习LCD编程的起步

在发表之前首先声明,这篇文章是我大一时候写的,最早以“雷风”的名字发表在21ic的论坛中,现在不少人转贴根本不著名“转”,甚至自己还标一个“原创”,还有人写个“作者不详”,拜托大家转贴还是要有点专业精神好不好。 之所以产生写这个东西的想法,是因为趁着大一寒假这段时间看了看学习板的源程序,在看lcd的时候很不顺利,花了五个晚上才看完(白天偷懒了^_^!,毕竟在春节嘛)。联想起还有很多水平和我差不多甚至可能还低一点的菜鸟,就觉得有义务把五个晚上的学习心得写出来。 这个心得是针对学习板上的lcd 驱动芯片SSD181X系列写的,当然思想应该是相通的。其实是我没有用过其他系列lcd(众人呕吐ing……)。好了,接下来进入正题。

让硬盘更聪明——NCQ详解

请记住以下几个日期,它们注定将成为存储史上重要的里程碑:2003年7月,英特尔与希捷共同公布了SATA的重要特性——本地命令序列(NCQ- Native Command Queuing)技术;2004年6月,英特尔最新的ICH6是首个支持NCQ的主板芯片组I/O控制芯片;也是在这月,希捷率先推出支持NCQ的桌面级硬盘——酷鱼7200.8。大家可能注意到他们都有一个关键词NCQ,那么什么是NCQ呢?

自己订制的相当全的vimrc配置文件

供vim爱好者参考。我自己最喜欢gui模式下desert这种配色,可是试验了半天,也不能把这种颜色加到我这个blog背景中,所以干脆自己又做了一个desert配色的html,欢迎下载下来看看。顺便说一句,在不断使用的途中我会不断修改这个配置文件,修改的内容我只更新在位于我主页仓库的这个链接中,这里就不再更新了。还有就是直接在这里看存在字符编码不合适导致乱码问题,如果你对出现乱码的地方比较感兴趣,建议下载附件或者通过上面这个链接来看。

linux-fpga系列文章之——eda工具安装及modelsim的调试技巧

本文首先介绍了modelsim和ise在linux下安装的注意事项,然后介绍了如何用modelsim完全编译xilinx的库文件,最后介绍了一个makefile和vim配合使用modelsim的技巧。本文主要为讨论了在linux环境下进行eda以及相关嵌入式开发的一些技巧和方法,今后在我的学习过程中还会不断推出这个系列的文章,欢迎讨论,交流。

如何在ubuntu下编译内核

每一个发行版本都带有一些特殊的工具,用来从源代码中创建一个自定义的内核,这篇文章就是关于如何在ubuntu系统中编译内核的。内容包括,如何利用最新的,未被修改过的,从www.kernel.org网站上下载下来的源代码来构建自订制系统,这样,你就能独立于发行版所提供的内核。文章同样涉及了如果你需要一些现有内核不包含的特性,如何对内核源代码进行修补等问题。

linux新手编程必读

假如,你是一个linux编程方面的初学者,那么,在开始这段神奇经历之前,你一定会对这篇文章所讲的一些方面非常感兴趣。特别当你以前是一个 windows环境下的程序员的话,那就必须改变一些编程方面的想法和思维,这样当你遇到完全不同的理念和思维方式的时候,才能将这种所谓的“文化”差异带来的影响降到最低。 针对程序员,特别是一些有经验的Windows程序员在论坛上所问的关于linux编程方面的常见问题,我的建议如下: