第八讲2内核结构-医学资料

上传人:杰猫 文档编号:119359852 上传时间:2020-01-13 格式:PPT 页数:45 大小:345.01KB
返回 下载 相关 举报
第八讲2内核结构-医学资料_第1页
第1页 / 共45页
第八讲2内核结构-医学资料_第2页
第2页 / 共45页
第八讲2内核结构-医学资料_第3页
第3页 / 共45页
第八讲2内核结构-医学资料_第4页
第4页 / 共45页
第八讲2内核结构-医学资料_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《第八讲2内核结构-医学资料》由会员分享,可在线阅读,更多相关《第八讲2内核结构-医学资料(45页珍藏版)》请在金锄头文库上搜索。

1、嵌入式系统设计 第八讲(2) 内核结构 授课教师:李英祥 电邮地址:drliyingxiang * 嵌入式系统设计 主要内容 w1. 几个概念 w2. 内核结构 Date 2 嵌入式系统设计 1.几个概念 w代码的临界段 w共享资源 w任务 w关中断 Date 3 嵌入式系统设计 代码的临界段 w代码的临界段也称为临界区,指处理时不可分割的代码 。一旦这部分代码开始执行,则不允许任何中断。 w为确保临界段代码的执行,在进入临界段之前要关中断 ,而临界段代码执行完以后要立即开中断。 Date 4 嵌入式系统设计 共享资源 w资源 :任何为任务所占用的实体都可称为资源。资源可 以是打印机、键盘、显

2、示器,资源也可以是一个变量, 一个结构或一个数组等 w共享资源:可以被一个以上任务使用的资源叫做共享资 源。为了防止数据被破坏,每个任务在与共享资源打交 道时,必须独占该资源。这叫做互斥(mutual exclusion ) Date 5 嵌入式系统设计 任务 w任务是一个具有独立功能的无限循环的程序段或者只执 行一次的程序段的一次运行活动,是实时内核调度的单 位; w任务主要包含以下内容: 代码:一段可执行的程序 数据:程序所需要的相关数据(变量、工作空间、缓冲区等) 堆栈 程序执行的上下文环境 Date 6 嵌入式系统设计 High Priority Task Low Priority T

3、ask Task Task Task Task Task Task EventEvent Each Task Infinite Loop Importance Splitting an application into TasksSplitting an application into Tasks Date 7 嵌入式系统设计 关中断 wC/OS-为了处理临界段代码需要关中断,处理完毕后 再开中断。这使得C/OS-能够避免同时有其它任务或 中断服务进入临界段代码 ; wC/OS-提供两个宏调用,允许用户在应用程序的C代 码中关中断然后再开中断: OS_ENTER_CRITICAL() OS_

4、EXIT_CRITICAL() Date 8 嵌入式系统设计 w两个宏调用的使用法 Date 9 嵌入式系统设计 2. 内核结构 w基本知识: 任务参数 任务状态 任务切换 w数据结构: 任务控制块 空任务链表 就绪任务链表 Date 10 嵌入式系统设计 w系统调用: 任务调度函数OSSched() 调度器上锁和开锁函数OSSchedlock() /OSSchedUnlock() 空闲任务 OSTaskIdle() 统计任务 OSTaskStat() 中断处理 OSIntEnter() /OSIntExit() 时钟节拍 OSTickISR 获取当前C/OS-的版本号OSVersion()

5、C/OS-初始化OSInit() C/OS-的启动 OSStart() Date 11 嵌入式系统设计 void YourTask (void *pdata) for (;) /* USER CODE */ Call one of uC/OS-IIs services: OSFlagPend(); OSMboxPend(); OSMutexPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* USER CODE

6、*/ void YourTask (void *pdata) /* USER CODE */ OSTaskDel(OS_PRIO_SELF); w任务所包含的 程序通常为一 个具有无限循 环的程序 ; w或者一次执行 例: UCOSII中的任务内容 Date 12 嵌入式系统设计 任务参数 w一个任务看起来像其它C的函数一样,有函数返回类型 ,有形式参数变量; w但是任务是绝不会返回的,故返回参数必须定义成void w形式参数变量是由用户代码在第一次执行的时候带入的 。形式参数变量类型是一个指向void的指针。 这是为了允许用户应用程序传递任何类型的数据给任务 Date 13 嵌入式系统设计

7、任务状态 wC/OS-控制下的任务状态转换图。在任一给定的时刻 ,任务的状态一定是在这五种状态之一。 Date 14 嵌入式系统设计 w正在运行的任务可以通过调用两个函数之一将自身延迟 一段时间,函数为OSTimeDly()或OSTimeDlyHMSM(),这个 任务于是进入等待状态 w正在运行的任务期待某一事件的发生时也要等待,手段 是调用以下3个函数之一:OSSemPend(),OSMboxPend(), 或OSQPend(),调用后任务进入了等待状态(WAITING) w下一个优先级最高的、并进入了就绪态的任务立刻被赋 予了CPU的控制权 w当所有的任务都在等待事件发生或等待延迟时间结束

8、, C/OS-执行空闲任务(idle task),执行OSTaskIdle() 函数 Date 15 嵌入式系统设计 任务切换 w任务切换(context switching) 保存当前任务的上下文,并恢复需要执行的任务的上下文的过 程。 w当发生任务切换时: 当前正在运行的任务的上下文就需要通过该任务的任务控制块 保存起来; 把需要投入运行的任务的上下文从对应的任务控制块中恢复出 来。 Date 16 嵌入式系统设计 任务1 任务2 任务3 调度 程序 051015 2025303540 4550 运行 等待就绪 在时刻8即发生了任务切换,任务1的上下文需要保存到任务1的任务 控制块中去。

9、经过调度程序的处理,在时刻10任务2投入运行,需要把任务2的任务 控制块中关于上下文的内容恢复到CPU的寄存器。 Date 17 嵌入式系统设计 任务1任务2 实时内核调度程序 保存任务1的上下文到TCB1 从TCB2恢复任务2的上下文 保存任务2的上下文到TCB2 从TCB1恢复任务1的上下文 时间 任务1执行一段时间后,由于某种原因,需要进行任务切换,进入实时内 核的调度程序。调度程序首先把当前的上下文内容保存到任务1的任务控 制块TCB1中,然后又把任务2的上下文从TCB2中恢复到CPU寄存器,随后 任务2得到执行。任务2执行一段时间后,由于某种原因,需要进行任务 切换,进入实时内核的调

10、度程序。调度程序首先把当前的上下文内容保 存到任务2的任务控制块TCB2中,然后又把任务1的上下文从TCB1中恢复 到CPU寄存器,随后任务1得到执行。 D 嵌入式系统设计 任务控制块 w任务管理是通过对任务控制块(task control block,TCB )的操作来实现的; w任务控制块是一个数据结构,当任务的CPU使用权被剥 夺时,C/OS-用它来保存该任务的状态; w当任务重新得到CPU使用权时,任务控制块能确保任务 从当时被中断的那一点丝毫不差地继续执行; Date 19 嵌入式系统设计 w任务控制块是包含任务相关 信息的数据结构 包含了任务执行过程中所需要 的所有信息。 w任务控

11、制块大都包括以下信 息: 任务的名字 任务执行的起始地址 任务的优先级 任务的状态 任务的硬件上下文(堆栈指针 、PC和寄存器等)、任务的 队列指针等内容 task name task ID task status task priority task context(registers and flags of CPU) Date 20 嵌入式系统设计 TCB of TCB of ucOSucOS typedef struct os_tcb OS_STK *OSTCBStkPtr; struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev; 。 #

12、if (OS_Q_EN #endif #if (OS_Q_EN #endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; #if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq; #endif OS_TCB; Date 21 嵌入式系统设计 wOSTCBStkPtr是指向当前任务栈顶的指针 ; wOSTCBNext和OSTCBPrev用于任务控制块OS_TCBs的双重链接, 双重连接的链表使得任一成员都能被快速插入或删除; w OSTCBEventPtr是指向事件控制块的指针 ; wOSTCBMsg是指向传给任务的

13、消息的指针 ; wOSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或 者需要把任务挂起一段时间以等待某事件的发生 ; wOSTCBStat是任务的状态字。当OSTCBStat为0,任务进入就绪态 ; wOSTCBPrio是任务优先级 ; wOSTCBDelReq是一个布尔量,用于表示该任务是否需要删除 ; Date 22 嵌入式系统设计 w在C/OS-初始化的时候,所有任务控制块OS_TCBs被链接成单向 空任务链表; w一旦建立任务,空任务控制块指针OSTCBFreeList指向的任务控制 块便赋给了该任务,然后OSTCBFreeList的值调整为指向下链表中 下一个空的任务控

14、制块; w一旦任务被删除,任务控制块就还给空任务链表; Free Free TCBsTCBs after after OS_TCBInitOS_TCBInit() () in in ucOSucOS 空任务链表 Date 23 嵌入式系统设计 就绪表 w每个任务被赋予不同的优先级等级,从0级到最低优先级 OS_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在内; w每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量 OSRedyGrp和OSRdyTbl ; w在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的 每一位表示8组任务中每一组中是否有进入

15、就绪态的任务。任务进入就 绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。 w就绪表OSRdyTbl数组的大小取决于OS_LOWEST_PR1O w任务优先级的低三位用于确定任务在就绪表OSRdyTbl中的所在位。 接下去的三位用于确定是在OSRdyTbl数组的第几个元素。 Date 24 嵌入式系统设计 Date 25 嵌入式系统设计 任务调度函数OSSched() w确定哪个任务优先级最高,下面该哪个任务运行了的工 作是由调度器(Scheduler)完成的; w任务级的调度是由函数OSSched()完成的,中断级的调 度是由另一个函数OSIntExt()完成的 ; Date 26 嵌入式系统设计 void OS_Sched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSIntNesting = 0) /* Get pointer to HPT ready to run */

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号