最新日志

发表于:2007-12-31 22:57:17
标签:2007  小结  

1

我的2007年『原』

        2007年是我大学期间最不平凡的一年,如果2006年湖北省电子设计大赛的那四天让我懂得坚持可以给人带来收获,那么2007年她让我懂得坚持的力量,让我学会了坚持。

        2月初,很多人一考完就回家,我留校了两个星期才回去,期间我学习了ARM,对ARM有了一个初步概念;同时也接触了Ubuntu,熟悉了一下基本shell,可是也得了重感冒,从我初中起从来没有感冒过,那一次感冒相当严重,吊了4瓶水,好在我回家后马上就好了,真是搞不懂这其中的奥妙。在家待了不到10,可其中至少有七八天我是不在家,天天被逼得去跑亲戚,估计也就大年30那天我在家待了一天,哎呀,当时想啊,我啥时候能过个好春节啊。

        3月不到我便会校,呵呵,当初我为了今年的全国大赛我寒假利用的两个星期熟悉了下ARM3月份我又花了一个月很系统的熟悉了LPC2200系列的ARM内核,这一个月我天天与ARM打交道,解决了寒假遇到的很多不解的问题。

        4月份我开始学习UCOS,当时只是对其内核机制有了一个初步的了解,能用的那种,4月中旬左右,学校开始组织为备全国电子设计竞赛开始做模块,令我失望的是总指导老师把我们组分配去做电源,呵呵,我们3个是从来没有接触过的,一切从零开始,我也放下了ARM的学习,开始学习电源,后来发现带我们组的危老师压根就不管我们,什么问题都得我们自己解决,那个瞎摸劲,我现在都觉得冤枉,自然进展很慢。

        5月,起初的5*1七天我们准备把第一个模块给搞定的,呵呵,真是搞笑死了,我们最后不会绕变压器,饶了N次,就是不行,让危老师检查时,说编译器没绕好,呵呵,更可笑的是我们当时简直完全乱套了,我们当时做的是一个开关电源,可是我们的开关频率只有500Hz,哈哈哈,我都想笑啦,前面4天我们把一些基本电路调试出来,可是变压器就是不行,吱吱叫,呵呵,500Hz的开关频率不叫才怪呢。更可气的是在实验室拿电阻都得向总指导老师登记,而他又不天天来,那个时候元器件也没有,干坐在实验室瞎看天花板,够郁闷的,自然那七天也没有把它做出来,然后就一直没做,我们就一直在看电源方面的书,呵呵,到了5月底吧,总指导老师见我们没有做出来把我们给训了一顿。然后又开始动起来。

        6月了,我们终于把变压器给绕好了,联调都出结果了,只是指标还不行,没办法,只能制版,因为开关频率实在是高,可是制版时那个家伙实在把我们给气晕了,我们以前感光板已经用完,得等下一批,这一等就是一个星期,哎哟,我的妈呀,那个心急啊,好不容易把它们给盼来,得了,结果这次跟上次的不一样,印刷制版跟上次不一样,结果老师把我们给骂了一顿,最后请来我们年纪的高手来制,呵呵,同样的结果,没办法,这估计是板子的我问题,又等了一个星期之久,才由造那感光板的公司来教我们怎么做,哦,原来曝光时间短了,够麻烦的,这一下要考试了,又得把它丢在一边,当初真是烦啊,总感觉56月份是完全乱费掉了,本来打算全国大赛用ARM平台的,呵呵,那个时候我们还没有开始画平台板,我自己当初还不会PCB,以为老师会帮画的,呵呵,最后全部没戏。

        7月,考完试时已经是78号了,好象是在10号吧,李老师要我把电脑搬他实验室去,我马上明白啥意思,由于当初学校的暑期培训仍然没有开始,又加之56月的瞎闹,让我对学校的做法感到很是气愤,于是我便把电脑搬了进去;当时李老师在外面包了一个项目,让我帮他编程,这一编便是一个星期,学校也已经开始了暑期培训,我自然没去那边,呵呵,这期间N多事我想都没想到的发生了,先是被总指导老师什么也没问给骂了一顿,其实这我倒无所谓,本来是我有错在先;呵呵后面这件事让我忍无可忍,我大赛用得平台是另一个小组的人画,当时他们制好版后,TMD竟然不给我,操你大爷的;当时在李老师那边程序还有点小问题没解决,然后又被老师给骂了一顿,之后又被一个垃圾在背后插一刀,我日,当时气得直接跑到实验室,准备自己跟另一个也被他们给背叛的哥们一起画一块,但是当时已经到了7月底了,计算顺利,那也得8月初才能见到我们的板子,更何况我们两都是新手,0基础,没办法,先画了再说。后来越想越不对劲,一气之下跟指导老师说我放弃了今年的全国大赛。

        8月,我继续在李老师那完善那个项目,好了后他把实验品带到公司去验收,期间我重新复习了下ARM的启动代码,切低弄透它的机制,而且又把UCOS源代码也分析一遍。后来李老师回来后,说那边公司很满意现在的情况,说要在上面再加个东西,就是把电流电压给测出来,我的妈呀,我当时一天,这电流变化范围从几十安~几千安的变化,如何测啊,还有一个更重要的问题功耗也得考虑,那时我真正懂得产品跟电子设计大赛完全是两码事,当时想想没参加也值;然后李老师天天思考方案,我在一旁跟不上他思路,直接让他想得了,到时候让他告诉我。期间我认识了我们学校的另一个牛人,他是从大一开始就知道玩单片机,当时真羡慕他的环境,然后又知道他玩过USB,恰好当时李老师方案一时半会想不出来,我开始研究USB,呵呵,又是0基础开始,在图书馆翻了N次书,总算把USB1.1搞定。

        9月,头等戏当然是全国电子设计大赛,原本和我一组的两个人要我过去帮他们,我第二天去了一次,就帮他们看了一下程序,没发现问题,本来那个软件不难,难在硬件,于是我第三天没有来,第四天李老师要我过去帮另一个组写一个液晶的程序,汗!!!那时候中午了,并且用得是C8051,没玩过,在那闹了一通,实在写不出来,在那个环境,并且时间那么短,中途直接不写,去帮我老乡他们,弄到很晚才回宿舍。月底和一个哥们个买了一个S3C2410的开发平台,把电脑从李老师搬了回来,开始研究ARM9

        10*1期间我开始熟悉Linux下的ARM启动代码vivi,也开始学习linux下的编程,反正遇到N多问题。不过国庆假完了后我心中对嵌入式linux学习至少有了一个初步的流程;到了中旬,开始找工作,那个时候我唯一的感受就是我身边到处是研究生

        11月,找工作为主,也是收获OFFER的季节,最后选了国芯,之后就一直玩。

        12月,没心思学习,也是玩,到了下旬,好不容易找到学习的感觉,希望能够持续到明年。

        再过一个小时左右就2008年了,目前还没有一个很好的规划,一切要去了公司才心里有数,希望自己2008年是一个丰收年,至少我不会放松我自己!!!

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 原创

评论(0) | 阅读(453)
发表于:2007-12-29 21:11:00
标签:as  gun  

0

linux汇编学习『原』

    近来这些日子好像找到了昔日学习的劲头,希望能继续延续下去,让自己的大四过得充实些。
    以下是这两天的汇编学习笔记:

  as来调试汇编程序时,要借助-gstabs参数来将调试信息汇编进可执行文件中;这里面要注意的是如果使用gcc的话,则是借助-g参数来实现。

  在调试的过程中,如果要设置断点时,不能按照调试c语言的方法来设置断点,必须用如下的格式:b『或break *_start『或其它自定义的起始标签』+_start的行数;并且起始标签后的第一条语句必须是nop『意思是空操作』,否则你所设的断点无效,这也是GUN汇编器的缺陷。

  我们写的汇编程序中如果调用了C库函数时;连接时必须把库文件链接到目标代码中去;在linux系统中,有两种方法:一是静态连接,它是把目标代码直接连接到可执行的文件中去,势必会创建很大的可执行文件;二是动态连接,运行时它是由操作系统调用动态连接库,这样它可以节省空间,而且多个程序可以共享动态连接库。但是如果用gcc来编译,就可以省去这部分,因为gcc编译器是自动连接所需的C库文件

  linux下的汇编程序是由3个常用的段组成,分别是数据段、bss段、代码段。所有的汇编程序必须有代码段『其格式:.section .text』,该区域是放指令码的地方;数据段它是可选的『其格式:.section .data.rodata』,用.data命令声明的数据段,这个段的任何数据元素都保留在内存中并且可以被汇编语言的指令读取和写入,如果用.rodata命令声明的数据段,这个段中的任何数据元素只能按照只读『read only』的方式访问bss段声明的数据『其格式:.section .bss』是用0null来初始化的,它有一个好处就是这部分的数据不在可执行程序中,所以它不像data段声明多少数据就占用多少空间。

  linux下的数前面必须加上美元符号$才能是立即数。

  linux下汇编程序中内存的变址查询模式:

base_address(offset_address,index,size)à base_address + offset_address + index * size

  当使用标签引用内存位置中包含的数据值时,前面必须通过美元符号$才能获得数据值的地址。


点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(378)
发表于:2007-12-27 19:06:31
标签:ld  

1

ld之解『原』

    找工作前学习网上流行的《S3C2410完全开发流程》时,碰到这么一个问题,就是Makfile中有一个出现了ld,当时我不知道为什么要这句,试着把ld那句注释掉,结果死活不能make通过;当时查了N多资料,就是没找到。今天下午上自习时,仔细看了下昨天借的Richard Blum著《Assembly Language》『中文版』;呵呵,仔细看了两个小时,没白看,无意中把前面的问题给解决了,呵呵。
    因为汇编程序被转化成可执行文件时,连接器必须知道指令码中的起始地址。为了解决这个问题,GUN汇编器声明一个默认标签,或者说是标志符,它就是_start。如果连接器找不到_start,就会生成错误信息;错误信息我就不贴出来了。当然也可以使用_start以为的标签作为起始地点;但是必须通过-e来说明。
    比如有一个汇编文件cpuid.s;它转化成可执行的文件cpuid。是通过:
    as -o cpuid.o cpuid.s   #起始标签为_start
    ld -o cpuid cpuid.o
或:
    as -o cpuid.o cpuid.s   #起始标签为_start1
    ld -e _start1 -o cpuid cpuid.o
    我们知道GCC它不仅能编译汇编语言,还能编译高级语言如C语言。那么GCC它又是以什么标签来作为起始地址?我们知道C语言中至少有main函数;所以main便是gcc要找的标签。如果要用gcc来编译上面的cpuid.s,必须把源文件中的
    .globl _start
    _start:  
改为.globl main
    main:
    不知道大家明白了不。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(522)
发表于:2007-12-18 18:20:40
标签:C语言解惑  C指针  

0

“考考你的C指针”题解『原』

    前面几天我贴下《C语言解惑》的一个C指针程序,呵呵,放在我的百度空间和EDN空间,总算我百度的一个网友做出来了。先不说答案,且听我如果解答这怪题。

#include<stdio.h>
char *c[]={
    "ENTER",
    "NEW",
    "POINT",
    "FIRST"
};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;
int main(void)
{
    printf("%s",**++cpp);
    printf("%s   ",*--*++cpp+3);
    printf("%s",*cpp[-2]+3);
    printf("%s\n",cpp[-1][-1]+1);
    return 0;
}

呵呵,我解释下char *c[]c是一个数组名,数组里面的元素是一个指针,这个指针指向的是一个字符串cpp的结构用语言描述下,cpp是一个地址,这个地址里面的内容放的是cpcp是个什么东西呢,也是一个地址,这个地址里面的内容放的是c+3,而c+3也是一个地址,其地址是字符串 FIRST\0 的首地址;现在我把cpp初始化的结构画出来,如下:


    相信大家应该可以解决这个程序问题,如果还不能,建议去看看《C和指针》。哦,对了,忘了说答案的,答案是POINTER  STEW


点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(542)
发表于:2007-12-16 13:48:47
标签:C语言解惑  C指针  

0

考考你的C指针『原』

    最近两天在图书馆发现一本《C语言解惑》,自己仔细的看了一下,写得不赖。我顺便把里面一道C指针题贴出来考考大家,过两天我再贴出答案;如果没什么把握建议你去看下《C语言解惑》,绝对值!!
#include<stdio.h>
char *c[]={
    "ENTER",
    "NEW",
    "POINT",
    "FIRST"
};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;
int main(void)
{
    printf("%s",**++cpp);
    printf("%s   ",*--*++cpp+3);
    printf("%s",*cpp[-2]+3);
    printf("%s\n",cpp[-1][-1]+1);
    return 0;
}

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(4) | 阅读(900)
发表于:2007-12-12 9:31:58
标签:实时系统  ucos  

0

实时系统概念『原』

这几天边看电影边整理的笔记。大家得捧场哈!以后会经常有的。

         首先我们的熟悉实时系统的概念,实时系统它分为软实时硬实时软 实时系统它是指系统的目的是为了使各个任务尽快的执行,而不要求限定的某一个任务在多长时间内完成,也就是该系统超过规定时间对系统不会产生很大的影响, 系统依然可以运行。而硬实时系统则不仅要求任务执行无误,而且还要做到准时;也就是说在一到达规定的时间,任务必须完成,否则会给系统带来灾难性的后果。

         我以前写的程序很多是没有嵌系统的,所以它们称为/后台系统超循环系统。那么什么是前台,什么是后台呢?我们的程序中有个main函数,这个函数肯定是一个无限循环系统,在循环中调用相应的驱动函数完成相应的功能,这部分可以看成是后台行为一般的系统都是有中断发生的,那么中断服务处理程序可以看成是前台行为;固有这个说法,后台可以成为任务级,前台成为中断级这种前/后台系统有一个很大的缺点,就是任务级的响应时间不是固定的,因为它是循环中的一部分,所以取决于循环运行的时间,所以前/后台系统很容易跑飞。

         代码的临界段也称临界区,指处理时不可分割的代码;所以进入临界区之前必须关中断,临界区代码执行完后,必须马上开中断。

任务,在UCOS-ii实时系统中,一个任务其实就是一个线程,该任务可以认为CPU完全属于它自己。UCOS-ii中的任务拥有自己的堆栈和CPU寄存器,并且赋予一定的优先级,在UCOS-ii中,它可能处于睡眠、就绪、运行、等待、中断服务状态之一。1睡眠状态它是一个什么样的状态呢,它其实是指一个任务在内存中就占用一部分ROM,它没有被操作系统分配任务控制块,它和其他状态下的任务没有任何直接联系,也就是说不能被内核调度,就好比 我们去吃饭,正在路上2就绪状态它是指操作系统给它分配了任务控制块,已经在就绪列表中登记中,它此时不能运行是因为它的优先级不是最高的,就好比我们去吃饭时在那排队一样3运行状态 是指一个任务正在运行,应该好理解,就好比食堂工作人员在给我们打饭4等待状态就是一个任务由于一个的条件没有满足,比如说在等待一个信号量的到来,而被至于等待状态,就像我们在打饭时,如果工作人员还没有来,那你没办法,你就得等拉5中断服务状态就是在某个时刻突然因为一个中断到来,那么 这个任务就会马上被中断掉,从而处于中断服务状态,比如一个饿得受不了的人,如果抢你前面,本来该你打饭的,可是你看到他这个样子,不忍心,那么你就被中断了一会,中断结束后,中断掉的任务才会被继续运行,同样的你才能够打饭;呵呵,这个比喻好像损了点。

在操作系统中,内核提供的基本服务就是任务切换,它实际上可以说是寄存器内容的切换。自然任务切换是需要时间的,CPU寄存器越多,负荷也就越大。

    基于优先级的内核有两种:不可剥夺型和可剥夺型不可剥夺型内核它要求每个任务互相合作,也称为合作型内核每个任务不会被其它任务剥夺去,除非中断的到来,即便如此,当中断结束后,还是会回到原来被中断的程序,而不会切换到具有高优先级的任务中去,这样,高优先级的任务就不能够及时得到执行,所以它的实时性是比较差的。但是它有一个很重要的特点,就是它可以使用不可重入函数,因为每个任务必须执行完,才能释放CPU,这样它对其它任务调用不可重入函数没有影响;同理在大多数情况下它无须使用信号量来保护资源。

    对于可剥夺型内核,只要高优先级任务一就绪,那它就会被执行,而当前正在执行的任务就会被挂起正因为如此,对于系统的资源就不能像不可剥夺型那样去使用,而是在使用前必须检查是否可以使用,即互斥机制来保护临界资源,如果不用的话,那么如果低优先级在使用临界资源时,突然被高优先级把CPU给抢过去了,那么低优先级的临界资源就可能会被告优先级任务给破坏掉,所以可剥夺型内核是不能调用不可重入函数的,必须对共享资源通过互斥来访问。可剥夺型的优点是是系统的响应时间得到了优化,且是可知的

实时系统中,中断优先级反转这一问题是出现得最多的,这问题的本质其实也不能理解,就是低优先级的任务占有高优先级的任务所需要的资源,而使高优先级不得不等低优先级把资源释放才能执行,UCOS中一样也存在这问题。不过我们可以人为解决这问题,因为UCOS中可以动态的修改任务的优先级,那么我们可以通过优先级极限法实际上就是把低优先级的任务的优先级提高为0级;使该任务不会被其他任务所中断,直到该任务执行完共享资源的代码后再回到原来的优先级。其实还有一种方法叫优先级继承法它的含义就是把低优先级任务的优先级提高至与要用到该低优先级任务所占用的资源;这要求内核能够允许一个优先级可以对应于多个任务,同时支持时间片段轮度调度;显然UCOS是不支持它的。更多的请见嵌入式实时系统中的优先级反转问题

上面提到了互斥,就简要描述下互斥的条件;互斥我们一般在于共享资源打交道时经常用到,那么我们对这些共享资源要怎么才能做到合理利用而被破坏呢,那就要使当时内核的环境满足互斥条件:关中断、使用测试并置位指令(要求有相应的硬件)、禁止做任务切换、利用信号量。

信号量实际上是一种约束机制,熟悉操作系统应该都懂它,他有以下作用:1>控制共享资源的使用权『满足互斥机制』2>标志某事件的发生3>使2个任务的行为同步。信号量可是01的两个值也可以是0nn>2)的计数式的信号量;总之内核是时刻跟踪信号量的『这句话可要好好理解』。一般说信号量只能实施3种操作:初始化,也可以称是建立,此时要初始化信号量的初始值,记住是不能小于0的;等待信号量,这时等待信号量的任务一般处于挂起状态,等待的任务如果发现信号量大于0,信号量的值减1,然后继续执行,如果为0,该任务就挂起;然后就是发送信号量,发送时,信号量会增一,同时会进行任务调度。

死锁也称为抱死,指两个任务无限期的等待对方的资源;防止死锁的方法1>先得到全部资源,再做下一步的工作2>用同样的顺序申请多个资源3>释放资源是,使用相反的顺序。还有就是定义超时来化解死锁。

任务间的信息的传递有两个途径:全程变量和发消息给另一个任务。任务只能通过全程变量和中断服务子程序通信。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(707)
发表于:2007-12-7 16:25:32
标签:国芯  工作  

0

搞定工作『原』

         自从找到工作后,整天待在学校,宿舍又不能上网,整天利用串宿舍来打发时间,本来早就想写一写自己找工作的经历,每次望着不能上网的电脑,都懒得开机,无奈刚才是在没辙开机玩玩,想来想去也没事做,先把找工作的经历写了吧。

         我大概是从1012日左右开始找工作的吧,当时主要是武汉的一些知名高新科技企业在华科开的宣讲会,我好像在那些企业中就投了烽火科技和精纶电子的,结果烽火到1125日才通知我去笔试,真是受不了他们的办事效率,而精纶电子则一直哑无音讯,本来当时也没报很大希望,因为当时宣讲会时我旁边全是研究生,自己一个小本,呵呵,不过我当时还是想试试。到了1020号左右吧,步步高电子来华科开宣讲会,当时投完简历时,有点后悔,没有直接找他们招聘团队沟通沟通;呵呵,不过我还是获得了笔试机会,同时我室友也获得笔试机会,当时在想,这是怎么一回事阿,那些参加电赛拿奖的都没有,我室友怎么就有呢,后来想了下,可能他们投硬件的研究生太多了吧;呵呵,不管怎么样,获得笔试机会感觉就是爽,步步高笔试的全是C,呵呵难不倒我;顺利通过并进入面试,本来当初没想过要签这个公司的,毕竟我对步步高这个企业不是很喜欢,记得当初第一面是技术面试,呵呵,第一次面试,我竟然不紧张,在宾馆里面,两把椅子中间一张桌子,那场景很人性化,本来自己感觉自己实力还行,尽管我前面的都是研究生,和那个技术总管就我简历上的项目聊了近50分钟,自我感觉还行,当天晚上就通知我去二面,呵呵,行,二面那就意味着自己有希望了,自己也做了很多准备,比如签约方面要注意什么问题,反正当时心情真的很不错,感觉找工作很容易似的,那天晚上我如约去指定地点,发现我老乡还在那等,老乡见了我就说我肯定可以签这公司,我说为什么,他说软件的是6个里面选4个,已经有两个说明不准备签;呵呵,那好啊,自己就没那么很正式了,和他们聊时也很随意,结果面试时他们发现我的耳朵里面带了助听器,我向他们解释清楚后,他们也觉得这没什么,临走之前要我考虑一下愿不愿意和他们签,我当时感觉有点快,就说考虑下吧,我回宿舍后感觉怪怪的,打电话过去说我准备和贵公司签,得了,结果怎么样,她说第二天下午6点之前给我答复,等是很漫长的,结果还是没有通知,心想我挂了,但又不服,我打过去问了那个主管,他说怕我的听力过不了他们公司的体检,说这个理由不是我给的,是公司总部老总给的,他自己也向老总解释了说交流没什么问题,可老总不答应。唉,当时听到这个理由拒绝我,我心凉啊,这不明显的歧视残疾人吗,我告诉我室友后,我室友气得说打电话过去骂他们一顿。现在想来还真得谢谢他没有签我,呵呵。

         1126日左右笔了锐捷,我没有参加这公司的宣讲会,托别人投的简历,当时笔试的也是C语言,感觉比步步高的难些,反正对我来说还可以应付,说归说,我记得当时一考完,刚把卷子交了,感觉不对劲,左一想,这题错了,又一想,那题也错了,唉,真要我命啊,自己太粗心大意拉,很自然笔试直接PAST掉了,好在我好有推荐,才获得面试机会,当初面试官问我,说我为什么没有考好,我直接说我不会考试,其实我是不会考试,呵呵,这句话直接埋下隐患,面试的过程中,我说UC/OS-II这个实时操作系统会出现优先级翻转现象,但是那个面试官说不会出现,我当时还是很坚决得说会,并说邵贝贝翻译的那本书中虽然说不会出现,但据我的分析这个小内核没有这个能力,除非我们人为的去预防;但是那面试官还是很坚持说我看书不仔细,我当是很郁闷,更郁闷的是,我U盘又病毒,因为他要看我的源代码以及我的学习文档,我当初没太注意,汗阿,结果也把他的本本中毒,后来就直接不看,唉,郁闷阿,其实他们公司这种做法我还是很喜欢的,可是后来我发现签他们公司的人都是笔试笔得很不错的人。并且其中一人没什么项目经验就因为笔试不错而录用了他,我当时很不服,马上电话问他们,他们说标准不是我定的,是老总定的,靠,真是气愤。唉,谁要我笔试没有笔好呢,后来听我得一个学长说,他比我大一届,说当时进这公司也是抱着很大的希望的,可是进来后发现情况很不一样,做得好主管不喜欢,反正是打杂的,现在他已经跳槽了。呵呵,没能进锐捷也无所谓,呵呵。

         这样10月份都过了,工作仍没着落,心里面也有点急,因为华科武大的研究生实在是太多了,而且一般企业不相信我会ARMUC/OS-IIUSB,真是郁闷,当时只要谁要我我就去哪,呵呵。

         11月初我面试了武汉一家公司---武汉天喻科技有限股份公司,从公司名称看上去应该是一家上市公司,面试在在他们公司面试,先不说其他参加面试的人员,实在没法和我比,自己都有点不想呆那里。面试的时候,特疯狂,大概6个人面试我吧,这倒没什么,这些人问问题问得非常细,当时其中一个她们公司的技术牛人问我这么一个问题:什么叫实时;我当时就哑了,汗,自己当初在了解实时这个概念时,没仔细看书,不过倒把硬实时和软实时关注了下,可惜的是我当时一下没有想起来,自己凭着自己感觉解释了一下,当然不是特别准确,此时另一个技术牛人替我用很专业的术语向我解释,我当时听了直点头。或许大家看到这应该觉得这公司还不错;错了,很垃圾,记得当时面试的时候,我说的几乎都是专业知识,也就是只有那个问我问题的人听得懂,结果中途,那个问我问题的人动不动就接手机,短短半个小时内接了至少5个电话,他接电话时,我都不知道对谁说啦,一个劲地苦笑,面完后,我没有继续留下来笔试,直接回校,说实话我还是要感谢那个技术主管(猜的),因为他让我真正学会仔细。

         接下来就是广东智光电气,笔试都是电力电子,都是吓闷的,不过也进入面试,第一面是群面,第二面什么也不是,本来这企业跟我要求的职位相差太远,自然没戏;

         1110日我参加了深圳英蓓特在武汉理工大学的笔试,当时感觉很爽,这是第一家笔试考了ARM的,我当然答得很顺利,并且笔试完后,我在后面一直做到他看完我的卷子,当时他在我卷子上画了一个星,当时感觉有戏,于是我打断他看卷子,说明用意,他直接说:我现在面你。面试短短10来分钟吧,但是问得问题都很专业,自己回答得还行,最后他说我的水平很适合公司的需要,不过由于他们要去其他学校宣讲,要到最后才能确定谁是最佳人选。我表示理解,然后就直奔华科参加宣讲会,忘了是什么公司的宣讲会。

         1112日参加周立功的笔试,说实话,笔试不难,完全是应用型的题,原本以为他们公司的笔试会是主要以模拟为主,结果它是模拟和单片机为主,一时不太适应,连40分都没上,当时气死我啦,没办法,肯定没戏。

         接下来就是华科的光谷体育场的招聘会,单位都不咋地,估计是人才市场租借的场地,自然没我想要的公司。

         1114日下午我正在做实验,突然一个北京的电话打来,我当时很纳闷,先接了再说吧,呵呵,才明白是让我看邮箱,我说我现在不方便看,让她说,就是不说,挂了后,感觉是OFFER,呵呵,回去一看,是神州航天软件的,这才慢慢想起来,细看薪水3K不包吃住,我天啊,在北京怎么活啊,当时想签又不想签,想签的是工作实在不好找,不想签的是薪水实在太低啦,后来我一个学长说在北京至少3500才能活,就这样拖了3天吧,突然接到上海先锋商泰的短信,说我被录用,可奇怪的是发短信通知,不过薪水比北京那家好哆啦,所以不顾家人的反对,放弃北京,寄望上海,等了好几天了,就是没有发OFFER,打电话问说过两天就发,自己总感觉没低,恰好杭州国芯在华科开宣讲会,查了下职位信息,其中应用软件太对我胃口啦,决定试下,宣讲时感觉这公司的发展进程跟我的大学生活很相似,当时就有一种感觉,这公司绝对要我,呵呵,宣讲的当天晚上就收到电话通知要我第二天去面试,说来也怪,在面试之前我接了一个电话,是英蓓特的。呵呵,当时很爽,这公司即使不要我,至少英蓓特的可以垫底,面试时面试官要我介绍下我们学校,呵呵,虽然学校在全国不咋的,但是发展前景还是不错的,我当然很高兴的向他介绍了我的学校,呵呵感觉还不错,最后他针对我的简历问了一个很转的问题,而且我对这个问题研究了好几个月的,自然没问题,呵呵,面试完了后,我跟另一个负责人聊了会,说来也怪,当时每个进来面试的人都要填张表格的,我看他进来后,笑着对他说,哥们来填张表格,呵呵,我见他半天没反应,又重复了一遍,呵呵,他才笑着对我说我就是国芯的人,呵呵,搞笑吧,然后我们就聊了起来,他看了看我的简历,说如果研究生是我这样的简历,是绝对不会要的,呵呵,因为我个人觉得我的简历相当于一般的研究生吧,当时就哇,要求这么高啊,呵呵,然后又聊了些其它话题,完了后,他说要我回去等通知,说晚上会通知的。晚上我也没想很多,竟然还有心思上自习,途中感觉国芯应该要来电话啦,于是我又回宿舍玩,果然回宿舍没多久,就来电话说要我马上去他们所在处拿录用函,就这样,我就被这公司给收买了呵呵呵,当然也放弃了英蓓特,其实英蓓特给的薪水也是不错的,只是不想待武汉;可是感觉让我选择杭州国芯,希望自己没选错吧。

         我的工作历程到1120OVER啦,感觉结果还不错,最爽的就是收到了4OFFER,最后在3OFFER中选一个,呵呵,前所未有的爽。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 无分类

评论(0) | 阅读(272)
发表于:2007-10-13 20:56:36
标签:无标签

0

魔鬼autotools升华使用[原]

    这几天没怎么出去跑宣讲会,因为那些公司我不感兴趣,感兴趣的公司说这两天会给我电话面试,等了N久,就是没有,真搞不懂我问题倒底出在哪,找工作归找工作; 我自己的感兴趣的嵌入式还得学,也够郁闷的,白天上自习看模拟数字,晚上会宿舍研究嵌入式linux,自从我成功把vivi移植后,一直想研究vivi怎么写,呵呵,倒好,发现N多问题,比如这么多文件,怎么编译,那么多的makefile,还有很多文件不是很清楚,怎么办,继续奋斗呗,我把图书关于嵌入式linux的书都翻遍了,发现讲这方面的实在太少了,真的想说那句话,linux真应该从娃娃抓起。好在发现在《嵌入式系统与应用开发》中有一小段篇幅是利用autotools来处理很多.c的软件,先前前面我讲过怎样处理一个.c的文件,呵呵,今天来玩玩多个.c的makefile的编写,好了,开始:

首先新建一个hello的文件夹,然后在hello下新建add和sub两个文件夹,在add下编写一个add.c,内容如下:
int add(int x,int y)
{
        return x+y;
}
在sub下编写一个sub.c的文件,内容如下:
int sub(int x,int y)
{
        return x-y;
}
在hello下编写main.c的文件,内容如下:
#include
                                                                               
int main(void)
{
        int sub_x,sub_y,add_x,add_y;
        printf("sub_x: ");
        scanf("%d",&sub_x);
        printf("\nsub_y: ");
        scanf("%d",&sub_y);
        add_x=sub(sub_x,sub_y);
        printf("\nadd_x=sub(%d, %d)= %d",sub_x,sub_y,add_x);
        printf("\nadd_y: ");
        scanf("%d",&add_y);
        printf("\n%d",add(add_x,add_y));
}


呵呵,这些弄完后,准备开始了哦,呵呵!先说下步骤:
1> 首先运行autoscan,原因我也不知道
2> 修改configure.scan。除了要添加AM_INIT_AUTOMAKE,还要加上一行AC_PROG_LIBTOOL,这一个宏打开对Libtool的处理过程,为后面的Libtool做准备,AC_OUTPUT输出三个makefile,呵呵,AC_OUTPUT(Makefile add/Makefile sub/Makefile),最后要将configure.scan保存为configure.in
3> 运行libtoolize生成一些支持文件
4> 运行aclocal和autoscanf,还要运行autoheader,这一项是书上没有说的,但是我发现如果不运行autoheader,那么在后面的make会产生一个错误,说找不到configure.h.in
5> 在add下编写Makefile.am,内容如下:
lib_LTLIBRARIES=libadd.la
libadd_la_SOURCES=add.c
在sub下也要编写Makefile.am,内容如下:
lib_LTLIBRARIES=libsub.la
libsub_la_SOURCES=sub.c
在hello下也要编写Makefile.am,内容如下:
UTOMAKE_OPTIONS=foreign
SUBDIRS=add sub
bin_PROGRAMS=main
main_SOURCES=main.c
main_LDADD=add/libadd.la sub/libsub.la
6> 写好了Makefile.am,运行automake -a
7> 然后执行 ./configure
8> 最后make
[root@localhost root]# cd hello
[root@localhost hello]# ls
add  main.c  sub
[root@localhost hello]# autoscan   
[root@localhost hello]# ls
add  autoscan.log  configure.scan  main.c  sub
[root@localhost hello]# vim configure.in
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
                                                                               
AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AM_INIT_AUTOMAKE(main,1.0)
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADER([config.h])
                                                                               
# Checks for programs.
AC_PROG_CC
                                                                               
# Checks for libraries.
AC_PROG_LIBTOOL
                                                                               
# Checks for header files.
                                                                               
# Checks for typedefs, structures, and compiler characteristics.
                                                                               
# Checks for library functions.
                                                                               
AC_OUTPUT(Makefile add/Makefile sub/Makefile)

[root@localhost hello]# libtoolize
You should add the contents of `/usr/share/aclocal/libtool.m4' to `aclocal.m4'.
[root@localhost hello]# ls
add           config.guess  configure.in    ltmain.sh  sub
autoscan.log  config.sub    configure.scan  main.c
[root@localhost hello]# aclocal
[root@localhost hello]# autoconf
[root@localhost hello]# autoheader
[root@localhost hello]# ls
aclocal.m4      autoscan.log  config.sub    configure.scan  sub
add             config.guess  configure     ltmain.sh
autom4te.cache  config.h.in   configure.in  main.c
//接下来编写3个Makefile.am,这个过程我就不细说啦。
[root@localhost hello]# ls
aclocal.m4      autoscan.log  config.sub    configure.scan  Makefile.am
add             config.guess  configure     ltmain.sh       sub
autom4te.cache  config.h.in   configure.in  main.c
[root@localhost hello]# ls ./add
add.c  Makefile.am
[root@localhost hello]# ls ./sub
Makefile.am  sub.c
[root@localhost hello]# automake -a
configure.in:8: `automake requires `AM_CONFIG_HEADER', not `AC_CONFIG_HEADER'
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: installing `./COPYING'
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./depcomp'
[root@localhost hello]# ls
aclocal.m4      config.guess  configure.in    INSTALL     Makefile.am    sub
add             config.h.in   configure.scan  install-sh  Makefile.in
autom4te.cache  config.sub    COPYING         ltmain.sh   missing
autoscan.log    configure     depcomp         main.c      mkinstalldirs
//又多了几个东东
[root@localhost hello]# ./configure   //这个过程比较长
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for ld used by GCC... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking for a sed that does not truncate output... /bin/sed
checking whether ln -s works... yes
checking how to recognise dependent libraries... pass_all
checking command to parse /usr/bin/nm -B output... ok
checking how to run the C preprocessor... gcc -E
checking for egrep... grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking for ranlib... ranlib
checking for strip... strip
checking for objdir... .libs
checking for gcc option to produce PIC... -fPIC
checking if gcc PIC flag -fPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.lo... yes
checking if gcc supports -fno-rtti -fno-exceptions... yes
checking whether the linker (/usr/bin/ld) supports shared libraries... yes
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking whether -lc should be explicitly linked in... no
creating libtool
configure: creating ./config.status
config.status: creating Makefile   //看到这三个Makefile了没有,呵呵,它已经建好了
config.status: creating add/Makefile
config.status: creating sub/Makefile
config.status: creating config.h
config.status: executing depfiles commands
[root@localhost hello]# make   //这个也有点花时间
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make  all-recursive
make[1]: Entering directory `/root/hello'
Making all in add
make[2]: Entering directory `/root/hello/add'
source='add.c' object='add.lo' libtool=yes \
depfile='.deps/add.Plo' tmpdepfile='.deps/add.TPlo' \
depmode=gcc3 /bin/sh ../depcomp \
/bin/sh ../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I..     -g -O2 -c -o add.lo `test -f 'add.c' || echo './'`add.c
rm -f .libs/add.lo
gcc -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c add.c -MT add.lo -MD -MP -MF .deps/add.TPlo  -fPIC -DPIC -o .libs/add.lo
gcc -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c add.c -MT add.lo -MD -MP -MF .deps/add.TPlo -o add.o >/dev/null 2>&1
mv -f .libs/add.lo add.lo
/bin/sh ../libtool --mode=link gcc  -g -O2   -o libadd.la -rpath /usr/local/lib
 add.lo
rm -fr .libs/libadd.la .libs/libadd.* .libs/libadd.*
gcc -shared  add.lo   -Wl,-soname -Wl,libadd.so.0 -o .libs/libadd.so.0.0.0
(cd .libs && rm -f libadd.so.0 && ln -s libadd.so.0.0.0 libadd.so.0)
(cd .libs && rm -f libadd.so && ln -s libadd.so.0.0.0 libadd.so)
ar cru .libs/libadd.a  add.o
ranlib .libs/libadd.a
creating libadd.la
(cd .libs && rm -f libadd.la && ln -s ../libadd.la libadd.la)
make[2]: Leaving directory `/root/hello/add'
Making all in sub
make[2]: Entering directory `/root/hello/sub'
source='sub.c' object='sub.lo' libtool=yes \
depfile='.deps/sub.Plo' tmpdepfile='.deps/sub.TPlo' \
depmode=gcc3 /bin/sh ../depcomp \
/bin/sh ../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I..     -g -O2 -c -o sub.lo `test -f 'sub.c' || echo './'`sub.c
rm -f .libs/sub.lo
gcc -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c sub.c -MT sub.lo -MD -MP -MF .deps/sub.TPlo  -fPIC -DPIC -o .libs/sub.lo
gcc -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c sub.c -MT sub.lo -MD -MP -MF .deps/sub.TPlo -o sub.o >/dev/null 2>&1
mv -f .libs/sub.lo sub.lo
/bin/sh ../libtool --mode=link gcc  -g -O2   -o libsub.la -rpath /usr/local/lib
 sub.lo
rm -fr .libs/libsub.la .libs/libsub.* .libs/libsub.*
gcc -shared  sub.lo   -Wl,-soname -Wl,libsub.so.0 -o .libs/libsub.so.0.0.0
(cd .libs && rm -f libsub.so.0 && ln -s libsub.so.0.0.0 libsub.so.0)
(cd .libs && rm -f libsub.so && ln -s libsub.so.0.0.0 libsub.so)
ar cru .libs/libsub.a  sub.o
ranlib .libs/libsub.a
creating libsub.la
(cd .libs && rm -f libsub.la && ln -s ../libsub.la libsub.la)
make[2]: Leaving directory `/root/hello/sub'
make[2]: Entering directory `/root/hello'
source='main.c' object='main.o' libtool=no \
depfile='.deps/main.Po' tmpdepfile='.deps/main.TPo' \
depmode=gcc3 /bin/sh ./depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c `test -f 'main.c' || echo './'`main.c
/bin/sh ./libtool --mode=link gcc  -g -O2   -o main  main.o add/libadd.la sub/libsub.la
mkdir .libs
gcc -g -O2 -o .libs/main main.o  add/.libs/libadd.so sub/.libs/libsub.so -Wl,--rpath -Wl,/usr/local/lib
creating main   //看到它了没有,它是可执行的文件,运行它就可以看到结果拉
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make[2]: Leaving directory `/root/hello'
make[1]: Leaving directory `/root/hello'
[root@localhost hello]# ls
aclocal.m4      config.h.in    configure.scan  ltmain.sh    Makefile.in
add             config.log     COPYING         main         missing
autom4te.cache  config.status  depcomp         main.c       mkinstalldirs
autoscan.log    config.sub     INSTALL         main.o       sub
config.guess    configure      install-sh      Makefile
config.h        configure.in   libtool         Makefile.am
[root@localhost hello]# ./main
sub_x: 6
 
sub_y: 5
 
add_x=sub(6, 5)= 1
add_y: 4
 
5[root@localhost hello]#

呵呵,完毕!这东东要多练才能熟练。





点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(1) | 阅读(1304)
发表于:2007-10-10 20:50:51