Task10 Tas申请信号量Task0 sem1失败,系统 切换到 Task1 申请信号量seml; 执行一些操作; 将信号量em置1; seml被置1后 Task2得到sem1并 执行一些操作 抢占Iask1 将信号量sem置1; 申请信号量sem2;Task2运行到某处 时因某种原因被 阻塞,系统切换 到Task1 用二值信号量实现两个任务之间的双向同步 Task2优先级高于Task1 sem和sem2的初始值均为0 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 Task1() { …… 执行一些操作; 将信号量sem1置1; 申请信号量sem2; …… …… } Task2() { …… 申请信号量sem1; 执行一些操作; 将信号量sem2置1; …… …… } Task2申请信号量 sem1失败,系统 切换到Task1 sem1 被 置 1 后 , Task2 得 到 sem1 并 抢占Task1 Task2运行到某处 时因某种原因被 阻塞,系统切换 到Task1 用二值信号量实现两个任务之间的双向同步 •Task2优先级高于Task1 •sem1和sem2的初始值均为0
计数信号量 计数信号量用控制系统中共享资源的多 个实例的使用,允许多个任务同时访问同 种资源的多个实例 计数信号量被初始化为n(非负整数),n 为该种共享资源的数目。 Task 共享资源实例1 Task 共享资源实例n Task m 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 计数信号量 计数信号量用于控制系统中共享资源的多 个实例的使用,允许多个任务同时访问同 一种资源的多个实例 计数信号量被初始化为n(非负整数),n 为该种共享资源的数目。 Task1 Task2 共享资源实例n Task m 共享资源实例1 …… ……
计数信号量 申请并获得 值减1 申请并获得 值为0 初始化 可获得 不可获得 值大于0 释放 释放 值加1 值为1 计数信号量状态图 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 计数信号量 计数信号量状态图 初始化 可获得 不可获得 值大于0 申请并获得 值为0 释放 值为1 申请并获得 值减1 释放 值加1
信号量机制的主要数据结构 信号量控制块 SCB1 信号量名字或I SCB2 任务等待列表 ■ Task1 Task2 count 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 信号量机制的主要数据结构 SCB1 SCB2 …… …… 信号量控制块 count 信号量名字或ID Task1 Task2 …… 任务等待列表
信号量机制的主要数据结构 信号量控制块:管理所有创建的信号量,内核 在系统运行时动态分配和回收信号量控制块 互斥和二值信号量控制块结构: Binary Semaphore Control Bloc wait queue任务等待队列 attributes信号量属性 lock nesting behavior试图嵌套获得时的规则 wait discipline 任务等待信号量的方式 riority ceiling优先级天花板值 lock 是否被占有 holder 拥有者 nest count嵌套层数 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 信号量机制的主要数据结构 • 信号量控制块:管理所有创建的信号量,内核 在系统运行时动态分配和回收信号量控制块 • 互斥和二值信号量控制块结构: Binary_Semaphore_Control_Block wait_queue 任务等待队列 attributes 信号量属性 lock_nesting_behavior试图嵌套获得时的规则 wait_discipline 任务等待信号量的方式 priority_ceiling 优先级天花板值 lock 是否被占有 holder 拥有者 nest_count 嵌套层数