1、linux培训新人培训阶段学习资料上海核心信息技术有限公司Version 0.02 (2011.03)课程介绍本课程旨在发现具备开发Linux下驱动程序的人才,新入社员将通过一个月的时间参照本教程熟悉Linux下设备驱动开发必须的知识。培训结束后符合要求的新人将进入公司具体项目组熟悉具体项目的开发方法。课程大纲本课程大纲内列出的任务基本由员工自己动手解决为主,通常每天上午指导人员将进行昨日实验结果评价及当日任务安排,对于工作任务不清楚的地方请及时向指导人员提出。下午主要为新员工个人实验时间。第一阶段 Linux开发基础2-3天通过本课程的学习,使新员工能够了解Linux操作系统的概念,熟练掌握
2、Linux下的基本命令、常用工具的使用方面的知识。学习内容: 公司安全保密教育,日报格式说明 Linux常用命令,文本编辑器Vi,简单Shell脚本编程 嵌入式Linux开发环境基础:Gcc,Gdb,Make和Makefile GCC ARM编译环境安装(Sourcery G+ Lite Edition for ARM) 软件版本管理器Svn 嵌入式软件开发环境搭建与使用 x86 linux内核编译 versatile arm linux内核编译 QEMU运行linux实验:1. 开发环境配置,安装ubuntu虚拟机,熟悉Linux使用2. 配置X86开发环境,编译x86 Linux内核,在Q
3、EMU下运行3. 配置ARM开发环境,编译arm Linux内核,在QEMU下运行4. 编写Hello World程序,在x86/arm Linux QEMU下运行5. 编写一个脚本,统计一个目录下面所有C代码的行数。6. 这些格式的如何去解压 .tar/bz2/tar.bz2/tar.gz/tar.tar/.Z/.zip/.rar第二阶段 嵌入式C语言编程强化3-5天本课程的主要目标是通过编写代码的方式,加强对于C语言编程和数据结构的掌握程度。回答如下16道国外经典的面向嵌入式语言面试题1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)2. 写一个“标准”
4、宏MIN,这个宏输入两个参数并返回较小的一个。3. 预处理器标识#error的目的是什么?4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?5. 用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of
5、10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an inte
6、ger argument and return an integer )6. 关键字static的作用是什么?7关键字const是什么含意? 8. 关键字volatile有什么含意 并给出三个不同的例子。9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。11. 中断是嵌入式系统中
7、重要的组成部分,这导致了很多编译开发商提供一种扩展让标准C支持中断。具体所代表的事实是,产生了一个新的关键字 _interrupt。下面的代码就使用了_interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。_interrupt double compute_area (double radius) double area = PI * radius * radius; printf( Area = %f, area); return area; 12 . 下面的代码输出是什么,为什么?void foo(void) unsigned int a = 6; int b
8、 = -20; (a+b 6) puts( 6) : puts(=3,(Y-X)的绝对值=3,保证两次置位不会重合Output更改后的寄存器值R(16进制输出)Sample Input12345678,0,3Sample Output1234567cvoid main()int R,X,Y;scanf(%d,%d,%d,&R,&X,&Y);R&=(1X);R|=6(Y-3);R&=(1(Y-2);printf(the R value is %d,R); 排序编写一个排序程序。被排序的文件有8MB大小,一行一个随机整数(ASCII格式)。要求对这些整数进行排序,并计算平均值,打印出排序所需的时间
9、。#include stdio.h#include stdlib.h#include math.h#include time.hvoid run(int* pData,int left,int right) int i,j; int middle,iTemp; i = left; j = right; middle = pDataleft; do while(pDataimiddle) & (imiddle) & (jleft) j-; if(i=j) iTemp = pDatai; pDatai = pDataj; pDataj = iTemp; i+; j-; while(i=j); if
10、(lefti) run(pData,i,right); void QuickSort(int* pData,long Count) run(pData,0,Count-1); int main(int argc, char* argv) clock_t start,end; / time_t a,b;char fstr20; int m_data1024; long count=0; long sum=0; long avr;long i; FILE* m_file; if(NULL= argv0)exit(1);m_file=fopen(argv0 , r); if(m_file=NULL)
11、 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.3f secondsn,(double)(end-start)/18.2); /b=time(NULL); for(i=0;i1)p-next=Create_Node(n-1);/if the node has child ,then make the ps
12、next link the next nodereturn p;/return the nodes addressvoid Delete_Node(struct Node * node)/free the all node tablesif(node-next!=NULL) Delete_Node(node-next); node-next=NULL; free(node);双向:struct MuNodeint data;struct MuNode* pre;/ Pointer to point to previous nodestruct MuNode* next; / Pointer t
13、o point to next node;struct MuNode* Create_MuNode(int n,struct MuNode* pre)struct MuNode* p=(struct MuNode*)malloc(sizeof(Node);memset(p,NULL,sizeof(Node);p-pre=pre;if(n1)p-next=Create_MuNode(n-1,p);return p;void Delete_MuNode(struct MuNode * node)if(node-next!=NULL) Delete_MuNode(node-next); node-n
14、ext=NULL; node-pre=NULL;free(node);循环链表struct Node int data;/数据域 struct Node * next;/指针域 ;struct Node* Create_CycleNode(int n, struct Node* head)/Create a Node, n means it has n child node;struct Node* p=(struct Node*)malloc(sizeof(Node);/Create a memory space for struct memset(p,NULL,sizeof(Node);/
15、set the structs value NULL;if(n1)p-next=Create_Node(n-1);/if the node has child ,then make the ps next link the next nodeelsep-next=head;return p;/return the nodes addressvoid Delete_CycleNode(struct Node * node, struct Node * head)if(node-next!=head) Delete_Node(node-next); node-next=NULL; free(nod
16、e); 队列基本操作(入队,出队)循环队列类型定义#define QueueSize 100 /应根据具体情况定义该值 typedef char DataType; /DataType的类型依赖于具体的应用 typedef struct int front; /头指针,队非空时指向队头元素 int rear; /尾指针,队非空时指向队尾元素的下一位置 int count;/计数器,记录队中元素总数 DataType dataQueueSize; CirQueue;void InitQueue(CirQueue *Q) /初始化队列Q-front=0;Q-count=0;Q-rear=0;int
17、 QueueEmpty(CirQueue *Q)return (Q-count=0)int QueueFull(CirQueue *Q)return (Q-count= QueueSize);void EnQueue(CirQueuq *Q,DataType x)if(!QueueFull(CirQueue *Q)Q-dataQ-rear= x;Q-rear=(Q-rear+1)%QueueSize;Q-count+;elseerror(The Queue is Full! now!n);DataType DeQueue(CirQueue *Q)DataType temp;if(QueueEm
18、pty(Q)Error(Queue underflow)/队空下溢temp=Q-dataQ-front;Q-count-; /队列元素个数减1 Q-front=(Q-front+1)%QueueSize; /循环意义下的头指针加1 return temp;DataType QueueFront(CirQueue *Q)if(!QueueEmpty)return QQ-front;elseerror(Queue is empty); 栈基本操作(入栈,出栈)#define DataType int #define MAXSIZE 1024 typedef struct DataType data
19、MAXSIZE; int top; SeqStack;SeqStack *Init_SeqStack()/栈初始化SeqStack *p= (SeqStack *)malloc(sizeof(SeqStack);memset(p,NULL,sizeof(SeqStack);return p;int Empty_SeqStack(SeqStack *s)/判栈空return (s-top=0);int Push_SeqStack(SeqStack *s,DataType x)/入栈if(s-topdatas-top=x;return 1elsereturn 0;int Pop_SeqStack(
20、SeqStack *s,DataType *x)/出栈if(s-top0)*x=s-datas-top;s-top-;return 1;elsereturn 0;DataType Top_SeqStack(SeqStack *s)/取栈顶元素if(s-top0)return s-datas-top;elseerror(Stack is empty); 其他编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性。void* memset(void * source, int ch, unsigned n);)char *p=(char*) source; assert(
21、NULL!=source);while(n-)*p+=(char)c;return source; 代码风格下面是一个16x16的黑白图标: static unsigned short stopwatch【】 = 0x07c6, 0x1ff7, 0x383b, 0x600c, 0x600c, 0xc006, 0xc006, 0xdf06, 0xc106, 0xc106, 0x610c, 0x610c, 0x3838, 0x1ff0, 0x07c0, 0x0000, ; 如何修改声明,可以使之在源代码中形象地表现出图形的模样/C编程专家#define X )*2+1#define _ )*2#d
22、efine s (0static unsigned short stopwatch=s _ _ _ _ _ X X X X X _ _ _ X X _,s _ _ _ X X X X X X X X X _ X X X,s _ _ X X X _ _ _ _ _ X X X _ X X,s _ X X _ _ _ _ _ _ _ _ X X X _ _,s _ X X _ _ _ _ _ _ _ _ X X X _ _,s X X _ _ _ _ _ _ _ _ _ _ _ X X _,s X X _ _ _ _ _ _ _ _ _ _ _ X X _,s X X _ X X X X X _
23、_ _ _ _ X X _,s X X _ _ _ _ _ X _ _ _ _ _ X X _,s X X _ _ _ _ _ X _ _ _ _ _ X X _,s _ X X _ _ _ _ X _ _ _ _ X X _ _,s _ X X _ _ _ _ X _ _ _ _ X X _ _,s _ _ X X X _ _ _ _ _ X X X _ _ _,s _ _ _ X X X X X X X X X _ _ _ _,s _ _ _ _ _ X X X X X _ _ _ _ _ _,s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _,;第三阶段 Linux用户态开发5天左右熟悉Linux用户态开发的基本概念,通过编写一些实验程序加深理解。用户态编程学习内容系统调用方式访问文件库函数访问文件时间编程进程原理进程控制程序设计进程间通讯管道信号共享内存消息队列信号量多线程程序设计socket编程(TCP, UDP)Linux用户态编程实验内容:编写应用程序,创建一个可读可写的文件。程序名:CreateFile#include #include #include sys/types.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1