电子科技大学微机课程组嵌入式系统设计实验指导书2015年9月1目录第一部分嵌入式系统仿真实验系统简介1第一节、开发平台软件资源及文档1第二节、开发平台软件安装1第二部分实验项目说明2第一节、实验项目列表2第二节、实验项目使用建议2第三部分嵌入式开发系统实验案例指导3实验一、多任务程序的建立和运行3一.实验目的3二.实验内容3三.预备知识3四.实验设备与工具3五.实验原理与说明3六、实验步骤4七、思考题8实验二、基于操作系统的任务调度和进程管理9一.实验目的9二.实验内容9三.预备知识9四.实验设备与工具9五.实验原理与说明9六、实验步骤10七、思考题121第一部分嵌入式系统仿真实验系统简介以VC++6.0为实验基础软禁平台仿真模拟在uC/OS嵌入式操作系统系统环境下多任务程序的运行和调试,使学生可以在一个纯软件的环境中了解、熟悉嵌入式软件的运行和调试方法。第一节、开发平台软件资源及文档1)VC6.0集成开发环境;2)配套实验指导书的实验源代码,分为两类:仿uc/OS部分和任务程序部分3)实验环境的工程文件4)实验指导书;第二节、开发平台软件安装1、编译调试环境的安装在XP平台下安装VC6.0;2、实验文件拷贝把实验文件拷贝d:\ucosexperiment目录下2第二部分实验项目说明第一节、实验项目列表表1列出了本指导书提供的所有实验项目。表1实验项目列表项目编号实验项目课时数实验性质项目类别实验环境1多任务程序的建立和运行4软件验证Windows2基于操作系统的任务调度和进程管理4综合实验分为两种种类别:验证性实验,综合设计实验。验证实验:本系列实验的基础部分,属于必做内容;综合设计实验:让使用者在相关的软件环境下实现按实验要求修改相应的软件实现相应的功能。第二节、实验项目使用建议本实验共提供2个实验项目,可以根据同学个人兴趣和具体的实验情况来进行选择,每一组实验基本涵盖本实验课程要求学生掌握的技能,包括C语言基础、应用程序编程等内容。3第三部分嵌入式开发系统实验案例指导实验一、多任务程序的建立和运行一.实验目的1、熟悉VC6.0开发运行环境。2、熟悉VC6.0开发运行下的程序编译、链接、调试,包括单步、断点调试方法。3、感受多任务并发程序执行的特点以及其和单任务的运行调试区别。4、了解系统任务的建立及任务阻塞的实现。二.实验内容1、熟悉VC6.0集成环境下的工程创建、打开2、熟悉VC6.0集成环境下的工程的编译和链接3、熟悉VC6.0集成环境下的工程的运行和调试4、了解操作系统启动的初始化过程5、利用阻塞方式对任务进行调度6、任务的分时运行和系统调度的关系三.预备知识1、了解C语言知识。2、了解软件的编译知识。3、掌握操作系统任务调度和运行的原理四.实验设备与工具硬件:PC机Pentium100以上。软件:PC机WINDOWS操作系统+VC6.0+实验软件五.实验原理与说明1.程序的多线程运行嵌入式系统软件多线程程序作为一种多任务、并发的工作方式,有以下的优点:1)提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操4作,而使用多线程技术,将耗时长的操作(timeconsuming)置于一个新的线程,可以避免这种尴尬的情况。2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。2、阻塞式任务延迟和任务运行状态的关系1)在多任务环境下,任务的执行延迟采用阻塞式延时,这样可以把CPU从当前任务的等待过程中释放出来让其它任务继续执行,从而可以提高CPU的利用率。2)通过阻塞式延时可以实现任务的人为调度,即当某一个任务的阶段性工作完成后可以主动释放CPU的控制权3、试验中所使用到的系统函数说明1)INT8UOSTaskCreate(void(*task)(voidp_arg),/*任务代码入口地址*/voidp_arg,/*任务参数*/OS_STKptos,/*任务堆栈栈顶*/INT8Uprio)/*任务优先级*/任务创建函数,任务在创建后就准备好了运行需要的各种数据结构。2)voidOSStat(void)多任务启动函数,使创建的任务运行起来。3)voidOSTimeDly(INT32Uticks)/*任务要阻塞的时间*/任务阻塞函数,用于把任务阻塞一段时间六、实验步骤1、VC开发环境的熟悉1)将包含全部实验代码的压缩文件解压缩2)将VC6开发环境打开3)打开ucosexperiment目录下的ucos_vc.dsw4)用全部编译(rebuildall)编译程序,运行程序,根据窗口提示输出,获得感性认识!5)VC环境下,在工程上点鼠标右键,查看工程的设计6)打开main.c,编辑使#defineExperiment1,使用REBUILDALL进行编译,找到可执行文件的输出目录,记录下来7)使用菜单或快捷按钮再次执行编译好的程序。查看运行结果并记录,查5看main.c及usercode.c,分析main.c及usercode.c代码。8)说明任务堆栈的定义位置,任务在什么时候被创建,任务在什么时候获得运行。9)自己修改代码,减少延时时间,或将每次加1改为其他算法,查看效果。10)在usercode.c中的printf(“welcometoembededsystem\n”);处设置断点。(设置断点,在代码处按右键,insertbreakpoint)11)按F5以调试模式运行代码12)当到设定的断点处停下时,将VC窗口缩小,调整输出的窗口使两个窗口同时显示在屏幕上13)按F10单步执行,查看输出14)发现在延时代码循环中无法调试,在printf(“j=%d\n”,j++);加断点,按F515)在观察窗口watchwindow输入j,连续按F5查看j的变化和屏幕的输出。616)按SHIFT+F5或使用菜单结束调试,记录2、任务的创建过程1)去掉前面的断点,找到main.c中OSTaskCreate(FirstTask,0,&TaskStk[5][TASK_STK_SIZE-1],5);函数,设置断点,并按F5调试运行,运行代码的时候输入1,在运行到断点时,按F11追进函数内部,再按F10单步运行,与书上51页进行比较。2)画出该函数运行完成后的就绪表和就绪组,任务控制块空闲链表和任务链表。3)记录所有过程,说明OSTaskCreate都做了哪些工作,任务FirstTask的任务控制块实体是什么,在创建结束时其任务控制块的内容又是什么。记录下来。4)试着自己编写一个带输出的简单的函数,然后使用OSTaskCreate创建这个函数,修改MAIN.c,在输入1的时候创建这个函数。自己编写的函数保存在usercode.c中,并注意在usercode.h中添加函数声明。修改完成后重新编译执行。3、操作系统初始化1)找到操作系统初始化函数OSInit,在其中设置断点,并按F5调试运行,观察OSInit执行的过程,记录OSINIT都做了什么工作2)画出OSINIT后的就绪表和就绪组,任务控制块空闲链表和任务链表3)记录所有过程,说明OSINIT之后系统的状况4、任务的阻塞和调度1)不改动代码,输入参数1,全速运行,打开任务管理器,查看,如图72)修改代码,使用阻塞式延时3)重新编译,运行。使用任务管理器查看系统利用率4)编译运行代码,输入选项2运行程序5)运行查看结果86)查看代码,说明为什么得到这样的运行结果7)修改usercode.c中E2_task2函数,要求其输出值增长速度只有E2_task1的1/2,修改后重新编译运行8)改变任务的优先级,让E2_task1的优先级为6,E2_task2的优先级为5,查看运行结果,说明输出的不同之处,说明原因七、思考题1、多任务程序的断点调试和单任务相比有什么不同2、阻塞式延时和循环延时有何区别3、怎么调试程序9实验二、基于操作系统的任务调度和进程管理一.实验目的1、了解任务控制块在任务管理中的作用2、了解任务三种状态的切换过程3、了解多任务程序的启动机制4、了解信号量和消息机制在多任务通信中所起的作用。二.实验内容1、任务堆栈和多任务切换2、理解多任务的启动3、任务的挂起和恢复4、信号量和消息在任务通讯中的使用三.预备知识1、了解C语言知识。2、了解软件的编译知识。3、掌握操作系统任务调度和运行的原理四.实验设备与工具硬件:PC机Pentium100以上。软件:PC机WINDOWS操作系统+VC6.0+实验软件五.实验原理与说明1.进程控制块进程控制块是保存进程状态,控制进程转换的标志。它和其它相关的表格(如进程队列、存储分配表等)是记录进程从创建到消亡这个活动期中,各种状态变化的重要数据结构,也是进程存在的唯一标志。操作系统通过进程控制块来管理和控制进程。2、进程的表示与状态进程在运行中的交替,使它的运行状态不断发生变化,操作系统中进程的状态有许多种,但最基本的有三种,就绪、运行和阻塞。就绪态:已经获得除CPU以外的所有运行所需要资源,只要获得处理器就可以运行10运行态:处于就绪态的进程获得处理器资源后进入到执行状态的进程阻塞态:正在运行的进程,因某种原因而暂停运行,等待某个时间发生。3、进程的协调与通讯进程间的协调可以通过信号量的方式实现,通过信号量可以实现进程间的同步、互斥或前驱等操作。此外,通过消息机制可以实现进程间的通讯和触发,消息通讯机制是进程通讯所常用的一种方式。六、实验步骤1、任务堆栈和任务切换1)使用原始代码2)查看在main.c,说明两个用户任务的堆栈都是什么,堆栈的地址是怎么传递给任务创建函数的。3)在OS_Sched函数中设置断点。跟踪调试,说明OS_Sched实现了哪些功能,画出流程图4)继续调试OS_TASK_SW,论述压栈和退栈的处理过程。2、多任务的启动1)使用原始代码2)查看在main.c,在OSStart();处设置断点。3)调试模式运行,跟踪进OSStart,然后单步运行。参考P83-85分析代码。4)画出OSStart流程图5)说明OSStart的功能,说明多任务启动的标志是什么3、任务的挂起和恢复1)编译运行代码,输入选项3继续运行程序2)运行查看结果113)查看代码,说明为什么得到这样的运行结果4)对任务代码进行修改,得到不同的结果5)改变任务的优先级,查看运行结果,说明输出的不同之处,说明原因4、了解信号量和消息机制在多任务通信中所起的作用1)打开原始工程运行代码,输入选项4继续运行程序)运行查看结果)说明使用信号量实现的功能,为什么能实现这样的功能,都使用了哪些数据结构4)在usercode.c中编写三个函数,并修改usercode.h中的声明,修改main.c,重新编译查看效果)5)重新程序运行后,输入5选择例子程序56)重新编译运行,查看结果7)说明使用互斥信号量实现的功能,为什么能实现这样的功能,都使用12了哪些数据结构。8)说明为什么解决了优先级反转的问题9)自己设计一个使用时间标志组的例子,编程实现并运行,记录结果。10)重新运行程序后,输入8选择例子程序811)重新编译运行,查看结果12)说明使用消息队列实现的功能,为什么能实现这样的功能,都使用了哪些数据结构。13)在usercode.c中编写三个函数,并修改usercode.h中的声明,修改main.c,重新编译查看效果七、思考题1、任务控制块是如何实现的2、信号量的使用方式3、任务间的消息发送的实现方式