第一篇:青岛理工嵌入式操作系统重点总结
1.磁盘挂载步骤
命令:mount[选项][类型] 步骤:1.确认是否为Linux可以识别的文件系统。
2.确定设备的名称,可通过使用命令“fdisk-l”查看。
3.必须确定挂载点已经存在,也就是在/mnt下的相应子目录已经存在 4.进行挂载,使用完后可用umount卸载 2.shell脚本三个步骤 3.shellpot概念和任务 4.中断系统调用的是硬中断。5.中断处理处理程序分为哪两部分,上半部:功能是“登记中断”。当一个中断发生时,他就把设备驱动程序中中断例程 的下半部挂到该设备的下半部执行队列中去,然后就等待新的中断的到来。上半部是不可中断的
下半部:功能是查看设备以获得产生中断的时间信息,并根据这些信息(一般通过读设备上的寄存器得来的)进行相应的处理。下半部是可中断的。6.信号与信号量的概念,程序和进程的概念。
程序:是存放在磁盘文件中的可执行文件,是机器代码指令和数据的集合,不能独立运行
进程:资源分配和独立运行的基本单位。
信号:信号是软件中断,信号机制是Unix系统中最为古老的进程之间的通信机制,用于在一个或者多个进程之间传递异步信号。
信号量:信号量是进程通信处理同步互斥地机制,它是在多线程环境下使用的一种同步工具,负责协调各个线程,以保证他们能够正确、合理的使用公共资源。7.Linux进程的五种状态
8.什么是管道,管道的分类(匿名管道的系统创建调用
管道的)
管道:是在内存中创建一个分享文件,使通信双方利用这个文件进行信息传递,这个作为传递信息的共享文件就是管道
分类:匿名管道:匿名管道没有名字,只能提供给进程家族中的父子进程间通信使用。
命名管道:FIFO(先进先出),是一个能在互不相关进程之间传送数据的特殊文件。他是在实际文件系统的基础上实现的一种通信机制
9.gcc编译的四个阶段,那四个阶段。预处理,编译,汇编,链接
10.编写一个 makefile 文件
11.创建子进程的系统调用,fork函数,三个返回值代表什么意思 int fork(): 返回值为0 创建成功,从子进程返回
返回值>0
创建成功,从父进程返回,其值为子进程的pid号 返回值=-1 创建失败
12.编写守护进程的步骤,五个步骤对应的代码,内核编译的三个步骤,每一步使用的命令。守护进程步骤:1.创建子进程,父进程退出
if(pid>0)exit(0);else if(pid<0)return-1;
2.调用setsid以创建一个新的会话,并担任该会话的组长
setsid();
3.改变当前目录为根目录
chdir(“/”);
4.重设文件权限掩码 umask(0);
5.关闭不再需要的文件描述符 for(i=0;i 15.Linux设备驱动程序分为那几部分,每一部分的功能。 程序题 1.分析程序的输出结果,exit,wait返回值,参数 信号的发送和捕获。 设置时钟的alarm()。 共享内存的创建,链接,共享。。 消息队列:7-6-1 课本上 第一章 mpumcu 嵌入式系统的组成 posix是什么标准 linux内核版本号,三位 11页主分区,扩展分区,逻辑分区。 什么叫挂载? 挂载:在Linux中把每一个分区和某一个目录对应,以后对这个目录的操作就是对这个分区的操作,这样就实现了硬件管理手段和软件目录管理手段的统一。这个把分区和目录对应的过程就称为挂载。12页交换分区grub引导器。是一种引导装入器,他负责装入内核并引导Linux系统,位于硬盘的起始部分。 22页文件的类型和属性(四种) 23页文件类型。普通文件,目录文件,链接文件,设备文件 文件属性 r:可读 w:可写 x:可执行 文件用户级别:文件拥有者u,所属的用户组g,系统其他用户o 25页Linux的结构 bin boot 第一位 etc home lib(动态链接库)挂载。。proc root用户 user var 第二章 30-54所有的命令 用户切换su 普通用户--超级用户 切换 用户管理(31页) 系统管理命令(33页) shutdown kill clear 磁盘相关的命令 磁盘挂载 步骤 文件目录相关(37页47) 改变文件目录-cd 显示当前目录-pwd 列出目录内容 -ls(-a)创建目录149进程通信同步互斥的概念 进程间通信就是在不同进程之间传播或交换信息。 互斥:就是指某一资源同时只允许一个访问者对其进行访问,即访问是无序的。同步:是指在互斥的基础上,通过其他机制实现访问者对资源的有序访问。 152信号量的概念,信号区别(用来解决进程同步与互斥问题的机制)信号:信号是软件中断,信号机制是Unix系统中最为古老的进程之间的通信机制,用于在一个或者多个进程之间传递异步信号。 信号量:信号量是进程通信处理同步互斥的机制,它是在多线程环境下使用的一种同步工具,负责协调各个线程,以保证他们能够正确、合理的使用公共资源。169管道的定义分类,创建匿名管道的系统调用 管道:是在内存中创建一个分享文件,使通信双方利用这个文件进行信息传递,这个作为传递信息的共享文件就是管道 分类:匿名管道:匿名管道没有名字,只能提供给进程家族中的父子进程间通信使用。 命名管道:FIFO(先进先出),是一个能在互不相关进程之间传送数据的特殊文件。他是在实际文件系统的基础上实现的一种通信机制 171读写规则 系统对信号三种处理方式: 159映射调用了什么函数mmap 161共享内存的打开和建立 164四个函数对应程序。消息队列 消息队列:消息队列是系统定义的内存块,用于临时存储消息。消息队列就是一个消息的链表。可以把消息看做一个记录,具有特定的格式及特定的优先级。96存储管理。使用虚拟内存的优势: 使用虚拟内存的优势:使计算机可以操纵更大的地址空间,还可以使系统中的每一个进程都有自己的虚拟地址空间。97什么叫内存映像。第三段四行。内存映像:进程的映像和虚拟进程空间的连接称为内存影像 102根据读的方式分为两种,写的方式分为两种。高速缓存 贯穿读出式 旁路读出式 写穿式回写式 106页分配器的伙伴算法 111slab根据对象的类型分类不同的cache 114-kmalloc 申请和是放假(较小较大)内存分配函数 118什么用于将高。。 227输入输出系统的基本功能。存储器统一编址和独立编址 功能一:隐藏物理设备的细节 功能二:与设备的无关性 功能三:提高处理器与I/O设备的利用率 功能四:对I/O设备进行控制 功能五:能确保对设备的正常共享 功能六:错误处理 235linux设备驱动程序分为哪几部分,每一部分的功能。自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序只有在初始化时被调用一次。 完成用户进程请求的程序,即永恒进程对设备的操控部分 设备中断服务程序,通常分为上半部和下半部 200超级块是文件的第一块,主要包含文件系统的具体信息。201 vfs虚拟文件系统是系统对外的一个接口。仅存在于就内存。207文件控制块是文件存在的标志。唯一。 CPU内部结构 8086分为两个部分:总线接口部件BIU和执行部件EU BIU主要功能负责CPU与存储器、I/O接口之间的信息传递。 BIU部件包括(1).四个段地址寄存器:代码段寄存器CS、数据段寄存器DS、堆栈段寄存器ss、附加段寄存器ES、(2).指令指针寄存器IP、(3).20位地址加法器、(4).6B的指令队列、(5).总线控制逻辑电路。 EU主要功能负责指令的执行。EU部件包括(1).四个通用寄存器:累加器AX、基址寄存器BX、计数器CX、数据寄存器DX。(2).四个专用寄存器:堆栈指针寄存器SP、基址指针寄存器BP、源变址寄存器SI、目的变址寄存器DI。(3).算数逻辑单元ALU。(4).标志寄存器FR。(5).EU控制电路。 CPU寄存器 1.通用寄存器AX,BX,CX,DX,每一个寄存器都是16位的,既可以作为16位,又可以拆成高、低8位,分别作为两个独立8位寄存器使用。AX(AH,AL)累加器 BX(BH,BL)基址寄存器 CX(CH,CL)技术寄存器 DX(DH,DL)数据寄存器 2.专用寄存器SP,BP,SI,DI SP堆栈指针寄存器:在堆栈中存放栈顶偏移指针,永远指向堆栈的栈顶。BP基址指针寄存器:一般也用来存放访问内存时的基地址。 SI源变址寄存器、DI目的变址寄存器:它们常常用在变址寻址方式中。3.段寄存器CS,DS,SS,ES CS代码段寄存器。DS数据段寄存器。SS堆栈段寄存器。ES附加段寄存器。 每一个段寄存器都是16位。4.指令指针寄存器IP 16位的指令指针寄存器IP 用于存放 下一条执行指令的偏移地址。CPU取指令总以CS为段基址,以IP 位段内偏移地址。当CPU从CS段内偏移地址为(IP)的内存单元中取出指令代码的一个字节后,IP 会自动加1,从而指向代码的下一个字节,用户不能直接访问IP寄存器。5.标志寄存器FR 它是16位寄存器,但只使用其中的9位,这9位包括6个状态标志位和3个控制标志位。状态标志记录了前面算术逻辑运算结果的一些特征;控制标志是用户自己通过指令设置的,设置后将对其后的操作产生控制作用。 指令、伪指令与宏指令 指令语句是可执行语句,在汇编中要产生对应的机器代码,与机器指令有一一对应关系,是CPU指令系统中的指令的符号形式,CPU根据这些代码执行相应的操作。 伪指令语句是不可执行语句,没有机器指令与其对应,在汇编中不产生机器代码,是汇编程序支持的一种命令,在汇编程序对汇编语言源程序汇编期间由汇编程序执行,告诉汇编程序如何汇编源程序,可以完成数据的定义、内存的分配等功能。 宏指令语句是以一条宏指令代表一段程序,经过定义之后,在程序中出现该程序段的地方均可用宏指令代替,简化了程序设计。在汇编时,凡出现宏指令语句的位置都会被换成相应的程序段。 DOS系统功能调用 DOS功能模块位于BIOS的上层,对硬件的以来较小,DOS功能既可用于操作系统管理,又可用于汇编程序的设计。(1).设置所要调用功能的入口参数(2).在AH寄存器中存入搜要调用功能的功能号。 (3).通过INT n(系统功能调用用INT 21H)指令自动转入中断子程序入口。(4).相应中断子程序运行完毕,可按规 定取得出口参数。 CPU与外设间信息调用 微机与外设之间的信息传递实际上是CPU与接口之间的信息传递,它们之间信息传递的主要方式有以下五种:(1).无条件传送方式:又称为同步方式,它所有的操作均由执行程序完成,主要适用于CPU或外围设备始终是准备好了的情况,或者危机和外设是完全同步的情况。 (2).程序查询方式:(3).中断处理方式:(4).DMA控制方式:(5).I/O处理机方式: 8259A工作方式 1.中断触发方式(1).边沿触发方式。(2).电平触发方式。2.连接系统总线方式 该方式用来确定系统总线与8259A数据总线之间是否需要进行缓冲。(1).缓冲方式。(2).非缓冲方式。3.屏蔽中断源的方式 8259A 8个中断请求线上的每一个都可以根据需要决定是否屏蔽,屏蔽是通过编程使屏蔽寄存器IMR相应位置0或置1,从而允许或禁止该位所对应的中断。 (1).普通屏蔽方式。(2).特殊屏蔽方式。4.优先级排队的方式 8259A对中断优先级的管理是中断管理的核心问题。(1).全嵌套方式(2).特殊全嵌套方式(3).优先权自动循环方式(4).优先权特殊自动循环方式 5.中断结束方式(1).自动中断结束方式。(2).普通中断结束方式。(3).特殊中断结束方式。 实验一 嵌入式开发环境的建立 一、实验目的 通过此实验系统,读者可以了解嵌入式实时操作系统 uC/OS-II 的内核机制和运行原理。本实验系统展示了 uC/OS-II 各方面的管理功能,包括信号量、队列、内存、时钟等。在各个实验中具体介绍了 uC/OS-II 的相关函数。读者在做实验的同时能够结合理论知识加以分析,了解各个函数的作用和嵌入式应用程序的设计方法,最终对整个 uC/OS-II 和嵌入式操作系统的应用有较为清楚的认识。 二、实验步骤 1.安装集成开发环境LambdaEDU 集成开发环境LambdaEDU 的安装文件夹为 LambdaEDU,其中有一个名为“Setup.exe” 的文件,直接双击该文件便可启动安装过程。具体的安装指导请看“LambdaEDU 安装手 册.doc”文件。 当 LambdaEDU 安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将 我们的实验项目建立并运行起来。 2.建立项目 为了我们的实验运行起来,需要建立1 个项目基于x86 虚拟机的标准应用项目。通过点 击“文件”、“新建”、“项目”开始根据向导创建一个项目。 在随后出现的对话框中选择“Tool/标准应用项目”,点击下一步,开始创建一个标准的 可执行的应用程序项目。 在随后出现的对话框中填入项目名称“ucos_x86_demo”。点击“下一步”。 选择“pc386 uC/OS-II 应用(x86)”作为该项目的应用框架。点击“下一步” 选择“pc386_elf_tra_debug”作为该项目的基本配置。点击“完成”。 新创建的项目“ucos_x86_demo”将会被添加到项目列表。src 文件夹下保存了该项目中 包含的源文件。ucos2 文件夹中包含了移植到x86 虚拟机的全部代码。init.c 文件是基于ucos2 和本虚拟机的一个应用程序。在进行ucos2 内核实验中,只需要替换init.c 文件,即可。文 件名不限,但是文件名中最好不要使用英文符号和数字以外的其他字符,3.构建项目 到这里,项目配置全部完成。接下来就可以进行构建项目了。 第一次构建本项目,在此项目上点击右键,选择“重建BSP 及项目”。即可开始构建。 之后弹出的对话框显示了构建的进度。可以点击“在后台运行”,以隐藏该对话框 在构建的同时,在右下角的“构建信息”视图输出构建过程中的详细信息: 注:“重新构建”将本项目中的全部源代码进行一次完全的编译和连接,花费时间较多。“构建项目”则仅仅将新修改过的源代码进行编译和连接,花费时间最少。“重建BSP及项 目”,不但要完成“重新构建”的全部工作,另外还要编译与该项目有关的的LambdaEDU 中内置的部分代码,花费时间最多。但是在项目刚建立后,第一次构建时需要选择“重建 BSP 及项目”。以后的构建中选择“重新构建”或“构建项目”即可。另外,在替换了源代 码中的文件后,需要选择“重新构建”来完成该项目的构建。 4.配置虚拟机和目标机代理 (1)制作X86启动盘 在 LambdaEDU 中依次点击“工具”、“Bochs”、“制作虚拟机启动映象”。对启动盘进行一些参数设置后(如下图所示),系统将自动为你生成一个PC 虚拟机的 启动盘映像。 (2)配置虚拟机 选择使用的网络适配器(网卡)后,点击“确定”完成配置。 注意:如果计算机上有多网卡,请将其他网卡停用(包括 VMware 虚拟机添加的虚拟 网卡)。 (3)创建目标机代理 配置好虚拟机后,创建目标机代理:点击LambdaEDU 左下方窗口中绿色的十字符号,在弹出的窗口中选择“基于TA 的连接方式”,并点击“下一步”。 在弹出的“新目标机连接配置中”的这些参数,应该与之前制作启动盘时设置的参数一致。 注意: 名字:输入目标机的名字(缺省是 default),注意如果和现有目标机重名的话,改个名 字。 连接类型:默认选择 UDP IP地址:这里输入目标机(在本实验系统中是虚拟机)的 IP地址; 最后点击“确定”,在目标机管理窗口中,可以看到新增加了一个名为default 的目标机 节点 (4)调试应用 启动虚拟机。 虚拟机启动后的画面如下(其中显示的IP 地址创建虚拟机启动盘时填入的IP 地址)中设置的IP 地址): 在成功完成构建的项目ucos_x86_demo 中的“pc386_elf_tra_debug”上点击鼠标右键,在弹出的菜单中选择“调试”,启动调试器调试生成的程序: 第一次进行调试/运行,需要选择目标机,如下图,选择“Default”,点击“确定”,开 始向目标机(虚拟机)下载应用程序。程序下载完成后,会弹出一个“确认透视图切换”对话框,选择“是”,切换到调试透 视图。 调试的界面如下: 点击绿色的按钮,全速运行。 注意:全速运行后,程序不能够被暂停和停止。 三、实验过程中遇到的问题及体会 在设置IP地址时,要求该IP地址与本计算机在同一个子网中,同时要求该 IP地址没有被网络上其他计算机使用。此外,通过构建开发环境,处次体验到了嵌入式开发工作的乐趣。 实验二 任务的基本管理 一、实验目的 1.理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程; 2.掌握 uC/OS-II 中任务管理的基本方法(创建、启动、挂起、解挂任务); 3.熟练使用 uC/OS-II 任务管理的基本系统调用。 二、实验原理及程序结构 1.实验设计 为了展现任务的各种基本状态及其变迁过程,本实验设计了 Task0、Task1 两个任务: 任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行。通过本实验,读者可以清晰地了解到任务在各个时刻的状态以及状态变迁的原因。2.运行流程 描述如下: (1)系统经历一系列的初始化过程后进入 boot_card()函数,在其中调用 ucBsp_init()进 行板级初始化后,调用 main()函数; (2)main()函数调用 OSInit()函数对 uC/OS-II 内核进行初始化,调用 OSTaskCreate 创 建起始任务 TaskStart; (3)main()函数调用函数 OSStart()启动 uC/OS-II 内核的运行,开始多任务的调度,执 行当前优先级最高的就绪任务 TaskStart;(4)TaskStart 完成如下工作: a、安装时钟中断并初始化时钟,创建 2 个应用任务; b、挂起自己(不再被其它任务唤醒),系统切换到当前优先级最高的就绪任务Task0。之后整个系统的运行流程如下: t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己; t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒Task0,后者由于优先级较高而抢占 CPU; Task0 执行到 t4 时刻又挂起自己,内核调度 Task1 执行; Task1 运行至 t5 时刻再度唤醒 Task0; …… 3.µC/OS-Ⅱ中的任务描述 一个任务通常是一个无限的循环,由于任务的执行是由操作系统内核调度的,因此任务是绝不会返回的,其返回参数必须定义成 void。在μC/OS-Ⅱ中,当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的 CPU 使用权就会被抢占,高优先级任务会立刻得到 CPU 的控制权(在系统允许调度和任务切换的前提下)。μC/OS-Ⅱ可以管理多达 64 个任务,但目前版本的μC/OS-Ⅱ有两个任务已经被系统占用了(即空闲任务和统计任务)。必须给每个任务赋以不同的优先级,任务的优先级号就是任务编号(ID),优先级可以从 0 到 OS_LOWEST_PR10-2。优先级号越低,任务的优先级越高。μC/OS-Ⅱ总是运行进入就绪态的优先级最高的任务。4.源程序说明(1)TaskStart任务 TaskStart 任务负责安装操作系统的时钟中断服务例程、初始化操作系统时钟,并创建所 有的应用任务: UCOS_CPU_INIT();/* Install uC/OS-II's clock tick ISR */ UCOS_TIMER_START();/*Timer 初始化*/ TaskStartCreateTasks();/* Create all the application tasks */ OSTaskSuspend(OS_PRIO_SELF); 具体负责应用任务创建的 TaskStartCreateTasks 函数代码如下,它创建了两个应用任务 Task0 和 Task1: void TaskStartCreateTasks(void){ INT8U i; for(i = 0;i < N_TASKS;i++)// Create tasks { TaskData[i] = i;// Each task will display itsown information } OSTaskCreate(Task0,(void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE1], 6);} TaskStart 任务完成上述操作后将自己挂起,操作系统将调度当前优先级最高的应用任务Task0 运行。(2)应用任务 应用任务 Task0 运行后将自己挂起,之后操作系统就会调度处于就绪状态的优先级最高的任务,具体代码如下: void Task0(void *pdata){ INT8U i;INT8U err;i=*(int *)pdata;for(;;){ printf(“Application tasks switched %d times!nr”,++count); printf(“TASK_0 IS RUNNING..............................................................nr”);printf(“task_1 is suspended!nr”); printf(“**************************************************nr”);err=OSTaskSuspend(5);// suspend itself } } 应用任务 Task1 运行后将 Task0 唤醒,使其进入到就绪队列中: void Task1(void *pdata){ INT8U i;INT8U err;i=*(int *)pdata;for(;;){ OSTimeDly(150); printf(“Application tasks switched %d times!nr”,++count);printf(“task_0 is suspended!nr”);printf(“TASK_1 IS RUNNING..............................................................nr”);printf(“**************************************************nr”);OSTimeDly(150); err=OSTaskResume(5);/* resume task0 */ } } 三、运行及观察应用输出信息 按照本实验手册第一部分所描述的方法建立应用项目并完成构建,当我们在 LambdaEDU 调试器的控制下运行构建好的程序后,将看到在μC/OS-Ⅱ内核的调度管理下,两个应用任务不断切换执行的情形: 四、本实验中用到的µC/OS-Ⅱ相关函数 4.1 OSTaskCreate() OSTaskCreate()建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在 正在运行的任务中建立。中断处理程序中不能建立任务。一个任务必须为无限循环结构,且 不能有返回点。 OSTaskCreate()是为与先前的μC/OS 版本保持兼容,新增的特性在 OSTaskCreateExt()函数中。 无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与 CPU 中断后 寄存器入栈的顺序结构相同。详细说明请参考所用处理器的手册。函数原型: INT8U OSTaskCreate(void(*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio); 参数说明: task 是指向任务代码首地址的指针。 pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。 ptos 为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址 以及任务被中断时的 CPU 寄存器内容。任务堆栈的大小决定于任务的需要及预计的中断嵌 套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量 OS_STK_GROWTH 设为 1,堆栈被设为从内存高地址 向 低 地 址 增 长,此时 ptos 应 该 指 向任 务堆 栈 空 间 的 最 高 地 址。反 之,如 果OS_STK_GROWTH 设为 0,堆栈将从内存的低地址向高地址增长。prio 为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。返回值: OSTaskCreate()的返回值为下述之一: OS_NO_ERR:函数调用成功。 OS_PRIO_EXIST:具有该优先级的任务已经存在。 OS_PRIO_INVALID:参数指定的优先级大于 OS_LOWEST_PRIO。 OS_NO_MORE_TCB:系统中没有 OS_TCB 可以分配给任务了。注意: 任务堆栈必须声明为 OS_STK 类型。 在任务中必须调用μC/OS 提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到 CPU。用 户 程 序 中 不 能 使 用 优 先 级 0,1,2,3,以 及 OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS 系统 保留,其余的 56 个优先级提供给应用程序。4.2 OSTaskSuspend() OSTaskSuspend()无条件挂起一个任务。调用此函数的任务也可以传递参数 OS_PRIO_SELF,挂起调用任务本身。当前任务挂起后,只有其他任务才能唤醒。任务挂起 后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。唤醒挂起任务需要调用 函数 OSTaskResume()。 任务的挂起是可以叠加到其他操作上的。例如,任务被挂起时正在进行延时操作,那么 任务的唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作。又如,任务被挂起时正 在等待信号量,当任务从信号量的等待对列中清除后也不能立即运行,而必须等到被唤醒后。函数原型: INT8U OSTaskSuspend(INT8U prio);参数说明: prio 为指定要获取挂起的任务优先级,也可以指定参数 OS_PRIO_SELF,挂起任务本 身。此时,下一个优先级最高的就绪任务将运行。返回值: OSTaskSuspend()的返回值为下述之一: OS_NO_ERR:函数调用成功。 OS_TASK_ SUSPEND_IDLE:试图挂起 µC/OS-II 中的空闲任务(Idle task)。此为非法操作。 OS_PRIO_INVALID :参数指定的优先级大于 OS_LOWEST_PRIO 或没有设定 OS_PRIO_SELF 的值。 OS_TASK_ SUSPEND _PRIO:要挂起的任务不存在。注意: 在程序中 OSTaskSuspend()和 OSTaskResume()应该成对使用。用 OSTaskSuspend()挂起的任务只能用 OSTaskResume()唤醒。4.3 OSTaskResume() OSTaskResume()唤醒一个用 OSTaskSuspend()函数挂起的任务。OSTaskResume()也是唯一能“解挂”挂起任务的函数。函数原型: INT8UOSTaskResume(INT8U prio);参数说明: prio 指定要唤醒任务的优先级。返回值: OSTaskResume()的返回值为下述之一: OS_NO_ERR:函数调用成功。 OS_TASK_RESUME_PRIO:要唤醒的任务不存在。 OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。 OS_PRIO_INVALID:参数指定的优先级大于或等于 OS_LOWEST_PRIO。 五、实验过程中遇到的问题及体会 实验过程中体会到了嵌入式开发的乐趣,对上课老师所讲的内容有了进一步的认识与理解。17 实验三 信号量:哲学家就餐问题的实现 一、实验目的 掌握在基于嵌入式实时操作系统 uC/OS-II 的应用中,任务使用信号量的一般原理。通 过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。 二、实验原理及程序结构 1.实验设计 掌握在基于嵌入式实时操作系统 uC/OS-II 的应用中,任务使用信号量的一般原理。通 过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。2.源程序说明 五个哲学家任务(ph1、ph2、ph3、ph4、ph5)主要有两种过程:思考(即睡眠一段时 间)和就餐。每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放 这两支筷子。五个哲学家围成一圈,每两人之间有一支筷子。一共有五支筷子,在该实验中 用了五个互斥信号量来代表。每个任务的代码都一样,如下所示: void Task(void *pdata){ INT8U err;INT8U i;INT8U j; i=*(int *)pdata;j=(i+1)% 5; uC/OS-II 实验指导书 for(;;){ TaskThinking2Hungry(i);OSSemPend(fork[i], 0, &err); OSSemPend(fork[j], 0, &err);/* Acquire semaphores to eat */ TaskEat(i); OSSemPost(fork[j]); OSSemPost(fork[i]);/* Release semaphore */ OSTimeDly(200);/* Delay 10 clock tick */ } } 操作系统配置 修改 uC_OS-II/OS_CFG.h: :: : #define OS_MAX_EVENTS 10 /*最多可以有 10 个事件*/ #define OS_MAX_FLAGS 5 /*最多可以有 5 个事件标志*/ #define OS_MAX_MEM_PART 5 /*最多可以划分 5 个内存块*/ #define OS_MAX_QS 2 /*最多可以使用 2 个队列*/ #define OS_MAX_TASKS 8 /*最多可以创建 8 个任务*/ #define OS_LOWEST_PRIO 14 /*任务优先级不可以大于 14*/ #define OS_TASK_IDLE_STK_SIZE 1024 /*空闲任务堆栈大小*/ #define OS_TASK_STAT_EN 1 /*是否允许使用统计任务*/ #define OS_TASK_STAT_STK_SIZE 1024 /*统计任务堆栈大小*/ #define OS_FLAG_EN 1 /*是否允许使用事件标志功能*/ #define OS_FLAG_WAIT_CLR_EN 1 /*是否允许等待清除事件标志*/ #define OS_FLAG_ACCEPT_EN 1 /*是否允许使用 OSFlagAccept()*/ #define OS_FLAG_DEL_EN 1 /*是否允许使用 OSFlagDel()*/ #define OS_FLAG_QUERY_EN 1 /*是否允许使用 OSFlagQuery()*/ #define OS_MBOX_EN 0 /*是否允许使用邮箱功能*/ #define OS_MEM_EN 0 /*是否允许使用内存管理的功能*/ #define OS_MUTEX_EN 0 /*是否允许使用互斥信号量的功能*/ #define OS_Q_EN 0 /*是否允许使用队列功能*/ #define OS_SEM_EN 1 /*是否允许使用信号量功能*/ #define OS_SEM_ACCEPT_EN 1 /*是否允许使用 OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允许使用OSSemDel()*/ #define OS_SEM_QUERY_EN 1 /*是否允许使用OSSemQuery()*/ #define OS_TASK_CHANGE_PRIO_EN 1 /* 是 否 允 许 使 用 OSTaskChangePrio()*/ #define OS_TASK_CREATE_EN 1 /*是否允许使用 OSTaskCreate()*/ #define OS_TASK_CREATE_EXT_EN 1 /*是否允许使用 OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允许使用 OSTaskDel()*/ #define OS_TASK_SUSPEND_EN 1 /* 是 否 允 许 使 用 OSTaskSuspend()and OSTaskResume()*/ #define OS_TASK_QUERY_EN 1 /*是否允许使用 OSTaskQuery()*/ #define OS_TIME_DLY_HMSM_EN 1 /* 是 否 允 许 使 用 OSTimeDlyHMSM()*/ #define OS_TIME_DLY_RESUME_EN 1 /* 是 否 允 许 使 用 OSTimeDlyResume()*/ #define OS_TIME_GET_SET_EN 1 /* 是否允许使用 OSTimeGet()和 OSTimeSet()*/ #define OS_SCHED_LOCK_EN 1 /* 是 否 允 许 使 用 OSSchedLock()和 OSSchedUnlock()*/ #define OS_TICKS_PER_SEC 200 /*设置每秒之内的时钟节拍数目*/ 三、运行及观察应用输出信息 开始,所有的哲学家先处于 thinking 状态,然后都进入 hungry 状态: 后首先获得两个信号量的 1、3 号哲学家开始 eating,待他们释放相关信号量之后,哲 学家 2、5、4 获得所需的信号量并 eating: 应用如此这般地循环执行程序下去„„ 四、本实验中用到的µC/OS-Ⅱ相关函数 4.1 OSSemCreate() OSSemCreate()函数建立并初始化一个信号量。信号量的作用如下: 允许一个任务和其他任务或者中断同步 取得设备的使用权 标志事件的发生 函数原型: OS_EVENT *OSSemCreate((((WORD value))))参数说明: value 参数是所建立的信号量的初始值,可以取 0 到 65535 之间的任何值。返回值: OSSemCreate()函数返回指向分配给所建立的信号量的控制块的指针。如果没有可用的 控制块,OSSemCreate()函数返回空指针。注意: 必须先建立信号量,然后使用。4.2 OSSemPend() OSSemPend()函数用于任务试图取得设备的使用权,任务需要和其他任务或中断同 步,任务需要等待特定事件的发生的场合。如果任务调用 OSSemPend()函数时,信号量 的值大于零,OSSemPend()函数递减该值并返回该值。如果调用时信号量等于零,OSSemPend()函数函数将任务加入该信号量的等待队列。OSSemPend()函数挂起当前 任务直到其他的任务或中断置起信号量或超出等待的预期时间。如果在预期的时钟节拍内信 号量被置起,μC/OS-Ⅱ默认最高优先级的任务取得信号量恢复执行。一个被 OSTaskSuspend()函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用 OSTaskResume()函数恢复任务的运行。函数原型: :: : Void OSSemPend(OS_EVNNT *pevent, INT16U timeout, int8u *err);参数说明: :: : pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考 OSSemCreate()函数)。 Timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信号量时 恢复就绪状态。如果该值为零表示任务将持续地等待信号量,最大的等待时间为 65535 个时 钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差。 Err 是指向包含错误码的变量的指针。OSSemPend()函数返回的错误码可能为下述几 种: OS_NO_ERR :信号量不为零。 OS_TIMEOUT :信号量没有在指定数目的时钟周期内被设置。 OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但 µC/OS-Ⅱ仍然包含了检测这种情况的功能。 OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。返回值: 无 注意: 必须先建立信号量,然后使用。不允许从中断调用该函数。 4.3 OSSemPost() OSSemPost()函数置起指定的信号量。如果指定的信号量是零或大于零,OSSemPost()函数递增该信号量并返回。如果有任何任务在等待信号量,最高优先级的任务将得到信 号量并进入就绪状态。任务调度函数将进行任务调度,决定当前运行的任务是否仍然为最高 优先级的就绪状态的任务。函数原型: INT8U OSSemPost(OS_EVENT *pevent);参数说明: pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考 OSSemCreate()函数)。返回值: OSSemPost()函数的返回值为下述之一: OS_NO_ERR :信号量被成功地设置 OS_SEM_OVF :信号量的值溢出 OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针 注意: 必须先建立信号量,然后使用。4.4 OSTimeDly() OSTimeDly()将一个任务延时若干个时钟节拍。如果延时时间大于 0,系统将立即进 行任务调度。延时时间的长度可从 0 到 65535 个时钟节拍。延时时间 0 表示不进行延时,函 数将立即返回调用者。延时的具体时间依赖于系统每秒钟有多少时钟节拍(由文件 SO_CFG.H 中的常量 OS_TICKS_PER_SEC 设定)。函数原型: void OSTimeDly(INT16U ticks);参数说明: ticks 为要延时的时钟节拍数。返回值: 无 注意: 注意到延时时间 0 表示不进行延时操作,而立即返回调用者。为了确保设定的延时时间,建议用户设定的时钟节拍数加 1。例如,希望延时 10 个时钟节拍,可设定参数为 11。 五、实验过程中遇到的问题及体会 在实验前要对该问题进行深入的理解,即五个哲学家任务(ph1、ph2、ph3、ph4、ph5)主要有两种过程:思考(即睡眠一段时间)和就餐。每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放这两支筷子。五个哲学家围成一圈,每两人之间有一支筷子。只有理解了,才能更好的进行实验。 华北水利水电大学 North China University of Water Resources and Electric Power 嵌入式操作系统课程报告 题目 嵌入式系统课程综和论述 学 院 物理与电子学院 专 业 电子信息工程 姓 名 李天泽 学 号 201816516 组 员 完成时间 2020.12.22 目 录 一、嵌入式系统的介绍 (1)、嵌入式系统的概念……………………………………3 (2)、嵌入式系统的特点……………………………………4 二、嵌入式系统的发展和应用……………………………5 三、总结和心得……………………………………………7 参考文献……………………………………………7 附录…………………………………………………8 摘要: 如今,嵌入式系统经过半个多实际的发展和革新,在各个产业都可以看见它的身影。在电子消费领域,它已经广泛应用于手机、VCD、数字电视和路由器等常见家用电器和电子产品,或许在你的家里有着几十甚至几百个微型嵌入式计算机无时无刻地不在为你服务。 在工业控制方面,一辆豪华轿车的控制系统就包含着至少50个嵌入式微处理器,它们分布于火花塞、传动轴和安全气囊等等。而一架先进的飞机,一台人造卫星就可能包含着几十套嵌入式系统和上百台微型嵌入式计算机,没有这些装载,飞机和卫星的控制系统就不能有效地工作,它们的导航系统就不能满足严格的要求。 在通信领域也有着数不胜数的嵌入式系统的应用,由于带宽网络的发展,交换机、路由器和各种传输设备等都逐渐需要更多的嵌入式系统来满足它们互联的需求,而这些基于32位的嵌入式系统品种多样,绝大多数都价格低廉,能够为企业和家庭的网络选择提供更加廉价而多样的方案。 一、嵌入式系统的介绍 1、嵌入式系统的概念: 上世纪的40年代人类社会诞生了当时最伟大的发明之一——计算机。1946年宾夕法尼亚大学研制出了世界上第一台计算机“ENIAC”,吹响了人类向信息时代进发的号角。如今半个多世纪过去了,总体来看,计算机已经经历了两个大的发展阶段:大型计算机阶段和个人中小型计算机阶段。而今后,计算机技术将迈入下一个充满机遇和挑战的新阶段—— “无处不在的计算机”阶段,即“后PC发展阶段”。“无处不在的计算机”是指在数以千计乃至万计的计算机之间彼此相互关联,其与使用者的比例高达100%,这些计算机中包括有传统的通用式计算机和嵌入式计算机,而后者占绝大多数,可以达到95%的比例。 施乐公司研究中心的主任Mark Weiser 认为:“以长远的发展来看,PC和计算机工作站将逐渐衰落,因为计算机将会变得无处不在,它们会在墙上,在手腕上,在口袋里等等,计算机将会像手写纸一样,随用随取,伸手可得。” 目前全世界范围的计算机研究者都在逐步形成一种共识,那就是在计算机将来的发展中,它必然不会成为像科幻电影中的那种会背叛人类,伤害人类的机械怪物,恰恰相反它们将变得小巧玲珑而且无处不在。它们会出现在任何你能看的见、听得到、摸得着的地方,功能强大而且随处可用,这就是“无处不在的计算机”。 嵌入式计算机系统就是所谓的“看不见的计算机”,一般情况下它只是运行平台,并不能作为独立的开发平台来使用。而且它不能够被用户编程,对用户的I/O接口是专用的。所以不严谨地说:任意包含可编程计算机的设备而且这种设备不是作为通用计算机而设计的都可以称作嵌入式系统。 时至今日嵌入式系统已经逐渐渗透到人们的日常生活中,但因为其不同的应用形式和相异的名称,目前对嵌入式系统还没有一个统一的定义。但一般认为,它有以下概念: (1)嵌入式系统的中心是应用功能,基础是计算机技术,其软件和硬件可以裁剪,对应用系统的功能、可靠性、成本、体积大小和功率损耗都有十分严格的要求和指标。 (2)国际电气和电子工程师协会认为嵌入式系统的定义是“Device used to control, monitor, or assist the operation of equipment , machinery or plants.” (3)嵌入式系统是计算机技术、半导体技术、电子技术等与各个行业的具体应用相结合后的产物,是一个技术集中、资源集中、应用高度分散、技术不断革新的集成系统。 2、嵌入式系统的特点: 1)嵌入式系统通常都是多样的有特定应用功能的软硬件综合体,用于特定的任务,其硬件和软件设计都是高效而简洁的。其中嵌入式软件的应用程序和操作程序是一体化的,不同于传统的通用计算机操作系统和应用程序有着分明的界限。 2)嵌入式系统能够受到多个处理器和体系结构的支持,不同于通用的计算机只能够使用少数的处理器类型和体系结构。目前已经生产有上千种嵌人式微处理器和几十种微处理器的体系结构,其中比较主流常见的有ARM,MIPS, PowerPC,X86和SuperH等。 4)嵌入式系统有实时性和可靠性的特点,其主要表现在:目前绝大多数实时操作系统都是嵌人式系统;嵌人式系统都有实时性的要求,其软件通常都是固化或直接加载到内存中运行的,启动十分快速 另外,嵌人式系统通常都有处错能力和自动复位的功能,目前在绝大多数嵌式系统中都包含着用于保证系统运行可靠性的软硬件处理机制,比如看门狗定时器和内存保护重启机制等。 5)嵌入式系统通常都使用可以适应多种类型处理器、可裁剪量轻、实时性和可靠性高以及可以固化的。同嵌入式微处理器,嵌入式的操作系统也是多种多样的,不仅可以支持多种处理器,还可以进行裁剪量轻来匹配应用的功能,而且规模较小,能够节省资源等等。 二、嵌入式系统的发展和应用 第一代电子计算机体积大,耗电快,而且可靠性和实时性都无法满足嵌入式计算的要求。到了20世纪60年代,由晶体管、磁芯存储制造的第二代计算机开始用于航海航空等领域,它的CPU能够处理从电子系统传来的信号,具有了数据总线的一些基本特性。而与此同时,嵌人式计算机也逐步应用于工业和制造等方面。 至60年代末,采用集成电路的第三代计算机问世,1965年发射Gemini3号是人们第一次使用机载数字计算机。而后的阿波罗探测飞船则使用了嵌人式计算机系统来提供和保障人机的交互功能来用于引导飞行。1963年DEC公司推广了第一台商用小型机,它具有嵌入式系统的结构,具备单总线结构、高速寄存器和实时性、可靠性强的中断系统以及交叉存取功能,标志着嵌入式系统的兴起。 1971 年,英特尔公司成功推出了世界上第一片微处理器Intel 4004。它的体积小、质量轻、价格实惠、使用方便,在当时销量很好,Intel公司将它进一步改进后推出了4位的微处理器4040和8位的8008。 1973-1977 年短短四年之间全球许多厂家推出了各种各样的8位微处理器,其中比较流行的有英特尔公司的8080/ 8085系列,摩托罗拉公司的6800/6802系列,齐洛格公司的Z80和罗克韦尔公司的6502等。这些微处理器的广泛应用为嵌入式系统开辟了广阔的市场,促成了嵌入式系统的快速发展。计算机厂商开始以插件的形式为用户提供所需的OEM产品,并构成符合用户要求的微型控制计算机,嵌入到系统设备中。 嵌入式系统的大发展还要归功于20世纪80年代软件技术的进步。最初的嵌入式计算机的软件都是十分专用的,其程序也只能用汇编语言来编写,因此嵌入式系统的开发周期过长,效率太低,不利于广泛地推广和应用。得益于微电子技术的进步,嵌入式计算机的软件开发不再局限于汇编语言,可以使用C或PL等高级语言,是编程更加多样和简洁化,加快了嵌入式系统的开发效率。时间步入20世纪90年代,当时对分布控制、柔性制造和数字通信电等技术有着巨大需求,而这种需求也刺激着嵌人式系统的软硬技术的革新和发展,促进了嵌入式系统的应用扩大化。 如今,嵌入式系统经过半个多实际的发展和革新,在各个产业都可以看见它的身影。在电子消费领域,它已经广泛应用于手机、VCD、数字电视和路由器等常见家用电器和电子产品,或许在你的家里有着几十甚至几百个微型嵌入式计算机无时无刻地不在为你服务。 在工业控制方面,一辆豪华轿车的控制系统就包含着至少50个嵌入式微处理器,它们分布于火花塞、传动轴和安全气囊等等。而一架先进的飞机,一台人造卫星就可能包含着几十套嵌入式系统和上百台微型嵌入式计算机,没有这些装载,飞机和卫星的控制系统就不能有效地工作,它们的导航系统就不能满足严格的要求。 在通信领域也有着数不胜数的嵌入式系统的应用,由于带宽网络的发展,交换机、路由器和各种传输设备等都逐渐需要更多的嵌入式系统来满足它们互联的需求,而这些基于32位的嵌入式系统品种多样,绝大多数都价格低廉,能够为企业和家庭的网络选择提供更加廉价而多样的方案。 时至今日,嵌入式系统的应用已经从微至著,广泛分布。但它还在不断地更新发展,其构成的计算机也会变得更小巧,更灵敏,更高效,更智能,相信在未来的某一天,会如Mark Weiser所说的那样:“它们会在墙上,在手腕上,在口袋里,就像手写纸一样,随用随取,伸手可得。” 三、总结和心得 嵌入式系统作为一门计算机开发的学科,有着不同于传统通用计算机系统的特点和概念,具有独特长处。同时它的应用遍布于电子消费、通信工程、工业控制和军事国防等多种领域,其发展前景是非常广阔的,是一门十分值得深入学习和研究的学科。 通过一个学期的学习,我了解了许多嵌入式实时操作系统的应用知识,比如“任务的管理和调度”、“同步、互斥与通信”以及“中断和时间管理”等全新的理论知识,同时也通过多次的实验操作理解了对嵌入式系统软硬件工作方式和应用。所谓温故而知新,通过撰写课程报告,我对嵌入式系统的各个方面有了新的了解,大大提高了对这门学科的兴趣,在今后的学习中,我也会更加深入地去学习这门课程的相关内容,丰富自己的知识领域,开阔眼界,掌握更多的技能,为自己将来的发展做好铺垫。 参考文献: 甄鹏------《嵌入式实时Linux的移植及应用技术的研究》2008,(02) 郭军------《基于Petri网的嵌入式系统高层级设计方法与技术研究》2007,(04) 吴敏------《基于嵌入式的家庭网关控制平台的研究与设计》2007,(05) 刘青云;焦铬-------《嵌入式Web Service模型实现及应用》2019,(01) 田婧---------《嵌入式μCOSⅡ在DSP中的移植与应用研究》2007,(04) 附录 附查重报告: 第1章 1.嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。嵌入式系统一般有3个主要的组成部分:硬件、实时操作系统以及应用软件。 2.嵌入式系统的三要素是嵌入、专用、计算机;即以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 3.目前国际较为知名的有:VxWorks、NeutrinoRTOS、Nucleus Plus、OS/ 9、VRTX、LynuxOS,RTLinux、BlueCat RT等。 4.嵌入式系统一般由硬件层、中间层、软件层和功能层组成。其作用分别如下: (1)硬件层 :由嵌入式微处理器、外围电路和外设组成。操作系统和应用程序都可以固化在ROM或者Flash中。为方便使用,有的模块在此基础上增加了LCD、键盘、USB接口,以及其他一些功能的扩展电路。 (2)中间层 :硬件层与软件层之间为中间层,其作用将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关; (3)软件层 :主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。操作系统是一个标准的内核,将中断、I/O、定时器等资源都封装起来,以方便用户使用。(4)功能层 :由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。5.非占先式调度法也称作合作型多任务(cooperative multitasking),各个任务彼此合作共享一个CPU。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。当系统响应时间很重要时,要使用占先式(preemptive)内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了。6.在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称硬实时系统。在弱实时系统中,超时却不会发生致命的错误。其实时性的要求比硬实时系统要差一些。 7.嵌入式系统的设计步骤及各部分的主要工作如下。(1)需求分析阶段,罗列出用户的需求; (2)体系结构设计阶段,描述系统的功能如何实现; (3)详细设计阶段,进行硬件系统与软件系统的分类划分,以决定哪些功能用硬件实现,哪些用软件实现; (4)系统集成,把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进在设计过程中的错误; (5)系统测试,对设计好的系统进行测试,看其是否满足给定的要求。8.Linux作为嵌入式操作系统的优势主要有以下几点: (1)可应用于多种硬件平台。 (2)Linux的高度模块化使添加部件非常容易。 (3)Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件的一种通用操作系统。 (4)Linux可以随意地配置,不需要任何的许可证或商家的合作关系。 (5)Linux带有Unix用户熟悉的完善的开发工具。其强大的语言编译器GCC,C++等也可以很容易得到,不但成熟完善,而且使用方便。9. Linux执行进程调度一般是在以下情况发生的:(1)正在执行的进程运行完毕; (2)正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态;(3)正在执行的进程调用了P原语操作,从而因资源不足而被阻塞;(4)执行中的进程提出I/O请求后被阻塞;(5)系统分配的时间片已经用完; (6)就绪队列中的某个进程的优先级变得高于当前运行进程的优先级。 第4章 1、Linux 内核的编译菜单有好几个版本,运行: (1)make config:进入命令行,可以一行一行的配置,但使用不十分方便。 (2)make menuconfig:大多数开发人员使用的Linux 内核编译菜单,使用方便。 (3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。 2、在完成内核的裁减之后,内核的编译就只要执行以下几条命令: make clean 编译内核之前先把环境给清理干净。make dep 编译相关依赖文件 make zImage 创建内核镜像文件 make modules 创建内核模块。 make install 把相关文件拷贝到默认的目录。 3、此命令是装载压缩映像文件zImage到flash存储器中,地址是kernel分区,并采用xmodem传输协议。 4、此命令是设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0。 5、此命令将nfs服务的共享目录sharedir加载到/mnt/nfs。 6、此命令是装载根文件系统root.cramfs到flash存储器中,地址是根文件系统分区,并采用xmodem传输协议。 7、这个命令的操作同时进行了分区和格式化,0~128K存放vivi,128K~192K存放VIVI控制台指令,192K~1216K存放kernel,1216K~4288K存放root,其余部分存放应用程序。 第6章 1.使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。2.进程内存区域涉及到5种数据段,即: ①代码段:代码段是用来存放可执行文件的操作指令。 ②数据段:数据段用来存放可执行文件中已初始化全局变量。③BSS段:BSS段包含了程序中未初始化的全局变量。④堆(heap):用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。 ⑤栈:栈是用户存放程序临时创建的局部变量。3.在Linux系统中,内核在最高级执行,也称为“系统态”,在这一级任何操作都可以执行。而应用程序则执行在最低级,即所谓的“用户态”。在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间”中运行的。它们分别引用不同的内存映射,也就是程序代码使用不同的“地址空间”。4.共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。5.内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。 第9章 1.参考答案: Mutex互斥量,用于操作某个临界资源时对该资源上锁,以实现互斥地对独占资源的使用。Semophore信号灯,信号灯内有一计数器,可以用于对多个同类资源的分配。 Condition条件变量,条件变量用于等待信号。当一个线程需要等待某个信号时,就可到条件变量上等待,当信号具备时,系统会唤醒该线程继续运行。2.参考答案: 本地:共享内存+信号量,适合于大量数据传输。Linux支持系统V和POSIX的共享内存和信号量。(5分) 远程:Socket+应用协议。适合于跨网络的(大量)数据传输。Linux支持BSD的socket。应用层协议需要自行设计。(5分) 3.答案要点:程序是编译后形成的可执行代码,是静止的。进程是程序的一次执行,是活动的。线程是进程的可执行单元,同一进程的不同线程共享进程的资源和地址空间。4.两种实现方法,一种是继承Thread,另外一种是实现接口Runnable。 同步的实现方法有两种,分别是synchronized, wait与notify。用synchronized可以对一段代码、一个对象及一个方法进行加锁。用wait与notify可以使对象处于等待及唤醒方式导致同步,因为每个对象都直接或间接的继承了Object类。 5、什么是BootLoader?主要有几种工作模式及主要功能是什么? 答: Bootloader就是操作系统内核运行的一段小程序,完成进行初始化系统硬件设置的任务,(2分) 分为启动加载模式和下载模式。(1启动加载模式 启动加载(Boot laoding)模式是指 Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。(2分)(2)下载模式 在下载模式下,目标机上的 Bootloader 将先通过串口连接或网络连接等通信手段从宿主机下载文件。(2分) 6、简述Bootloader有何作用? 答案要点:(1)首先,bootloader是在特定硬件平台运行的程序,严重依赖于硬件平台,需要移植;(2)是系统上电之后,第一个运行的程序,系统在上电或复位时通常都从地址 0x0 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序;(3)bootloader程序的设计目标是启动嵌入式操作系统,嵌入式操作系统的启动需要一定的条件,这些条件由bootloader来满足;(4)Bootloader一般具有对存储器和网络接口操作的功能;如擦除、读写Flash,通过USB、串口下载文件等第二篇:操作系统重点总结
第三篇:嵌入式操作系统实验报告
第四篇:嵌入式操作系统课程报告
第五篇:嵌入式Linux实时操作系统习题总结