嵌入式系统
事件控制块OS-2_event_type 表示的事件的类型是什么
OS_EVENT_TYPE_UNUSED 空事件控制块(未被使用的事件控制块
OS_EVENT_TYPE_MUTEX 互斥型信号量
OS_EVENT_TYPE_MBOX 邮箱
OS_EVENT_TYPE_SEM 信号量
OS_EVENT_TYPE_Q 该事件控制块描述的是一个消息队列OS_EVENT_TYPE_FLAG 为信号量集标志
一个事件的等待任务列表 内存结构 组成 以及在什么情况下等待任务列表会发生变化
P182 任务等待表,一个任务进入等待状态和一个正在等待的任务进入就绪状态,一个等待超时的任务进入就绪状态
OS-2任务管理在创建任务过程中哪些情况会导致任务创建失败
使得任务就绪表发生变化的情况有哪些
1有新任务被创建,并在就绪任务表中进行了登记;
2有任务被删除;
3有处于等待状态的任务被唤醒;
4由于异步事件的发生,在中断服务程序中激活了一个或几个任务;
5正在运行的任务需要等待某个任务而进入等待状态
6正在运行的任务调用延时函数而自愿进入等待状态
什么叫优先级反转 他的原因是什么 怎么来避免
在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这就是优先级反转。
一个优先级别较低的任务在获得了信号量使用共享资源的期间,被具有较高优先级别的任务打断而不能释放信号量,从而使正在等待这个信号量的更高级别的任务因得不到信号量而被迫处于等待状态,在这个等待期间,就让优先级别低于它而高于占据信号量的任务先运行了。
一种被称作优先级继承(priority inheritance);另一种被称作优先级极限(priority ceilings)
中断服务程序
任务在运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。应中断请求而运行的程序叫做中断服务子程序(Interrupt Service Routines,ISR),中断服务子程序的入口地址叫做中断向量。
嵌入式系统是对对象进行自动控制而使其具有智能化并可嵌入对象体系中的专用 计算机系统
任务的状态有哪些 每个状态是怎么定义的
用户任务代码的基本结构
根据嵌入式系统任务的工作特点,任务执行代码通常是一个无限循环结构(当然,对于一些一次性任务不这样),并且在这个循环中可以响应中断,这种结构也叫做超循环结构。
内存不可剥夺的操作系统是什么意思
不可剥夺型内核也叫合作型多任务内核。在这种内核中,总是优先级别高的任务最先获得CPU的使用权。为防止某个任务始终霸占CPU的使用权,这种内核要求每个任务必须能主动放弃CPU的使用权。
内存可剥夺的操作系统是什么意思
在可剥夺型内核中,CPU总是运行多个任务中优先级别最高的那个任务,即使CPU正在运行某个低级别的任务,当有高优先级别的任务准备就绪时,该优先级别的任务就会剥夺正在运行任务的CPU使用权,从而使自己获得CPU的使用权。
什么叫任务上下文切换 要举一个例子
上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。上下文的内容依赖于具体的CPU
中断发生时,中断会强制CPU把控制权交给操作系统,也就相当于一次 上下文切换。这样不仅可以减少程序出错的后果,而且提高切换的效率。uC/OS 就是利用中断机制进行上下文切换的典型例子
OS-2操作系统有三种函数
普通用户函数
OS任务函数
中断任务函数
怎样才能得到执行 执行方式有何差别
用c语言 中断服务程序 关键函数代码 (ppt有)列举哪一些 (可能是其一)
在编写uC/OS一II的中断服务程序时,要用到两个重要的函数OSIntEnter()和OSInExit()。
函数OSIntEnter()的作用就是把全局变量OSIntNesting加1,从而用它来记录中断嵌套的层数。函数OSIntEnter的代码如下:
void OSIntEnter(void)
{
if (OSRunning == TRUE)
{
if (OSIntNesting<255)
{
OSIntNesting++;
}
}
}
OS-2操作系统怎么创建一个任务
μC/OS-Ⅱ是通过任务控制块来管理任务的。因此,创建任务的实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。当然,还要使刚创建的任务进入就绪状态,并接着引发一次任务调度。
μC/OS-Ⅱ有两个用来创建任务的函数:OSTaskCreate()和OSTaskCreateEXT()。其中OSTaskCreateExt()是OSTaskCreate()的扩展,并提供一些附加功能。用户根据需要使用这两个函数之一来完成任务创建工作。
一般来说,任务可在调用函数OSStart()启动任务调度之前来创建,也可以在任务中来创建。但是μC/OS-Ⅱ有一个规定:在调用任务启动函数OSStart()之前,必须已经创建了至少一个任务。因此,人们习惯上在调用OSStart()先创建一个任务,并赋予他最高的优先级别,从而使它成为起始任务;然后在这个起始任务中再创建其他各任务。
如果要使用系统提供的统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用。
中断级的服务程序 eg.任务切换 任务延时函数 都要会
注:填书里面的代码 非数值计算
与任务级切换函数OSCtxSw()一样,中断级任务切换函数OSIntCtxSw()也用汇编语言来编写。其示意性代码如下:
OSIntCtxSw( )
{
OSTCBCur = OSTCBHighRdy; //任务控制块的切换
OSPrioCur = OSPrioHighRdy;
SP = OSTCBHighRdy —> OSTCBStkPtr; //使SP指向待运行任务堆栈
用出栈指令把R1、R2、......弹入CPU的通用寄存器;
RETI; //中断返回,使pc指向待运行任务
}
void OSTimeDly (INT16U ticks)
{
# if OS_CRITICAL_METHOD ==3
OS_SR cpu_sr;
# endif
if (ticks>0)
{
OS_ENTER_CRITICAL();
if((OSRdyTbl[OSTCBCur—>OSTCBBitY ]
&=~OSTCBCur—> OSTCBBitX) == 0)
{
OSRdyGrp
&=~OSTCBCur—>OSTCBBitY; //取消当前任务的就绪状态
}
OSTCBCur—>OSTCBDly=ticks; //延时节拍数存入任务控制块
OS_EXIT_CRITICAL( );
OS_Sched(); //调用调度函数
}
}
任务状态之间的装换关系(五种)
从用户的观点来看,任务可以是有 5种状态。
{休眠状态,就绪状态,运行状态,挂起状态,中断状态}
(1).处于休眠状态的任务驻留于内存但未被uC/OS-III使能。通过调用OSTaskCreate()函数uC/OS-III创建任务。 任务代码是存在于ROM的。但需要用OSTaskCreate()函数通知uC/OS-III关于任务的相关信息。如果任务的使命完成了,就要调用OSTaskDel()删除该任务。OSTaskDel()实际上不是删除任务的代码,只是让任务不再具有使用CPU的资格而已。
(2).就绪状态的任务根据优先级有序地排列于就绪列表中。就绪列表中对就绪任务的个数没有限制。
(3).正在运行的任务被置为运行状态。在单CPU中,任何时刻只能有一个任务被运行。当应用程序调用OSStart()或者调用OSIntExit()或者调用OS_TASK_SW()时uC/OS-III从就绪队列中选择优先级最高的任务去运行。正如前面所提到的,有些时候任务必须等待某些事件发生,若事件还未发生时,任务就会被设置为挂起状态。
(4).挂起状态的任务被放置在挂起列表中以表明任务在等待某些事件的发生。等待的时候,任务是不会占用CPU的。事件发生时,该任务会被放到就绪队列中。在这种情况下,正在运行的任务可能会被抢占(被放回就绪列表),并由uC/OS-III选择优先级最高的任务去运行。换句话说,如果新的任务优先级最高,那么它就会被立即运行。请注意,调用OSTaskSuspend()会任务无条件地停止运行。有些时候调用OSTaskSuspend()不是为了等待某个事件的发生,而是等待另一个任务调用OSTaskResume()函数恢复这个任务。
(5).若中断发生,中断会挂起正在执行的任务并去处理ISR。ISR中可能有某些任务等待的事件。一般来说,中断用来通知任务某些事件的发生,并让在任务级处理实际的响应操作。ISR程序越短越好,实际响应中断的操作应该被设置在任务级以便能让uC/OS-III管理这些操作。ISR中只允许调用一些提交函数(OSFlagPost(),OSQPost(),OSSemPost(),OSTaskQPost(),OSTaskSemPost()),除了OSMutexPost()。因为mutex只允许在任务级被修改。
OS-2操作系统在执行过程中主要main函数的执行顺序
uC/OS-II操作系统启动旳过程中,Bootloader执行完毕后,调用应用程序主文献(一般是main.c)里旳main()函数。main()函数在执行过程中,除了顾客函数和硬件初始化函数之外,需要执行如下三个重要旳uC/OS-II函数:
它们的执行顺序是:III. OSInit() II. OSTaskCreate() I. OSStart()
实时操作系统的一些特征指标
其特征是:
(1)及时响应,快速处理实时系统的时间要求是强制性严格规定的,仅当在规定的时间内返回一个正确的结果时,才能认为系统的功能是正确的。
(2)高可靠性和安全性,不强求系统资源的利用率
OS-2系统初始化时会创建那些空白的数据链表
在uC/OS-ll中,OSInit()函数先建立最初的任务就绪表,然后建立4个空白的数据链表。它们分别是任务控制块链表、事件控制块链表、标志链表和内存控制块链表。
OS-sched函数执行的相关条件
调度器OSSched()在确认未被上锁并且不是中断服务程序调用调度器的情况下,首先从任务就绪表中查得的最高优先级别就绪任务的优先级别OSPrioHighRdy;然后再确认了这个就绪任务不是当前正在运行的任务(OSPrioCur是存放正在运行任务的优先级别的变量)的条件下,用OSPrioHighRdy作为下标去访问数组OSTCBPrioTb[],把数组元素OSTCBPrioTbl[OSPrioHighRdy]的值(即运行就绪任务的任务控制块指针)赋给指针变量OSTCBHighRdy。