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