嵌入式软件工程师笔试面试题分类汇总——ucosII知识点(1)

  1. 可剥夺型内核?
    答:根据优先级可占用当前CPU的使用权
  2. 一个应用程序为什么一定要使用空闲任务?
    答:为了让CPU在没有用户任务可执行时有事可做
  3. 从存储结构上看,任务是如何组成的?
    答:从存储结构上看,任务由任务控制块、任务堆栈、任务代码三个部分组成。系统通过任务控制块感知和控制任务;任务堆栈主要用于保护断点和恢复断点;任务代码是一个超循环结构,描述了任务的执行过程。在创建一个任务时,函数OSTaskCreate()或OSTaskCreateExt()负责给任务分配任务控制块和任务堆栈,并对他们进行初始化,然后将任务控制块、任务堆栈、任务代码三者关联起来形成一个完整的任务。
  4. 系统是按照任务就绪表和任务的优先级来调度任务的。执行任务调度工作的是调度器,它负责查找具有最高优先级别的就绪任务并运行它,同时将该任务的TCB指针存放至OSTCBCur(即获取该任务的TCB指针)。通常系统在调用API函数和运行中断服务函数程序之后都要调用OSShed()来进行一次任务调度。
  5. 什么是空任务控制块链表?什么是任务控制块链表?
    答:在任务控制块的管理上,ucosii采用两条链表进行管理:一条空任务块链表(其中所有任务控制块还未分配给任务)和一条任务控制块链表(其中所有任务控制块已分配给任务)。具体做法:系统在进行初始化时,先在RAM中建立一个OS_TCB结构类型的数组OSTCBTbl[ ],然后将各个元素链接成一个链表,从而形成一个空任务块链表。当系统创建一个任务时,就会将空任务控制块链表表头指针指向的任务控制块分配给该任务。在给任务控制块中各成员赋值后,系统将按任务控制块链表的表头指针将其加入到任务控制块链表中。
    注:空任务控制块链表为单向链表,任务控制块链表为双向链表
  6. 应用程序首先通过调用OSInit()函数对全局变量以及数据结构进行初始化,以建立ucosii的运行环境,通过调用OSStart()函数开始进入多任务管理的,但在调用OSStart()函数之前必须创建至少一个用户任务。
  7. 就绪的最高优先级的任务
    答: ucosii中存在任务就绪组OSRdyGrp和任务就绪表OSRdyTbl[ ],通过就绪表某位置1将某个任务进入就绪态;同时,ucosii中还定义了一个OSUnMapTbl[ ],结合OSRdyGrp和OSRdyTbl[ ]可以很快确定哪个优先级的任务处于就绪状态。
  8. 任务切换的核心工作就是任务堆栈指针的切换。
  9. 最高优先级的任务进行任务切换—进入中断,切换任务堆栈的实现
    答:通过任务就绪表机制可以快速查询到当前最高的优先级任务,通过OS_TASK_SW()这个宏可以实现任务上下文的切换,该宏即OSCtxSw()函数通过触发PendSV异常从而完成切换的工作。OSCtxSw()要依次完成如下7项工作:
    1)将被终止的任务的断点指针保存到任务堆栈中;
    2)将CPU通用寄存器的内容保存至任务堆栈中;
    3)将被终止任务的任务堆栈指针当前值保存至该任务控制块的OSTCBStkPtr中;
    4)获取待运行任务的任务控制块;
    5)使CPU通过任务控制块获取待运行任务的任务堆栈指针;
    6)将待运行任务堆栈中的通用寄存器的内容恢复到CPU通用寄存器中;
    7)使CPU获得待运行任务的断点指针;
    注:由于ucosii中总是把当前正在运行任务的任务控制块的指针存放在一个指针变量OSTCBCur中,并且对于待运行任务的任务控制块指针也很好获得(OSTCBHighRdy),所以2-6步骤很容易完成,问题是1和7的处理,并没有将断点指针(在PC寄存器中)压入堆栈的指令,从而想到使用引发中断的方式,利用系统在跳转到ISR时会自动将断点指针压入堆栈的功能将断点指针存入堆栈,返回时同理。
  10. 为什么采用PendSV异常这种方式来引发上下文切换?
    答:对于Cortex-M3,这种方式是最推荐的,因为Cortex-M3会自动保存任何异常发生时一半的处理器上下文,并且在异常处理完后会自动恢复那一部分的值
  11. OSStart()中调用OSStartHighRdy()函数完成的功能是?为什么调用它?
    答:OSStartHighRdy()会触发一个PendSV异常,引发系统中第一个任务的运行。它设置系统的运行标志位OSRunning为True,将就绪表中最高优先级任务的堆栈指针Load到SP中,并强制中断返回。这样做的目的是让就绪的最高优先级任务就如同从中断返回到运行状态一样,使得整个系统得以运转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值