将剪贴板中的内容粘贴在光标后
将剪贴板中的内容粘贴在光标前 3,Gcc的使用(掌握常用参数)gcc --- 常用选项 gcc ---库选项 函数库分为静态库和动态库两种,静态库是一系列的目标文件(.o文件)的归档文件(文件名格式为libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库,从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件(ELF格式文件)之中;动态库(文件名格式为libname.so[.主版本号.次版本号.发行号])在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。 gcc --- 警告选项 gcc --- 优化选项gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。可能适合使用优化选项的场合:程序发行不太适合使用优化选项的场合:程序开发gcc --- 体系结构相关选项 4,Gdb的常用命令gdb工作环境相关命令 gdb设置断点与恢复命令 gdb中源码查看相关相关命令 gdb中查看运行数据的相关命令 5,简单makefile的编写(具体自己找程序看)makefile是make读入的惟一配置文件,因此本节的内容实际就是讲述makefile的编写规则。在一个makefile中通常包含如下内容:· 需要由make工具创建的目标体(target),通常是目标文件或可执行文件;· 要创建的目标体所依赖的文件(dependency_file);创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头。 6,嵌入式操作系统的分类(软件架构角度)答:软件架构角度:单体结构,分层结构,微内核结构;单体结构优点:性能好,通信开销小;缺点:体积庞大、高度集成、相互关联分层结构:这种结构要求在每个层次上都要提供一组API接口函数,这就会带来额外的开销 微内核结构:易于扩展、调试方便、易于移植,但是速度可能会慢7,嵌入式中间件的概念、思路、特点中间件(Middleware):在OS内核、设备驱动程序和应用软件之外的所有系统软件;中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在其上的各个应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台;优点:实现软件的可重用,降低应用软件的复杂性,降低开发成本。 8,Ifconfig命令配置IP地址、子网掩码Ifconfig eth0 210.25.132.142 netmask 255.255.255.0 9,Linux的文件类型及其字母表示d 目录文件;l 符号链接;s 套接字文件;b 块设备文件/二进制文件;c 字符设备文件;p 命名管道文件;-普通文件 10,系统调用,编程接口系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。例如用户可以通过进程控制相关的系统调用来创建进程、实现进程调度、进程管理等。在实际使用中程序员调用的通常是用户编程接口——API 11,进程间通信的方式及其特点(1)管道(Pipe)及有名管道(named pipe)(2)信号(Signal):直接进行用户空间进程和内核进程之间的交互,(3)消息队列(Messge Queue):可以实现消息的随机查询,比FIFO具有更大的优势,消息又是存在于内核中的,由“队列ID”来标识。(4)共享内存(Shared memory):直接读写内存,不需要任何数据的拷贝(5)信号量(Semaphore):用来解决进程之间的同步与互斥问题的一种进程之间通信机制(6)套接字(Socket):12,查看文件信息,查询进程信息cat :连接并显示指定的一个和多个文件的有关信息。 cat[选项]文件1文件2… 其中的文件1、文件2为要显示的多个文件13,修改文件主,文件组,文件操作权限chmod :改变文件的访问权限。具体看书14,文件的复制、删除、移动、改名cp:将给出的文件或目录复制到另一文件或目录中。 cp:cp [选项] 源文件或目录 目标文件或目录 mv:为文件或目录改名或将文件由一个目录移入另一个目录中。 mv [选项] 源文件或目录 目标文件或目录 rm:删除一个目录中的一个或多个文件或目录。 rm [选项] 文件或目录 chown:修改文件所有者和组别。 chown [选项]...文件所有者[所有者组名] 文件 其中的文件所有者为修改后的文件所有者。chgrp:改变文件的组所有权。 chgrp:chgrp [选项]... 文件所有组 文件 其中的文件所有组为改变后的文件组拥有者。chmod :改变文件的访问权限。 chmod [选项]…符号权限[符号权限]…文件 chmod [选项] …八进制权限 文件… 15,打包命令,压缩命令压缩打包相关命令bzip2:.bz2文件的压缩(或解压)程序 bzip2[选项] 压缩(解压缩)的文件名bunzip2:.bz2文件的解压缩程序 bunzip2[选项] .bz2压缩文件bzip2recover:用来修复损坏的.bz2文件 bzip2recover .bz2压缩文件gzip:.gz文件的压缩程序 gzip [选项] 压缩(解压缩)的文件名gunzip:解压被gzip压缩过的文件 gunzip [选项] .gz文件名unzip:解压winzip压缩的.zip文件 unzip [选项] .zip压缩文件compress:早期的压缩或解压程序(压缩后文件名为.Z) compress [选项] 文件tar:对文件目录进行打包或解包 tar [选项] [打包后文件名]文件目录列表 16,文件锁及其编程操作文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。 17,I/O处理的模型阻塞I/O模型:在这种模型下,若所调用的I/O函数没有完成相关的功能,则会使进程挂起,直到相关数据到达才会返回。如常见对管道设备、终端设备和网络设备进行读写时经常会出现这种情况。· 非阻塞模型:在这种模型下,当请求的I/O操作不能完成时,则不让进程睡眠,而且立即返回。非阻塞I/O使用户可以调用不会阻塞的I/O操作,如open()、write()和read()。如果该操作不能完成,则会立即返回出错(例如:打不开文件)或者返回0(例如:在缓冲区中没有数据可以读取或者没空间可以写入数据)。· I/O多路转接模型:在这种模型下,如果请求的I/O操作阻塞,且它不是真正阻塞I/O,而是让其中的一个函数等待,在这期间,I/O还能进行其他操作。如本节要介绍的select()和poll函数(),就是属于这种模型。· 信号驱动I/O模型:在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。这是由内核通知用户何时可以启动一个I/O操作决定的。· 异步I/O模型:在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。现在,并不是所有的系统都支持这种模型。 18,串口的三种模式规范模式,非规范模式,原始模式19,串口配置的流程1.保存原先串口配置2.激活选项3.设置波特率4.设置字符大小5.设置奇偶校验位6.设置停止位7.设置最少字符和等待时间8.清除串口缓冲9.激活配置20,进程的概念、状态、分段进程是一个程序的一次执行的过程,同时也是资源分配的最小单元。一个进程应该包括: 程序的代码; 程序的数据; PC中的值,用来指示下一条将运行的指令; 一组通用的寄存器的当前值,堆、栈; 一组系统资源(如打开的文件)总之,进程包含了正在运行的一个程序的所有状态信息。执行态:该进程正在运行,即进程正在占用CPU。就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间片。等待态:进程不能使用CPU,若等待事件发生(等待的资源分配到)则可将其唤醒。 Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。 21,exit()和_exit()的联系和区别exit()和_exit()函数都是用来终止进程的。 _exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。由于在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等),再将缓冲区中的内容一次性写入文件。若想保证数据的完整性,就一定要使用exit()函数 22,守护进程的编写步骤23,守护进程的出错处理一种通用的办法是使用syslog服务,将程序中的出错信息输入到系统日志文件中,从而可以直观地看到程序的问题所在。 24,管道的概念和特点所谓管道即连接两个任务之间的一个打开的共享文件,专用于任务之间的数据通信;管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中fds[0]固定用于读管道,而fd[1]固定用于写管道,这样就构成了一个半双工的通道。 25,信号的生命期一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数 26,用户进程对信号的处理方式信号处理的主要方法有两种,一种是使用简单的signal()函数,另一种是使用信号集函数组。 27,信号的编程、249-250页28,信号量的概念和使用步骤信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。信号量的使用: 第一步:创建信号量或获得在系统已存在的信号量,此时需要调用semget()函数。不同进程通过使用同一个信号量键值来获得同一个信号量。 第二步:初始化信号量,此时使用semctl()函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1。 第三步:进行信号量的PV操作,此时调用semop()函数。这一步是实现进程之间的同步和互斥的核心工作部分。 第四步:如果不需要信号量,则从系统中删除它,此时使用semclt()函数的IPC_RMID操作。此时需要注意,在程序中不应该出现对已经被删除的信号量的操作。 29,共享内存的概念和使用步骤共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的拷贝。为了在多个进程间交换信息,内核专门留出了一块内存区。这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高了效率。共享内存的实现分为两个步骤, 第一步是创建共享内存,这里用到的函数是shmget(),也就是从内存中获得一段共享内存区域。 第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。 30,消息队列的概念和使用步骤消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等,可以实现消息的随机查询,消息又是存在于内核中的,由“队列ID”来标识。 消息队列的实现包括 创建或打开消息队列、添加消息、读取消息控制消息队列 这四种操作。 31,消息队列的编程268页32,C语言的位操作33,写出Linux系统的信号处理函数singal的原型,并对该函数进行解释该函数原型整体指向了一个无返回值并且带一个整型参数的函数指针34,什么是交叉编译?什么是交叉调试?所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。嵌入式的交叉编译也包括交叉编译、交叉链接等过程交叉调试是宿主机和目标机之间进行的交叉调试,调试器依然运行在宿主机的通用操作系统上,但被调试的进程运行在特定的硬件平台的嵌入式中,调试器和被调试进程通过串口或者网络进行通信。 35,什么是优先级反转?如何应对优先级反转?优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。
解决优先级翻转问题有优先级天花板(priority ceiling)和优先级继承(priority inheritance)两种办法。(来自百度)1)单调速率调度(Rate Monotonic Scheduling,RMS) 算法;RMS是一种静态优先级调度算法,也是最常用的一种确定任务优先级的算法;思路:单位时间内任务被执行的次数越多,优先级越高。即任务的周期越短,优先级越高。
2)最早期限优先(Earliest Deadline First, EDF) 调度算法:EDF是一种动态优先级调度算法,也是性能最好的一种调度算法;基本思路:对时间期限最近的任务,分配最高的优先级。