




免费预览已结束,剩余12页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统光电 学 院形 式开卷闭 卷09/10 级 研究生密编 号:考试日期: 年 月 日印刷份数: 份 上 海 理 工 大 学研 究 生 试 题 2011 / 2012 学年第 1 学期课程名称: 嵌入式系统 教 师 签 章: 年 月 日教研室主任审查意见: 签 章: 年 月 日1.试题原稿请于考试前2周送研究生部。2.编号栏由研究生部填写。17共 16 页第 1 页上海理工大学研究生课程试题*注:内容一律用黑色墨水书写或计算机打印,以便复印。2011 /2012 学年第 1 学期 考试课程 嵌入式系统 学 号 112370392 姓 名 黄诚 得 分 试题一(20分) 试题一 答:问题1: 临界资源是指每次仅允许一个进程访问的资源。主要包括特定的外设、共享内存及CPU。在大多数情况下,诸进程间应采取互斥方式,实现对这种资源的共享。临界区内的数据一次只能同时被一个进程使用,当一个进程使用临界区内的数据时,其他需要使用临界区数据的进程进入等待状态。 问题2: 代码一所示方法能够实现共享资源的互斥访问,当有任务1正在访问临界资源时,对应标志flagother_task_id为1,现在又任务0需要访问临界资源时,调用函数Enter_Criticl_Section(0,1),而由于while(flagother_task_id=TRUE)为真,进入循环等待状态,直到任务1结束,调用Exit_Criticl_Section(0,1)置任务1标志flagother_task_id为0,释放临界资源,这时任务0才能访问临界资源,所以该方法能够实现共享资源的互斥访问。问题3: 繁忙等待策略及当一个进程想要进入它的临界区时,首先检查一下是否允许它进入,若允许,就直接进入了;若不允许,就在那里循环地等待,一直等到允许它进入。缺点:a.浪费CPU资源 b.可能导致无法预料的结果,如一个低优先级进程位于临界区中,而这时有一个高优先级的进程也试图进入临界区,会产生无法预料的后果。问题4: 若所指两条代码交换位置,当任务1正在使用共享资源时,现在任务0也要访问临界资源,调用函数Enter_Criticl_Section(0,1),首先就将任务0标志置1,让其同时也去访问临界区,会出现不可预料结果,使系统处于不安全状态,甚至出现死锁现象,不能实现共享资源的互斥访问。试题二(30分) 选择一个嵌入式系统产品(如手机、PDA、工业控制产品、智能家用电器等)利用学过的知识,假设你是系统的总设计师,那么你认为应该如何运作这个产品的开发,直到把产品从实验室推向市场。 提示:题目较大,嵌入式系统开发包括需求分析、设计、实现、测试等方面。在实现方面,不必把产品开发出来(即不必设计电路图,不必编写程序代码,只需概括地写出软件硬件需要完成的工作即可)。试题二 答: 本次嵌入式产品我 以GPS 全球定位系统为例简述嵌入式系统产品的开发流程:一 需求分析:使用户和设计者有效交流、沟通,明确设计目标;设计者设计什么?有哪些要求?用户将得到的系统是什么样的?具体有哪些功能性需求,如输入、输出、功能;以及非功能性需求,如GPS导航仪的可靠性、速度、功耗、成本、大小、重量、设计时间等。最后对需求进行提炼,形成规格说明书。二 系统结构设计:a) 系统分析b) 系统软硬件整体结构的设计c) 软硬件划分:设计中涉及硬件、软件部件,必须决定什么功能由硬件实现或软件实现,硬件和软件具有双重性,需考虑软硬件变动对系统的决策造成的影响。GSM定位系统由软件实现部分:操作系统功能,包括任务调度,资源管理,设备驱动等;TCP/IP协议栈;以及加密/解密、编码/解码、压缩/解压等算法;导航仪上相关应用软件等。d) 软硬件平台及开发环境的确定: 包括:处理器、硬件部件、操作系统、编程语言、软件开发工具、硬件调试工具、软件组件等的选择。处理器的选择往往同时会限制操作系统的选择,操作系统的选择又会限制开发工具的选择。1.处理器选择:需考虑处理器的性能、技术指标、功耗、软件支持工具、处理器是否内置调试工具、供应商是否提供评估板以及生产规模、软件对硬件的依赖性。2.操作系统选择:主要考虑操作系统本身所提供的开发工具、操作系统向硬件接口移植的难度、操作系统的内存要求、开发人员是否熟悉此操作系统及其提供的API、操作系统是否提供硬件的驱动程序、操作系统的是否具有可剪裁性、操作系统的实时性能、收费情况,技术支持情况等。3.编程语言选择:主要考虑以下因素,通用性、可移植性程度、执行效率、可维护性。4.硬件调试工具选择:选择JTAG仿真器,是目前使用最广泛的调试手段。5.集成开发环境IDE选择:集成开发环境IDE考虑以下因素a.系统调试器的功能b.支持库函数与选择硬件和操作系统的原则一样:除非必要,尽量采用标准的 glibcc.编译器开发商是否持续升级编译器d.连接程序是否支持所有的文件格式和符号格式e) 标准构件和自行设计构件的确定,包括:a. 标准构件和自行设计构件b. 标准硬构件:RAM, ROM, 接口控制器,ASIC,CPU核,GPRS模块,GSM模块,蓝牙模块等。c. 标准软构件:OS/RTOS,协议栈,图形开发包,驱动程序。d. 自研硬构件:逻辑电路的实现,包括PCB,IC(PLD FPGA ASIC,)EDA设计工具:板极:原理图设计工具,PCB设计工具IC:硬件描述语言VHDL,Veriloge. 自研软构件:驱动程序,应用程序等。f. 构件的选择:授权构件的费用一般都较高,但大都经过严格的测试,可靠性高,调试时间短,而免费构件相反;现在也有一些免费的自由(软件)构件,它们的性能、可靠性也很好,因此在构件选择的时候要加以权衡,确定哪种方案更好。三 构件设计与实现:a) 硬件构件设计实现包括:a. 设计硬件子系统功能:电源子系统;最小系统;复位电路b. 定义硬件子系统间接口c. 确定硬件各子系统原理图d. 硬件子系统布版e. 硬件子系统测试b) 软件构件设计实现包括:a. 设计软件构件功能b. 定义软件构件接口c. 规定构件之间的调用关系d. 规定软件构件出错处理方案四 系统集成、测试与验收:a) 系统集成a. 系统集成:把系统的软件、硬件集成在一起,进行调试,发现并改进构件设计过程中的错误;b. 集成可分两步:1. 在宿主机上模拟集成(软集成)2. 在目标机上集成c. 各构件设计阶段尽可能地按阶段组装系统和相对独立地测试系统功能;d. 如果每次只对一部分模块排错,很可能更容易发现和识别简单的错误;b) 系统测试a. 系统测试:对系统进行测试,看是否满足规格说明书中给定的功能要求;b. 选择测试实例:1. 功能测试:极限情况测试、边界测试、异常测试、错误测试、随机测试、性能测试2. 覆盖测试:语句测试、判定或分支覆盖、条件覆盖3. 灰盒测试c) 系统验收a. 系统经过测试,确定实现规格说明书功能时停止测试;b. 整理开发文档和资料,提交开发报告;c. 组织系统验收,开发结束 试题三(50分) 1、 选择或熟悉一种嵌入式操作系统,写一个嵌入式应用软件的框架,要求使用嵌入式操作系统常用的系统调用。提示:1)本题目的工作量比较大一些,通过本题目的训练,可以掌握嵌入式操作系统的使用和开发方法; 2)设计多个任务,数量自定; 3)使用邮箱、队列、管道等任务间通信方式; 4)使用信号量semaphore,事件(组)event group,信号signal等任务间的同步方式; 5)使用定时器; 6)程序中使用内存分区。试题三 答:嵌入式操作系统体系结构:本题我选用嵌入式Linux操作系统为平台,实现题目要求的功能。以下是各个部分的功能实现:1、使用管道进程间通信建立pipe.h文件,实现父进程写(键盘输入的字符),子进程读的功能。(1)、pipe.h #includestdio.h#includestdlib.h#includestring.h#includesys/types.h#includeunistd.h#define BUF_SIZE 256void read_from_pipe(int fd) char messageBUF_SIZE; read(fd,message,100); printf(read from pipe:%s,message); void write_to_pipe(int fd) char message256; printf(please input data:); fgets(message,BUF_SIZE,stdin); write(fd,message,strlen(message)+1);(2)、pipe.c#includepipe.h#define stat_val 10int main(void) int fd2; pid_t pid; if(pipe(fd)=-1) printf(create pipe error!n); exit(1); pid=fork(); switch(pid) case -1: printf(fork error!n); exit(1); case 0: /*enter the child process*/ close(fd1); read_from_pipe(fd0); exit(0); default: /*in the parent process*/ close(fd0); write_to_pipe(fd1); wait(stat_val); exit(0); return 0; 2、使用信号量与共享内存的进程间通信和进程间同步功能。(1)、msg.h 信号量与共享内存库函数文件#include #include #include #include #include #include #include #define SHM_SIZE 1024union semun intval; struct semid_ds*buf; unsigned short*array;/*创建信号量函数*/int createsem (const char * pathname, int proj_id, int members, int init_val) key_tmsgkey; intindex, sid; union semunsemopts; if (msgkey = ftok(pathname, proj_id) = -1) perror (ftok error!n); return -1; if (sid = semget (msgkey, members, IPC_CREAT | 0666) = -1) perror (semget call failed.n); return -1; /*初始化操作*/ semopts.val = init_val; for (index = 0; index members; index+) semctl (sid, index, SETVAL, semopts); return (sid);/*打开信号量函数*/int opensem(const char * pathname, int proj_id) key_tmsgkey; intsid; if (msgkey = ftok(pathname, proj_id) = -1) perror (ftok error!n); return -1; if (sid = semget(msgkey, 0, IPC_CREAT | 0666) = -1) perror(semget call failed.n); return -1; return (sid);/*P操作函数*/int sem_p(int semid, int index) struct sembuf buf = 0,-1,IPC_NOWAIT; if (index 0) perror(index of array cannot equals a minus value!); return -1; buf.sem_num = index; if (semop (semid ,& buf,1) = -1) perror (a wrong operation to semaphore occurred!); return -1; return 0; /*v操作函数*/int sem_v (int semid, int index) struct sembuf buf = 0, +1, IPC_NOWAIT; if (index 0) perror(index of array cannot equals a minus value!); return -1; buf.sem_num = index; if (semop (semid,& buf,1) = -1) perror (a wrong operation to semaphore occurred!); return -1; return 0; /*删除信号集函数*/int sem_delete (int semid) return (semctl(semid, 0, IPC_RMID);/*等待信号为1*/int wait_sem( int semid, int index) while (semctl (semid, index, GETVAL, 0) = 0) sleep (1); return 1 ;(2)、shm.h共享内存函数库#include #include #include #include #include #include #include /*创建共享内存函数*/int createshm( char * pathname, int proj_id, size_t size) key_tshmkey; intsid;/*获取键值*/ if (shmkey = ftok(pathname, proj_id) = -1) perror(ftok error!n); return -1; if (sid = shmget(shmkey, size, IPC_CREAT | 0666) = -1) perror (shmget call failed.n); return -1; return (sid); (3)、writer.c写进程函数#include sharemem.h#define SHM_SIZE 1024int main() int semid, shmid; char *shmaddr; char write_strSHM_SIZE; pid_t pid; if (shmid = createshm (., m, SHM_SIZE) = -1) exit(1); if (shmaddr = shmat (shmid, (char *)0, 0) =(char *)-1) perror (attach shared memory error!n); exit (1); if (semid = createsem (., s, 1, 1) = -1) exit (1); while (1) wait_sem (semid, 0); sem_p (semid, 0); /*P操作*/ pid=fork();printf (writer: );switch(pid) case -1: perror(create wrong pid !n); exit(1); case 0:/*子进程*/ sleep(2); printf(read from share memory by parent process! it is: %pn,write_str); default: /*父进程*/ fgets(write_str, 1024, stdin); int len =strlen (write_str)-1; write_strlen = 0; strcpy (shmaddr, write_str); sleep (1); /*使reader处于阻塞状态*/ sem_v (semid, 0); /*V操作*/ sleep (10); /*等待reader进行读(4)、reader.c读进程函数#include sharemem.hint main() intsemid, shmid; char*shmaddr;if (shmid = createshm(., m, SHM_SIZE) = -1) exit (1); if(shmaddr = shmat (shmid, (char *)0, 0) = (char *)-1) perror (attach shared memory error!n); exit (1); if(semid = opensem(. ,s) = -1) exit (1); while(1) printf(reader: ); wait_sem(semid,0);/* 等待信号值为1 */ sem_p(semid,0);/* P操作 */printf(%sn, shmaddr); sleep(10);/* 使writer处于阻塞状态 */sem_v(semid,0);/* V操作 */ sleep(10);/*等待writer写*/ 3、信号量与消息队列实现进程间通信与同步功能。 (1)、msg.h 共享内存库函数#include #include #include #include #include #include #include #define BUF_SIZE 1024/*创建消息队列函数*/int createmsg( char * pathname, int proj_id) struct mymsgbuf/*创建消息缓存结构*/ long msgtype; char ctrlstringBUF_SIZE; msgbuffer;key_tmsgkey;intmsgid;/*获取键值*/if (msgkey = ftok(pathname, proj_id) = -1) perror(ftok error!n); return -1; /*创建消息队列标识符*/if (msgid = msgget(msgkey,IPC_CREAT | 0666) = -1) perror (msgget call failed.n); return -1; return (msgid); /*发送消息队列函数*/int sendmsg(const char * pathname, int proj_id) int msglen; key_tmsgkey;intmsgid;struct mymsgbuf long msgtype; char ctrlstringBUF_SIZE; msgbuffer; msgbuffer.msgtype=3; fgets (msgbuffer.ctrlstring, BUF_SIZE, stdin); if (strncmp(exit, msgbuffer.ctrlstring, 4) = 0) msgctl(msgid,IPC_RMID,NULL); break; msgbuffer.ctrlstringstrlen(msgbuffer. ctrlstring)-1 = 0;if (msgsnd(msgid,&msgbuffer,BUF_SIZE,0) = -1) perror (Server msgsnd error!n); exit(1); return 1;/*接收消息队列函数*/int receivemsg(const char * pathname, int proj_id,int msgtype) int msglen; key_tmsgkey; intmsgid;/*创建消息缓存结构*/struct mymsgbuf long msgtype; char ctrlstringBUF_SIZE; msgbuffer; msglen = sizeof(struct mymsgbuf)-4;msgbuffer.msgtype=msgtype;if(msgrcv(msgid,&msgbuffer,msglen,msgtype,0)=-1) perror(receive message error!n); exit(1); return 0;(3)、server.c#includesem.h#includemsg.h#define index1 21 #define index2 20int main() int semid; int msgid; /*创建信号量函数*/ if (semid = createsem (., s, 1, 1) = -1)/*与头文件格式保持一致*/ exit (1); /*创建消息队列*/ if (msgid = createmsg (., m) = -1) exit (1); /* printf(msgkey is:%ldn,msgkey); printf(msgid is:%ldn,msgid);*/ while(1) printf(parent:); wait_sem(semid,0); sem_p(semid,0); struct mymsgbuf long msgtype; char ctrlstringBUF_SIZE; msgbuffer; msgbuffer
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年婴儿八级听力真题及答案
- 2025年氢能基础设施投资成本控制与回报分析报告
- 启东安全知识培训课件
- 陕西西安市2025年质量协会质量专业能力考试(六西格玛黄带)模拟试题及答案
- 2025年山东莱芜质量协会质量专业能力考试(六西格玛黄带)模拟试题及答案
- 电力行政执法试卷及答案
- 高考乐理模拟试题及答案
- 中职生实操测试题及答案
- 陕西省安全工程师安全生产:建筑施工扣件式钢管脚手架斜道施工要求考试试题
- 满分答案测试题及答案
- 2024年辽宁省地矿集团招聘真题
- 【《基于哈佛分析框架的爱尔眼科公司财务分析(数据图表论文)》13000字】
- 榆林市无人机管理办法
- 建筑公司安全管理制度范本
- 医保飞检培训
- 物流供应链融资方案计划书范文
- 2025年教学设计与评估能力考试试题及答案
- 亚朵酒店培训
- 医院医疗服务培训
- 农田植物养护方案(3篇)
- 破产清算审计管理制度
评论
0/150
提交评论