自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qb_2008的专栏

哪怕是被默默注视的我也会有飞翔的勇气

  • 博客(53)
  • 资源 (7)
  • 收藏
  • 关注

原创 SRM 693 - TriangleTree (枚举加剪枝)

题意如下:在一个无向图中,求无三角形的顶点子集的个数。三角形是指存在顶点a, b, c. a, b, c三顶点间任两个点都有一条边相连。long long count(int n, vector x, vector y);  // n为顶点个数,x, y是边的集合,x[i]与y[i]相连,n 看到这道题比较抓狂,最简单的办法是枚举所有的子集,然后验证,显然2^60是超时的。然后考虑

2016-07-18 12:33:26 829 1

原创 貌似桶排序的快速排序—线性时间

我们假设要对一个数组进行排序,排序的key值为32位整数类型。那么可以使用快速排序对数组进行排序,但快速排序虽然简单易用,但它的平均情况和最坏情况复杂度是不同的。平均情况下,快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)【分配给递归调用时的堆空间】;最坏情况下,快速排序的时间复杂度为O(n2),空间复杂度为O(n)。但如果要排序的是整型key值,就可以利用桶排序对其按位分配,使

2013-04-30 19:47:38 1216 1

原创 增加资料收集和经验分享的部分

很长时间以来,我理所当然地用着开源的工具和代码,看别人的博客和文章,却没有什么贡献,自己的工作成果和经验几乎没有和外界分享过。现在我才发现自己太过固步自封。一个程序员专注于自己的技术是一件好事,但缺乏和外界的沟通和互动是很大的问题。这个世界很大,我们有太多的已有项目经验和论文可以借鉴,单靠自己闭门造车绝对会被甩到千里之外。这种更深程度的参与需要更加良性的互动,一个具有分享精神的人才更善于吸取别人的

2013-01-24 00:47:33 1191

原创 做事情的六条原则

这是我自己琢磨的做事的六条原则。我发现自己如果没有遵守它们中的某一条,就会行动缓慢,效率低下,基本看不到成果。所以应该记录下来,作为备忘。六条原则如下:1. 一次只做一件事情。即一个时期只能以一件事情为主,其它都是为了应付。2. 不要做出自己难以实现的承诺。如果不承诺,现在会很尴尬;但如果承诺了,以后会更尴尬,而且绝望会让人效率更为低下,甚至拒绝工作。3. 做事时制定详细的计划,短

2012-12-22 23:25:33 1846

原创 更积极地学习

很多时候,我们都是被动迎接挑战,或者是项目需要,或者是程序版本的更新,又或者是为了迎合潮流。已经受够了各种各样的惊喜,要想改变被动局面,就要未雨绸缪,在发现事情端倪时就主动去接受它,学习它,掌握它。这样我们才能更加从容地应对挑战。不要以为时机还未成熟,或者为自己找各种忙的理由,你所需要的只是进行一个开端,接下来就是按部就班地跟进。但积极地学习也绝非一味迎合潮流,成为新技术的鼓吹者。它应该是一种

2012-12-22 23:01:42 1009 1

原创 调试小记3

在实验新东西时往往遇到这样的情况,你一点点地增加功能,添加代码。但在添加某一个新东西时,突然发现原来已经稳定的内容又不行了,真是不进反退。这时往往不是新的东西有问题,而是新的东西和已有内容混合造成的影响。甚至可以理解为已有内容中存在的bug,只是没有表现出来,新的东西一混合进来,一切都乱套了。这种bug不好调试,因为你退回去,系统又正常了,进一步,系统就紊乱了。你只能把这一步拆成许多小步,或者从各

2012-12-07 16:03:17 873

原创 调试小记2

最近遇到一个很棘手的bug,值得记录一下。这是在stm32f103vct6单片机上运行的ucos程序,我根据一些书上的描述移植的(很简单),使用标准库和usb驱动库,因为板卡的USART1没有直接的串口接口,所以使用usb与主机通信并调试。开发环境是eclipse,其实是用makefile+arm-none-eabi-gcc工具链编译的,集成得不好,就是写代码方便。我创建了两个任务,大致代

2012-12-04 16:35:22 1409 1

原创 newlib的编译和使用

要熟悉一个新的处理器平台,第一件事是写一些裸机程序。这时我们最想要的,是实现一个printf打印函数,以便及时输出各种信息。除去下层的字节输出驱动不说,printf本身的实现就有够麻烦,如果平时有保存相关的代码还好,不然就很浪费时间。除此之外,还有一些诸如strlen、strcpy之类的函数,我们不愿意自己写,既麻烦而且效率不高,如果能借助已有的代码或库就好了。newlib就满足了

2012-11-27 00:38:06 21079

原创 关于学东西的耐心

都说现在社会的风气很浮躁,学习和工作都是急于求成,缺乏耐心。我想,这种现象在我们计算机专业就应该更普遍了。    计算机本就是是一个应用学科,就是学了拿来做事的。你学一项技术,绝大部分不是为了将这项技术发扬光大,而是要会用它,拿它来做事,拿它来作为自己技能术的一部分。这种情况下,学起来想不浮躁都难。    再者说,计算机发展虽然短短几十年,但技术是日新月异,每隔两三年就是一番新气象。虽说基

2012-10-20 02:09:34 1648 2

原创 关于做事情的计划

我发现自己在做一种事情的时候,是最慢的,最不情愿的。那就是必须做的、但自己觉得不紧急不重要、又没有明确的时间界限的事。比如学英语、锻炼、对已有的程序进行修订,等等。其实这是非常不好的。千里之堤,溃于蚁穴。往往是那些微不足道的小事,在日积月累间决定了人的命运。比如我喜欢做有些挑战的事,不愿意做简单的重复的工作,喜欢学习新的东西,但又缺乏耐心。这种喜好有优点,也有缺点。其实生活也好,工作也好,不可能任

2012-08-28 14:52:28 1408

原创 关于代码分析

我知道每个人的成长都不相同。有的人顺风顺水,有的人命途多舛,有的人独树一帜,有的人引领潮流...... 并不是说谁比谁强,只是各有所长罢了。学习编程多年,我觉得自己的优势,不是精通程序设计,也不是有多少编程诀窍,而是喜欢进行代码分析。如果大家不嫌弃,就听听我的经验。    自从开源运动发展以来,最有效经典的代码就不只是诞生在封闭的实验室中,而是广泛流传在网络上,存在于各个开源项目中。学习和借鉴

2012-08-26 00:00:54 1964

原创 关于ppc的32位立即数加载问题

在ppc指令体系中,一次最多加载16位立即数。要加载32位立即数,必须分两次进行。很多资料上使用如下加载指令:    lis r0, 0x1122    addi r0, r0, 0x3344    这样做确实可以成功地把0x11223344加载到r0中。可是如果换成0x11118000呢?    lis r0, 0x1111    addi r0, r0, 0x8000

2012-08-25 22:55:40 2290

原创 有趣的调试过程

有人说,程序员写代码的能力一定要强,如果写代码不行,错误百出,那他调试能力一定要强。总之,两个优势中至少要占有一个,否则写代码又烂,自己又改正不了,岂不是糟糕至极。本人不才,写代码经常丢东拉西,每次检查自己的程序,几乎都能发现新的bug。在惊喜不断的同时,也锻炼了我临危不惧的神经。开始我很害怕发现程序的错误,写好程序都不怎么用,发现bug后也是尽快修复,很少去系统地检查和测试。后来我发现这样做其实

2012-08-25 16:09:40 1104

原创 linux对嵌入式程序员的帮助

之前在arm和powerpc的实验板写过一些代码,得以接触arm上bootloader- vivi 和powerpc上的bootloader-uboot。两者虽然都是bootloader,但我却有很有意思的发现。    vivi是韩国三星公司为其s3c2xxx系列的arm芯片编写的bootloader,但我发现它的目录结构,配置方式,makefile系统(简称make系统),都与linux内核

2012-06-19 00:34:12 1383

原创 开篇&《程序员的思维锻炼》

近半年一直没有什么技术文章好写,倒不是没有学习,而且发现许多书上讲得已经足够精彩到位,比自己的蹩脚分析要系统精彩得多。现在各种编程书籍到处都是,电子版的也很多,国内一些培训机构如华清远见就出了大量的嵌入式培训书籍,质量很高。我想与其费时费力地写文章“误导”大家,不如把我发现的好书分享出来,供大家参考。   可能有这样的看法:程序员编程就行了,不需要读书。我的经验告诉我,事实并非如此。读书可以开

2012-06-09 15:25:11 3367

原创 调试小记

就像许多文章中说的那样,调试一定要冷静,要耐心。急躁解决不了问题,盲目地修改很容易添加新的bug,让问题更加复杂。调试时需要活跃地思维,从不同角度去测试程序,观察结果,并思考为什么会这样。能把自己思考的过程写成文档记录下来是最好的。调试不一定非要把bug揪出来,也不是对程序不能做优化。如果调试过程中发现有更好的实现方法,或者可以优化的地方,可以先优化,再调试。当然我并不建议对程序做大的改动

2012-06-06 20:51:28 913

原创 串口通信与裸机程序

串口,实在是一个历史悠久的通信方式。如今许多电脑笔记本都不再支持串口,但在嵌入式中,串口却起着举足轻重的作用。嵌入式的控制器,一般都是在arm, sparc, powerpc等处理器外围添加控制单元形成的,其中必然有控制串口的部分。串口的通信,可以简化为两根线Tx, Rx,Tx负责发送,Rx负责接收,当然一端的Tx引脚自然是接到另一端的Rx引脚上。虽然传送是按位来的,但因为有串口控制单元,所以程序

2012-06-02 13:08:10 1783

原创 一段评价程序平均运行时间的shell脚本&shell脚本编写注意事项

#!/bin/bashusage(){ echo "$0 -c command [-r repeat time]"}# average_time head_match_string filenameaverage_time(){ head=$1 filename=$2 minutes=`sed -n "s/^$he

2012-06-02 11:56:55 2255

原创 那些疑难杂症

在平时编程时经常遇到各种疑难杂症,有的只是小bug,调试调试就过去了。有的却是因为自己对CPU或硬件的工作方式理解有错误,这就麻烦了,因为你永远也无法从你百分百相信的代码里找出错误。除非是长期苦恼纠结后的灵机一动,或者看过别人代码或相关书籍后的恍然大悟。我想在这篇文章中加以记录,聊作警戒或谈笑之用。    1. nor flash擦除    我是首次需要自己擦除nor flash。根据fl

2012-05-27 19:05:08 1338 1

原创 程序员杂谈

很久不写技术贴,感觉很不安。最近都是在写些心情感想,励志的作用到时有一些,更多是一种宣泄。幸好这里不是会自动向好友推荐的qq博客,我也将其归到“心情杂谈”一栏,希望不小心读到的朋友见谅。    我其实只是一个计算机的学生,以前是大学生,现在是研究生,csdn账号从2008年一直开到现在(从我账号就可以看出)。虽然是学生,但我一直是自称程序员,因为我一直坚信程序员是我的最终道路。因为程序员这个职

2012-05-17 01:01:20 2810 3

原创 面对惨淡的人生

记不清自己上次按照预定完成计划是什么时候了,只记得在十分钟前我还在为以前写的程序修改bug。如果说有什么是最让程序员沮丧的,那就是长期以来都无法完成自己的计划;如果说还有更糟糕的,那就是在无法完成计划的同时还要为以前写的程序不断地擦屁股(修改在运行时发现的问题)。最近我在做自动化测试的工作,它需要把同一类操作进行上千次,运行时间可以长达几天。我发现这绝不是一件轻松的工作,因为问题往往不是一开始就出

2012-05-10 01:29:21 3707 2

原创 做一个程序员的条件

曾经,我以为做一个程序员是最轻松而有趣的。程序员们拥有和计算机同样的神秘感,并可以控制计算机做自己想做的事。但实际情况已经和数十年前不同了,那个整台计算机只有64K RAM的时代已经远去了,我们正在日益被疯长的代码与程序所淹没,从而变成计算机的奴隶。所以说现在做程序员可不是一件简单的事,至少你要保持乐观积极的心态,还有过得去的健康状态。    奥特曼不能总是打小怪兽。你是否发现最近都在做一些无

2012-03-12 00:31:18 1168

原创 开篇

在我看来,写博客的目的不是取悦读者,也不是炫耀自己。博客应该是一种倾诉,一种记录,一种鞭策。    我们都有倾诉的欲望,程序员更是如此。纠结了一整天的bug终于被解决了,哪怕起因只是自己一不留神把变量名打错了,你也会想好好找人倾诉一番。在我初写博客的一段时间里,每天早晚都要查看一下自己的文章有多少人浏览过,为一些相对热门的文章沾沾自喜,为一些乏人问津的文章抱怨其怀才不育。真的很感谢那些看过我文

2012-01-15 01:12:00 1284 3

原创 ucos中的三种临界区管理机制

熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界去管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。同样是通过关中断来保护临界区,OS_ENTER_CRITICAL/OS_EXIT_CRITICAL一共实现了三种实现方式,如下所示:#if OS_CRITICAL_METHOD == 1#d

2012-01-15 00:24:35 13950 5

原创 linux内核部件分析(十一)——waitqueue与线程的阻塞

当你必须一个复杂的系统,协调系统的方方面面,灵活地支持各种机制和策略,即使很简单的问题也会变得很复杂。linux绝对就是这样一个复杂的系统。所以我们要理解它,尽量从原理的角度去理解事务的处理流程,尽量避免各种细枝末节的干扰,尽量规避那些足以压垮自己的庞然大物。(尽管细致末节和庞然大物很可能就是linux闪光的地方,但我们还是小心为上。)原理    现在我们来考虑linux中线程的阻塞。它的

2011-10-31 02:15:08 8695 1

原创 人该怎样强大起来2

前几天看到俞敏洪先生在《我们》栏目谈大学生就业问题的访谈,我深受触动。其实现在大学生也好,研究生也好,都是在高校的象牙塔内,作为天之骄子,感受不到在社会上生存的压力。再加上现在高校普遍采用放羊式教学,严进宽出,学生的能力和素质并没用得到很好的锻炼和提升。而学生最大的短板之一,恐怕就是心理承受能力。    俞先生举了一个例子。一堆面粉,放在案板上,你一拍,就散了。加点水,揉一下,你再拍,就不容易

2011-10-30 01:01:45 1326

原创 linux内核部件分析(十)——设备驱动模型之class

前面看过了设备驱动模型中的bus、device、driver,这三种都是有迹可循的。其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动。但本节要介绍的class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口

2011-10-10 03:27:22 11856 3

原创 linux内核部件分析(九)——设备驱动模型之device-driver

前面我们分析了device、driver、bus三种类型,主要是三者的注册与注销,在sysfs中的目录与属性文件创建等内容。本节就来详细分析下,在设备注册到总线上时,总线是如何为其寻找对应的驱动的;在驱动注册到总线上时,总线又是如何为其寻找对应的设备的。    本节的实现代码

2011-10-09 00:55:50 5607 2

原创 linux内核部件分析(八)——设备驱动模型之bus

前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起。本节就来看看设备驱动模型中起枢纽作用的bus。本节的头文件在include/linux/device.h和drivers/base/bas

2011-10-08 10:56:51 6414

原创 linux内核部件分析(七)——设备驱动模型之driver

上节我们分析设备驱动模型中的device,主要是drivers/base/core.c,可以说是代码量最大的一个文件。本节要分析的驱动driver,就要相对简单很多。原因也很简单,对于driver,我们能定义的公共部分实在不多,能再sysfs中表达的也很少。本节的分析将围绕dri

2011-10-08 01:41:25 5408 1

原创 人该怎样强大起来

身处这个纷繁复杂的社会,一不小心,二十多个年头已经从指间溜走。已经大学毕业的我却依然如刚上学时的懵懂,一样不知道未来在哪里,一样感觉到自己的脆弱。如果说一定有什么变化,或许是梦想吧。最初的我,梦想完全是自由的,可以天马行空,可以随心所欲。但现在,却已有了太多的羁绊。现实的压力压得

2011-10-07 22:04:36 2582 4

原创 linux内核部件分析(六)——设备驱动模型之device

linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线、设备、驱动、类所组成的关系结构。从本节开始,我们将对linux这一设备驱动模型进行深入分析。     头文件是include/linux/device.h,实现在drivers/base目录中。本节要

2011-10-07 17:01:14 7118 2

原创 linux内核部件分析(五)——设备驱动模型的基石kobject

之前我们分析了引用计数kref,总结了sysfs提供的API,并翻译了介绍kobject原理及用法的文档。应该说准备工作做得足够多,kobject的实现怎么都可以看懂了,甚至只需要总结下API就行了。可我还是决定把kobject的实现代码从头分析一遍。一是因为kobject的代码

2011-10-06 13:32:38 7775 2

原创 sysfs API总结

sysfs是用于表现设备驱动模型的文件系统,它基于ramfs。要学习linux的设备驱动模型,就要先做好底层工作,总结sysfs提供给外界的API就是其中之一。sysfs文件系统中提供了四类文件的创建与管理,分别是目录、普通文件、软链接文件、二进制文件。目录层次往往代表着设备驱动

2011-10-06 11:07:11 18870 2

原创 linux内核部件分析(四)——更强的链表klist

前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种

2011-10-05 23:57:37 8020 2

翻译 Everything you never wanted to know about kobjects, ksets, and ktypes

要理解kobject抽象及其之上的设备驱动模型并不简单,难点之一就在于,没有一个明显的起点。要处理好kobject,需要理解一些别的类型,而这些类型又是相互引用的。为了让事情简单,我们采用多遍的过程,从模糊的概念出发,逐渐增加细节。为此,这里先对一些相关概念进行定义:—kob

2011-10-05 12:20:30 2819

原创 linux内核部件分析(三)——记录生命周期的kref

kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。

2011-10-02 21:21:40 15365 4

原创 linux内核部件分析(二)——原子性操作atomic_t

在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的。在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的。为了弥补这一缺点,x86提供了附加的lock前缀,使带lock前缀的读修改写指令也能原子

2011-10-02 20:19:16 29459 2

原创 linux内核中的内存屏障

前言       之前读了关于顺序一致性和缓存一致性讨论的文章,感觉豁然开朗。对linux内核中出现的种种同步和屏障,想做一点总结。缓存一致性       之前一直认为linux中很多东西是用来保证缓存一致性的,其实不是。缓存一致性绝大部分是靠硬件机制实现的,

2011-10-02 17:27:30 4584 1

转载 spin lock在kernel 2.4与2.6中的实现与改进

1. TAS lock (test-and-set)这是最简单的spinlock,CPU会在硬件上提供一些指令来帮助OS实现spinlock,比如x86就有xchg, LOCK指令前缀等指令。。。test_and_set()可以利用这些指令对某个memory地址,来原

2011-10-02 15:39:23 3211

rtems移植代码分析之sparc-leon2

rtems移植代码分析之sparc-leon2: 对rtems中针对sparc处理器、leon2兼容板卡移植代码进行分析, 主要包括三部分代码分析:cpukit/score/cpu、 c/src/lib/libcpu/sparc、c/src/lib/libbsp/sparc/leon2 希望能对喜欢rtems或者sparc的人有所帮助,共勉!

2012-08-13

GNU autoconf automake and libtool

GNU Autoconf, Automake, and Libtool By Vaughan, V. Gary, Ben Elliston, Tom Tromey, Ian Lance Taylor

2011-07-24

java_swing.chm

java_swing程序设计.chm 介绍swing各个组件

2010-04-30

mysql-connector-java-5.1.5-bin.jar

mysql-connector-java-5.1.5.jar

2010-04-30

数据库系统概念课后答案

数据库系统概念课后practice和exercise答案

2009-11-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除