培训体系培训资料_第1页
培训体系培训资料_第2页
培训体系培训资料_第3页
培训体系培训资料_第4页
培训体系培训资料_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、20XX年XX月多年的企业咨询豉问经验.经过实战验证可以落地机行的卓越管理方案,值得您下载拥有新人培训阶段学习资料上海核心信息技术XX公司Version0.02(2011.03)目录课程介绍1课程大纲2第壹阶段Linux开发基础2第二阶段嵌入式C语言编程强化3第三阶段 Linux 用户态开发 8第四阶段Linux内核态及驱动开发10第五阶段软件开发流程11课程介绍本课程旨于发现具备开发Linux下驱动程序的人才,新入社员将通过壹个月的时间参照本教程熟悉Linux下设备驱动开发必须的知识。培训结束后符合要求的新人将进入公司具体项目 组熟悉具体项目的开发方法。课程大纲 本课程大纲内列出的任务基本由

2、员工自己动手解决为主,通常每天上午指导人员将进行昨日实验结果评价及当日任务安排,对于工作任务不清楚的地方请及时向指导人员提出。下午主要为新员工个人实验时间。第壹阶段Linux开发基础2-3天通过本课程的学习,使新员工能够了解Linux操作系统的概念,熟练掌握 Linux下的基本命令、常用工具的使用方面的知识。学习内容:公司安全保密教育,日报格式说明Linux常用命令,文本编辑器 Vi,简单Shell脚本编程嵌入式Linux开发环境基础:Gcc, Gdb , Make和MakefileGCCARM 编译环境安装(SourceryG+LiteEditionforARM )软件版本管理器Svn嵌入式

3、软件开发环境搭建和使用x86linux 内核编译versatilearmlinux 内核编译QEMU 运行 linux实验:1 .开发环境配置,安装 ubuntu 虚拟机,熟悉 Linux使用2 .配置X86开发环境,编译 x86Linux内核,于 QEMU下运行3 .配置ARM 开发环境,编译 armLinux 内核,于 QEMU下运行4 . 编写 HelloWorld 程序,于 x86/armLinuxQEMU 下运行5 .编写壹个脚本,统计壹个目录下面所有C代码的行数。6 .这些格式的如何去解压 .tar/bz2/tar.bz2/tar.gz/tar.tar/.Z/.zip/.rar第二

4、阶段嵌入式C语言编程强化3-5天本课程的主要目标是通过编写代码的方式,加强对于C语言编程和数据结构的掌握程度。回答如下16道国外经典的面向嵌入式C语言面试题1 .用预处理指令#define声明壹个常数,用以表明 1年中有多少秒(忽略闰年问题)2 .写壹个“标准”宏 MIN ,这个宏输入俩个参数且返回较小的壹个。3 .预处理器标识#error的目的是什么?4 .嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?5 .用变量a给出下面的定义a)壹个整型数(Aninteger )b)壹个指向整型数的指针(Apointertoaninteger )c)壹个指向指针的的指针,它指向的指针是指向壹

5、个整型数(Apointertoapointertoaninteger )d)壹个有10个整型数的数组(Anarrayof10integers )e)壹个有10个指针的数组,该指针是指向壹个整型数的(Anarrayof10pointerstointegers )f)壹个指向有10个整型数数组的指针( Apointertoanarrayof10integers )g)壹个指向函数的指针,该函数有壹个整型参数且返回壹个整型数Apointertoafunctionthattakesanintegerasanargumentandreturnsanintegerh)壹个有10个指针的数组,该指针指向壹个

6、函数,该函数有壹个整型参数且返回壹个整型(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)6 .关键字static的作用是什么?7 .关键字const是什么含意?8 .关键字volatile有什么含意且给出三个不同的例子。9 .嵌入式系统总是要用户对变量或寄存器进行位操作。给定壹个整型变量a,写俩段代码,第壹个设置a的bit3 ,第二个清除a的bit3。于之上俩个操作中,要保持其它位不变。10 .嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。于某工程中,要求设置壹绝对地址为0x67

7、a9的整型变量的值为 0xaa66 。编译器是壹个纯粹的 ANSI编译器。写代 码去完成这壹任务。11 .中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供壹种扩展一让标准C支持中断。具体所代表的事实是,产生了壹个新的关键字_interrupt 。下面的代码就使用了interrupt关键字去定义了壹个中断服务子程序(ISR),请评论壹下这段代码的。_interruptdoublecompute_area(doubleradius) doublearea=PI*radius*radius;printf("Area=%f",area);returnarea;12 .下

8、面的代码输出是什么,为什么?voidfoo(void)(unsignedinta=6;intb=-20;(a+b>6)puts(">6"):puts("<=6");)13 .评价下面的代码片断:unsignedintzero=0;unsignedintcompzero=0xFFFF;/*1'scomplementofzero*/不具备可移植性性14 .尽管不像非嵌入式计算机那么常见,嵌入式系统仍是有从堆( heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?char*ptr;if(ptr=(ch

9、ar*)malloc(0)=NULL)puts("Gotanullpointer");/1else puts("Gotavalidpointer");/2输出2 这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经于ESP杂志中被广泛地讨论过了(主要是PJ.Plauger,他的解释远远超过我这里能提到的任何解释),所有回过头见壹下这些杂志吧! o o o o free这是壹个有趣的问题。最近于我的壹个同事不经意把0值传给了函数 malloc ,得到了壹个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是&qu

10、ot;Gotavalidpointer我用这个来开始讨论这样的壹问题,见见被面试者是否想到库例程这样做是正确。15 .Typedef于C语言中频繁用以声明壹个已经存于的数据类型的同义字。也能够用预处理器做类似的事。例如,思考壹下下面的例子: #definedPSstructs*typedefstructs*tPS;之上俩种情况的意图均是要定义dPS和tPS作为壹个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?16 .C语言同意壹些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?inta=5,b=7,c;c=a+b;12编程题位操作练习Description假设你工作于壹个32位

11、的机器上,你需要将某壹个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110 (从高位到低位的顺序)而其他位保持不变。对给定的寄存器值R,及X, Y,编程计算更改后的寄存器值RoInput仅壹行,包括 R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y于0-31之间且Y>=3 , (Y-X)的绝对值>=3,保证俩次置位不会重合Output更改后的寄存器值 R (16进制输出)Sampleinput12345678,0,3SampleOutput1234567cvoidmain()(intR,X,Y;s

12、canf("%d,%d,%d",&R,&X,&Y);R&=(1<<X);R|=6<<(Y-3);R&=(1<<(Y-2);printf("theRvalueis%d",R);排序编写壹个排序程序。被排序的文件有8MB大小,壹行壹个随机整数(ASCII格式)。要求对这些整数进行排序,且计算平均值,打印出排序所需的时间。#include"stdio.h"#include"stdlib.h"#include"math.h"#i

13、nclude"time.h"voidrun(int*pData,intleft,intright)inti,j;intmiddle,iTemp;i=left;j=right;middle=pDataleft;dowhile(pDatai<middle)&&(i<right)i+;while(pDataj>middle)&&( j>left)j-;if(i<=j)iTemp=pDatai;pDatai=pDataj;pDataj=iTemp;i+;j-;)while(i<=j);if(left<j)ru

14、n(pData,left,j);if(right>i)run(pData,i,right);voidQuickSort(int*pData,longCount)(run(pData,0,Count-1);intmain(intargc,char*argv)clock_tstart,end;/time_ta,b;charfstr20;intm_data1024;longcount=0;longsum=0;longavr;longi;FILE*m_file;if(NULL=argv0)exit(1);m_file=fopen(argv0,"r");if(m_file=NU

15、LL)printf("error");exit(1);while(NULL!=fgets(fstr,20,m_file)(m_datacount=atoi(fstr);count+;start=clock();a=time(NULL);QuickSort(m_data,count);end=clock();printf("%6.3fsecondsn",(double)(end-start)/18.2);b=time(NULL);for(i=0;i<count;i+)(printf("n%d",m_datai);sum+=m_da

16、tai;avr=sum/count;建立单向、双向、循环链表,进行相应操作structNodeintdata;/ 数据域structNode*next;/ 指针域 );单向: structNode ( intdata;structNode*next; );structNode*Create_Node(intn)/CreateaNode,nmeansithasnchildnode; (structNode*p=(structNode*)malloc(sizeof(Node);/Createamemoryspaceforstruct memset(p,NULL,sizeof(Node);setth

17、estruct' svalueNULL;if(n>1) (p->next=Create_Node(n-1);/ifthenodehaschild,thenmakethep' snextlinkthenextnode )returnp;/returnthenodesaddressvoidDelete_Node(structNode*node)/freetheallnodetables(if(node->next!=NULL)(Delete_Node(node->next);)node->next=NULL;free(node);)双向:structM

18、uNode(intdata;structMuNode*pre;/PointertopointtopreviousnodestructMuNode*next;/Pointertopointtonextnode);structMuNode*Create_MuNode(intn,structMuNode*pre)structMuNode*p=(structMuNode*)malloc(sizeof(Node);memset(p,NULL,sizeof(Node);p->pre=pre;if(n>1)p->next=Create_MuNode(n-1,p);returnp;voidD

19、elete_MuNode(structMuNode*node)if(node->next!=NULL)Delete_MuNode(node->next);node->next=NULL;node->pre=NULL;free(node);循环链表structNode intdata;/ 数据域 structNode*next;/ 指针域 );structNode*Create_CycleNode(intn,structNode*head)/CreateaNode,nmeansithasn childnode;structNode*p=(structNode*)mallo

20、c(sizeof(Node);/Createamemoryspaceforstruct memset(p,NULL,sizeof(Node);setthestruct' svalueNULL;if(n>1) p->next=Create_Node(n-1);/ifthenodehaschild,thenmakethep' snextlinkthenextnode ) else p->next=head;returnp;/returnthenodesaddress)voidDelete_CycleNode(structNode*node,structNode*h

21、ead)(if(node->next!=head)(Delete_Node(node->next);)node->next=NULL;free(node);)队列基本操作(入队,出队)循环队列类型定义#defineQueueSize100/应根据具体情况定义该值typedefcharDataType;/DataType的类型依赖于具体的应用typedefstructintfront;/头指针,队非空时指向队头元素intrear;/尾指针,队非空时指向队尾元素的下壹位置intcount;/计数器,记录队中元素总数DataTypedataQueueSize;CirQueue;vo

22、idInitQueue(CirQueue*Q)/ 初始化队列(Q->front=0;Q->count=0;Q->rear=0;intQueueEmpty(CirQueue*Q)(return(Q->count=0)intQueueFull(CirQueue*Q)(return(Q->count=QueueSize);voidEnQueue(CirQueuq*Q,DataTypex)( if(!QueueFull(CirQueue*Q) Q->dataQ->rear=x;Q->rear=(Q->rear+1)%QueueSize;Q->

23、count+;) else(error("TheQueueisFull ! now ! n");)DataTypeDeQueue(CirQueue*Q)(DataTypetemp;if(QueueEmpty(Q)Error("Queueunderflow") 队空下溢temp=Q->dataQ->front;Q->count-;/队列元素个数减1Q->front=(Q->front+1)%QueueSize;/循环意义下的头指针加1 returntemp;DataTypeQueueFront(CirQueue*Q)(if(!

24、QueueEmpty)returnQQ->front;else(error("Queueisempty");)栈基本操作(入栈,出栈)#defineDataTypeint#defineMAXSIZE1024typedefstruct(DataTypedataMAXSIZE;inttop;SeqStack;SeqStack*Init_SeqStack()栈初始化SeqStack*p=(SeqStack*)malloc(sizeof(SeqStack);memset(p,NULL,sizeof(SeqStack);returnp;intEmpty_SeqStack(Seq

25、Stack*s)/ 判栈空(return(s->top=0);intPush_SeqStack(SeqStack*s,DataTypex)/ 入栈(if(s->top<MAXSIZE)(s->datas->top=x;return1elsereturn0;intPop_SeqStack(SeqStack*s,DataType*x)出栈(if(s->top>0)(*x=s->datas->top;s->top-;return1;elsereturn0;DataTypeT op_SeqStack(SeqStack*s)/取栈顶元素(if(

26、s->top>0)returns->datas->top;elseerror("Stackisempty");其他 编写壹个自己的完全 C语言版本的memset函数,且且评价这个实现的性能和可移植性。void*memset(void*source,intch,unsignedn);)(char*p=(char*)source;assert(NULL!=source);while(n-)(*p+=(char)c;returnsource;代码风格下面是壹个16x16的黑白图标:staticunsignedshortstopwatch =0x07c6,0

27、x1ff7,0x383b,0x600c,0x600c,0xc006,0xc006,0xdf06,0xc106,0xc106,0x610c,0x610c,0x3838,0x1ff0,0x07c0,0x0000,);如何修改声明,能够使之于源代码中形象地表现出图形的模样/C编程专家#defineX)*2+1#define_)*2#defines(0staticunsignedshortstopwatch尸s XXXXX XX ,sXXXXXXXXX_XXX,s XXX XXX XX,s XXXXX ,s XXXXX ,sXXXX ,sXXXX ,sXX XXXXX XX ,sXXXXX ,sXXX

28、XX ,s XXXXX,s XXXXX,s XXXXXX,sXXXXXXXXX,s XXXXX,s,);第三阶段Linux用户态开发5天左右熟悉Linux用户态开发的基本概念,通过编写壹些实验程序加深理解。用户态编程学习内容系统调用方式访问文件库函数访问文件时间编程进程原理进程控制程序设计进程间通讯管道信号共享内存消息队列信号量多线程程序设计socket 编程(TCP,UDP)Linux用户态编程实验内容编写应用程序,创建壹个可读可写的文件。程序名:CreateFile#include<stdio.h>#include<stdlib.h>#include<sys/

29、types.h>#include<sys/stat.h>#include<fcntl.h>voidcreate_file(char*filename)if(creat(filename,0755)<0)printf("createfile%sfailure!n",filename);exit(EXIT_FAILURE);elseprintf("createfile%ssuccess!n",filename);intmain(intargc,char*argv)inti;if(argc<2) perror(&quo

30、t;youhaven'tinputthefilename,pleasetryagain!n"); exit(EXIT_FAILURE);)for(i=1;i<argc;i+)create_file(argvi);)exit(EXIT_SUCCESS);)执行命令:gccCreateFile -oCreateFile./CreateFile使用库函数,实现文件拷贝的功能获取本地时间,以字符串方式显示编写壹应用程序,于程序中创建壹子进程,分别于父进程和子进程中打印进程ID使用vfork创建壹子进程,分别于父进程和子进程中打印进程ID,观察父子进程的运行顺序使用execl函数创建壹个文件编写壹应用程序,于程序中创建壹子进程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论