嵌入式程序设计复习题.doc
《嵌入式程序设计复习题.doc》由会员分享,可在线阅读,更多相关《嵌入式程序设计复习题.doc(156页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date嵌入式程序设计复习题ucos-ii操作系统练习题;一嵌入式系统程序设计练习题;1uC/OS-II是一个简洁、易用的 基于优先级的嵌入式抢占式多任务实时内核。2任务是一个执行体,包括:代码、控制块和任务堆栈。3.任务代码可是无返回的无穷循环,也可以是一次性代码,但最后一定要删除执行操作的一次性代码;4因为uc/os-ii总是运行进入就绪状态中任务优先级最高,下面该哪个任
2、务运行,这个工作就由调度器进行切换调度操作来完成的;5任务级的调度是由函数OSSched()和函数OSIntExt()完成6任务级的调度是由函数OSSched()完成的,而【 中断级 】的调度是由函数OSIntExt() 完成。对于OSSched(),它内部调用的是OS_TASK_SW()完成实际的调度;OSIntExt()内部调用的是OSCtxSw() 实现调度。7 任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的任务堆栈。(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到寄存器中。8任务的5种状态。【睡眠态(task dormat) 】:任务驻
3、留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。【运行态(task running)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。9【 不可剥夺型 】内核要求每个任务自我放弃CPU的所有权。
4、不可剥夺型调度法也称作合作型多任务调度法,各个任务彼此合作共享一个CPU。10当系统响应时间很重要时,要使用【 可剥夺型 】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。11使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【 互斥型信号量 】来实现。(可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢
5、失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。)12【 可重入型 】函数可以被一个以上的任务调用,而不必担心数据的破坏。13可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【 局部变量 】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【 保护 】。14每个任务都有其优先级。任务越重要,赋予的优先级应【 越高 】。15C/OS-初始化是通过调用系统函数【OSIint()】实现的,完成C/OS-所有的变量和数据结构的初始化。16多任务的启动是用户通过调用【OSStart()】实现的。然而,启动
6、C/OS-之前,用户至少要建立一个应用【任务】。17 C/OS-的参数配置文件名为【OS_CFG.H】。18 删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被C/OS-调用。19C/OS-要求用户提供【定时中断】来实现延时与超时控制等功能。20定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。21. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。22C/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的【等
7、待任务表】。 用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成【 1 】 ,这样C/OS-II才能支持信号量。23. C/OS-II中表示当前已经创建的任务数全局变量名为:【 OSTaskCtr 】。24. C/OS-II中表示当前内核运行的标记全局变量名为:【 OSRunning 】。25在使用OSTaskCreate创建任务时,若需要TaskData作伪参数传递给任务Task,并从任务Task中获得传入的字符参数值,请在下面【 】填上合适的代码。char TaskData=?A?;OSTaskCreate(Task, 【(void *)& TaskData 】, &TaskSt
8、k0TASK_STK_SIZE- 1, 1);void Task (void *pdata)char value = 【 *(char *)pdata 】;for (;) OSSemPend(RandomSem, 0, &err);y = (int) (*(char *)pdata - A);OSSemPost(RandomSem); PC_DispChar(10, 25, value, DISP_FGND_WHITE +DISP_BGND_BLUE);OSTimeDly(1);26. 在C/OS-II在任务Task1中使用邮箱函数OSMboxPost()发送字符;而在Task2中接收OSMb
9、oxPost()字符, 请在下面【 】填上合适的代码。void Task1 (void *data)char txmsg;INT8U err;txmsg = A;for (;) OSMboxPost(TxMbox, 【 (void *)&txmsg】); /* Send message toTask2*/OSMboxPend(AckMbox, 0, &err);txmsg+; if (txmsg = Z) txmsg = A;void Task5 (void *data)char *rxmsg;INT8U err;data = data;for (;) rxmsg = 【(char *)】OS
10、MboxPend(TxMbox, 0, &err);PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW +DISP_BGND_BLUE);OSMboxPost(AckMbox, (void *)1); 27. 在Task1中使用消息队列OSQPend()函数接收消息“Hello World!”,而在Task2中使用消息队列OSQPost()函数发送消息“Hello World!”, 请在下面【 】填上合适的代码.void Task1 (void *pdata)char *msg;INT8U err;pdata = pdata;for (;) msg = 【
11、(char *)】OSQPend(MsgQueue, 0, &err);PC_DispStr(70, 13, msg, DISP_FGND_YELLOW +DISP_BGND_BLUE);OSTimeDlyHMSM(0, 0, 0, 100);void Task2 (void *pdata)char msg20;pdata = pdata;strcpy(&msg0, Hello World!);for (;) OSQPost(MsgQueue, 【(void *)】&msg0);OSTimeDlyHMSM(0, 0, 0, 500);28 C/OS-II操作系统使用OSSchedLock()函
12、数和OSSchedUnlock()函数进行锁定(不允许任务级调度)和解锁(重新允许任务级调度)调度器,在用户应用程序中,OSSchedLock()和OSSchedUnlock()是 【 成对出现的 】,否则系统有可能出错。29代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。30资源任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。31共享资源可以被一个以上任务使用的资源叫做共享资源。32任务一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。典型地、每个任务都是一个无限的循环。33任务切换指Co
13、ntext Switch,其含义是CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。34内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。35调度(Scheduler)内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。36可剥夺型内核最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任
14、务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。37. 任务基本信息内涵(1) CPU中的PC寄存器:任务(程序)当前执行的位置;(2) CPU中的通用寄存器:任务当前执行代码所涉及的临时数据;(3) CPU中的状态寄存器:存储当前CPU的状态。38. 任务切换任务切换是指从一个任务直接切换到另一个任务,引起该次切换是由于某一个非中断引起的事件或主动放弃或调用节拍函数时,使一个更高优先级的任务处于就绪状态,暂停正在运行着的任务,转而切换去执行更高优先级任务;也可由中断后,中断退出时进行任务调度,重新去执
15、行更高优先级任务。39. 举例说明COS-II可移植型数据类型的定义方式答:因为不同的微处理器有不同的字长,C/OS-II的移植文件包括很多类型定义以确保可移植性。COS-II不使用C语言中的short,int,long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。C/OS-II代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下: typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int IN
16、T16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;40. COS-II如何定义全局变量?答:众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。因此,必须在 .C 和 .H 文件中定义。这种重复的定义很容易导致错误。COS-II采用的方法只需用在头文件中定义一次。 uC/OS_II.H 头文件中包括以下定义全局宏定义:#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern
17、#endifOS_EXT INT32U OSIdleCtr;同时,uCOS_II.H有中以下定义:#define OS_GLOBALS#include “includes.h”当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。INT32U OSIdleCtr;这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。extern INT32U OSIdleCtr;在这种情况下,不产生内存分配,而任何 .C文件都可以使用这些变量。这样的就只需在 .H 文
18、件中定义一次就可以了。41. OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()的含义及作用? 答:OS_ENTER_CRITICAL() :关中断;OS_EXIT_CRITICAL():开中断。关中断和开中断是为了保护临界段代码。用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。42基于PC的服务中如何测量PC_DisplayChar()的执行时间?答:测量PC_DisplayChar()的执行时间的代码如下:INT16U time; /定义时间变量PC_ElapsedInit();
19、 /时钟初始化PC_ElapsedStart(); /开始计时PC_DispChar(40, 24, ?A?, DISP_FGND_WHITE); /执行代码time = PC_ElapsedStop(); /结束计时43uC/OS-II的任务框架答:void task_xxx(void *pData) /* 该任务的初始化工作 */?/* 进入该任务的死循环 */while(1)?每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型”。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片
20、。当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型”。事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:(1)中断服务函数发送的事件(2)系统延时时间到所引起的(3)其它任务发送的事件。44 与共享资源打交道时,使之满足互斥条件最一般的方法包括哪些? 答:包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量等。45. 描述利用C/OS_ 宏调用关中断和开中断处理共享数据的示意性代码程答:OS_ENTER_CRITICAL();/*在这里处理共享数据*/OS_EXIT_CRITICAL(
21、);46. 信号量的典型应用包括哪些?答:信号量(Semaphores) 是一种约定机制,在多任务内核中的典型应用包括:(1) 控制共享资源的使用权(满足互斥条件);(2) 标志某事件的发生(3) 使两个任务的行为同步47对信号量只能实施哪三种操作?答:一般地说,对信号量只能实施三种操作:(1) 初始化(INITIALIZE),也可称作建立(CREATE);(2) 等信号(WAIT)也可称作挂起(PEND);(3) 给信号(SIGNAL)或发信号(POST)。48.给出C/OS-中如何用信号量处理共享数据的示意代码?答:通过获得信号量处理共享数据的示意代码如下:OS_EVENT *Shared
22、DataSem;void Function (void)INT8U err;OSSemPend(SharedDataSem, 0, &err);/*共享数据的处理在此进行,(中断是开着的)*/OSSemPost(SharedDataSem);49.给出初始化和启动C/OS-的示意代码。答:void main (void)OSInit(); /* 初始化uC/OS-II */.通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务; .OSStart(); /* 开始多任务调度!OSStart()永远不会返回 */ 50 描述建立任务OSTaskCreate()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 程序设计 复习题
限制150内