信号量机制的主要数据结构 计数信号量控制结构 Counting Semaphore Control Bloc wait_queue任务等待队列 attribute计数信号量属性 maximum count 最大计数值 wait_discipline任务等待信号量的方式 count 当前计数值 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 • 计数信号量控制结构 Counting_Semaphore_Control_Block wait_queue 任务等待队列 attributes 计数信号量属性 maximum_count 最大计数值 wait_discipline 任务等待信号量的方式 count 当前计数值 信号量机制的主要数据结构
信号量内部实现机制实例说明 IC/oS-/ ·事件控制块ECB-同步与通信机制的基本数据结构 typedef struct NT8 U OsEvent type;∥事件类型 NT8 U OSEvent Grp;/等待任务所在的组 ⅠNT16 U OSEventcnt;∥计数器(信号量) od* OSEventptr;指向消息或消息队列的指针 NT8 6U OSEventTbl[OS EVEnt TBL_SZE];/等待任 务列表 JOS EVENT 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 信号量内部实现机制实例说明 -µC/OS-II • 事件控制块ECB-同步与通信机制的基本数据结构 typedef struct{ INT8U OSEventType;//事件类型 INT8U OSEventGrp;//等待任务所在的组 INT16U OSEventCnt;//计数器(信号量) void *OSEventPtr;//指向消息或消息队列的指针 INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//等待任 务列表 }OS_EVENT;
信号量内部实现机制实例说明 C/OS-l/ OS EVENT+ 当一个事件发生 OSEventType 后,等待事件列 OSEventcnt 表中优先级最高 oSEventPtr 的任务(即 . OSEvent Grp 在 OSEventtb 76 4321 & OSEventGrp中 15141312|111098 所有被置1的位中 2322212019181716 优先级数值最小 31302928272625 24 OSEventtbll 的任务)得到该 393 3 3635343332 事件。 47464544434241|40 63626116059585756
电子科技大学嵌入式软件工程中心 信号量内部实现机制实例说明 -µC/OS-II • 当一个事件发生 后,等待事件列 表中优先级最高 的任务(即 在.OSEventTbl[] &OSEventGrp中 所有被置1的位中 优先级数值最小 的任务)得到该 事件
信号量内部实现机制实例说明 IC/OS- 当 OSEventtbl[n回aann OSEventGrp OSEventTbl[OS_ LOWEST_PRIO/8+1] 中的任何一位为1 Highest Prlorlty Task Walting 时, OSEventGrp [0 5|4|3|2|1d 131211109 中的第n位立为1 四2区221211团71 与任务就绪列表类 [4]39 38 37 36 35343332 肉团4645434244 似! 间6]155 52515049 76362616059585756 Priority of task waiting\ for the event to occur Task,'s Priority [ak区 Lowest Priority Task (Idle Task, can NEvER be walting) Bit position in. OSEventTbI[OS_LOWEST_PRIO 18+11 Bit position In. OSEventGrp and ndex into. OSEventTbl[OS_ LOWEST_ PRIO/8+11 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 信号量内部实现机制实例说明 -µC/OS-II • 当.OSEventTbl[n] 中的任何一位为1 时,OSEventGrp 中的第n位为1。 与任务就绪列表类 似!
信号量内部实现机制实例说明 IC/os-l 将一个任务插入到等待事件 的任务列表中: Index bit mask binary) 00000001 00000010 pevent->OSEvent Grp 00000100 OSMap Tbl[prio > 31; 00001000 00010000 pevent->OSEventTbllprio >>35 00100000 F= OSMaptb|pro&0×07] 01000000 10000000 与将一个任务插入到就绪列表中 的操作类似! 电子科技大学嵌入式件工程中心 EsE匚
电子科技大学嵌入式软件工程中心 信号量内部实现机制实例说明 -µC/OS-II • 将一个任务插入到等待事件 的任务列表中: pevent->OSEventGrp |= OSMapTbl[prio >> 3]; pevent->OSEventTbl[prio >> 3] |= OSMapTbl[prio & 0x07]; 与将一个任务插入到就绪列表中 的操作类似! Index Bit mask (Binary) 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 2 0 0 0 0 0 1 0 0 3 0 0 0 0 1 0 0 0 4 0 0 0 1 0 0 0 0 5 0 0 1 0 0 0 0 0 6 0 1 0 0 0 0 0 0 7 1 0 0 0 0 0 0 0