最近,想在eCos中实现SDIO接口的wifi功能。看了下网上流传的stm32 sdio wifi驱动,却是从linux中移植过来的,所以也打算把linux SD接口wifi驱动移植到eCos中。
花了几天时间阅读了下linux SD/MMC和wifi驱动代码,整个驱动体系已大概了解,但影响移植的一些细节却令人头痛,这些细节在eCos中没办法移植过来,所以必须弄懂,然后用替代方法实现或者干脆不实现。比如这里要说的struct scatterlist。
最近,想在eCos中实现SDIO接口的wifi功能。看了下网上流传的stm32 sdio wifi驱动,却是从linux中移植过来的,所以也打算把linux SD接口wifi驱动移植到eCos中。
花了几天时间阅读了下linux SD/MMC和wifi驱动代码,整个驱动体系已大概了解,但影响移植的一些细节却令人头痛,这些细节在eCos中没办法移植过来,所以必须弄懂,然后用替代方法实现或者干脆不实现。比如这里要说的struct scatterlist。
随着万圣节越来越流行,我感觉有必要跟大家讨论一下一个在软件开发中非常普遍的问题:僵尸代码。几乎所有我接触过的代码库里都四散着很多小段的,甚至大片大片的被注释掉的代码。这就是僵尸代码。
// 目前禁用这项功能。Jimmy在写这段代码时肯定是喝醉了。
// 你可能以为这里发生了恐怖的代码凶手安…不,不,我只是把它们注释掉了…
为什么称它们为僵尸代码?你知道,僵尸不并不是真的死的。就像恐怕电影里告诉我们的,尽管僵尸看起来是死人,但它们仍有能力四处出没袭击我们。相同的道理,僵尸代码也是处于不生不死之间…
谈及linux补丁(patch)及其patch操作,自然而然地觉其复杂,故一直存敬畏之心,所以也就一直远离它。但像做嵌入式linux开发,有时候patch是无法绕过的。
对于补丁制作与应用,实际上就是掌握linux diff和patch命令的使用,而这两个命令与linux其它命令一样,也是比较容易掌握的。如果你也有与我之前一样的敬畏心理,建议你不如早早放下这个心理包袱,赶紧掌握这个知识点。 阅读全文 »
在snmpwalk介绍及其用法一文中,介绍过net-snmp的snmpwalk的用法,殊不知,net-snmp还有trap的命令程序,可以用来测试snmp的trap方法(包括inform方法)。这些命令程序是: snmptrap、snmpinform和snmptrapd。其中:
由上可见,通过上述3个命令程序,我们可以研究snmp的trap行为及其报文,如果你正在开发snmp agent的trap功能但又没有snmp管理端,这3个程序则可帮上你的大忙。下面详细介绍这3个命令程序的具体用法。 阅读全文 »
摘要:你喜欢Linux吗?你想学Linux吗?你真的了解Linux吗?其实Mageia现在是受关注度第二的Linux;马达加斯加是世界上对Linux最感兴趣的国家之一;Linux手机年增长率91.5%;Linux Kernel总共有超过1500万行代码。如果你不知道的话,这篇文章值得你一看。
最受关注的Linux发行版分别是(从高到低):
Mint、Mageia、Ubuntu、Fedora、openSUSE、Debian、Arch、PCLinuxOS、CentOS和Zorlin。
Linux占桌面网络浏览份额的1.17%。
对Linux最感兴趣的10个国家和地区分别是(按字幕顺序排位):
China、Cuba(古巴)、Czech Republic(捷克共和国)、Germany、India、Japan、Madagascar(马达加斯加)、Lesotho(莱索托王国)、Russia和台湾 阅读全文 »
今天在看CS8900的驱动时,发现其驱动的模块加载函数是init_module(),由于看到大多数的驱动用的模块加载函数大多是module_init()函数,所以一时没缓过神来,总是在找CS8900的加载函数。
那么,module_init()和init_module()这两个加载函数有什么区别吗?
init_module是默认的模块的入口,如果你想指定其他的函数作为模块的入口就需要module_init函数来指定。
init_module()是真正的入口,module_init是宏,如果在模块中使用,最终还是要转换到init_module()上。如果不是在模块中使用,module_init可以说没有什么作用。总之,使用module_init方便代码在模块和非模块间移植。
C/C++程序一般都由程序员自己来控制内存的申请和释放,因此稍有不慎就容易出现内存泄漏,大家平时开发中都用什么方法和手段来检测、调试程序的内存泄漏呢?
1. 如何发现内存泄漏
ps -aux
2. 静态分析 阅读全文 »
在MinGW GCC下编译带sleep()函数的测试程序,不管是包含了unistd.h头文件,还是stdio.h、stdlib.h头文件,就是找不到该函数的定义!
在linux下,sleep()函数的头文件是:unistd.h,但在MinGW GCC下没有了这个函数的定义,但是在windows.h文件中有Sleep()函数的定义,其单位是ms级的延迟处理。根据这种情况,我们可以采用如下的处理:
1.系统和平台熟悉
在一个新的平台上开发或者移植一款软件的时候,首先应该充分了解平台或者操作系统的各种属性,这些属性包括但不仅限于:
1)系统的任务调度,任务间的通信机制
任务调度包括是否是多任务实时操作系统,任务以何种方式存在的,如何添加和管理任务?任务间的优先级如何设置?任务间的优先级设置?任务堆栈?任务间的通信机制包括了解系统提供的通信机制,各种通信机制的优劣,通信细节等等。
案例1:
曾经在某一个平台上做一个软件,创建了多个任务,由于各个任务实现者不一样,一个漫不经心的错误造成了本该是高优先级的任务没有在优先级上体现出来,A,B,C,D4个任务,本来应当是A>B>C>D,结果设置成A>C>B>D,为此debug了一上午。
教训: 阅读全文 »
当前一个项目中需要用到音频,用到的音频芯片是CS4344,驱动是从linux内核自带的AT73C213音频IC驱动移植过来的。
在用自己写的应用程序播放音频文件的时候,发现随着播放不同的音频文件,内存的使用越来越多,甚至高达27或28M(总共内存是32M)。由于在这之前没有关注过linux的cache机制,判断内存是用top命令的used的值来判断的,因此将这个问题判断为内存问题。
由于音频驱动是alsa架构,而播放音频的应用程序是直接用系统函数write写的,即直接写音频文件到音频设备,开始判断为是应用程序导致的内存问题。于是移植了alsa-lib和alsa-utils,但用aplay测试的时候,总是不能设置参数,提示:Invalid argument,后面自己写的基于alsa-lib的测试程序也是出现这个问题,google了好多资料,也无济于事。
于是怀疑是不是音频驱动的问题,经查,原来移植驱动的时候,把采样频率的最大值最小值设定为同一个值,如下所示的14,15行: 阅读全文 »
© 2012 velep.com | reille blog | 管理| 粤ICP备15065318号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha |