作者:jk.li (jk.li@foxmail.com) 一个例子 前提:有三个任务,优先级为4、5、6,并且优先级最低的最先运行,同时三个任务都会使用同一个信号量,信号量初始值为1. 第1步:信号量被创建,cnt=1,这时候任务就绪列表为空,信号量等待列表为空。 第2步:任务6开始执行,试图获得信号量由于cnt为1,所以会得到信号量得到后cnt减一变为0,这时候任务就绪列表为6,信号量等待列表为空。 第3步:任务5中断6开始执行,任务5也试图获得信号量由于cnt=0任务5必须等待,信号量等待列表加入5,这时候任务就绪列表为6,信号量等待列表为5。 第4步:更高优先级的任务4中断6开始执行也在等待同一信号量,信号量等待列表加入4,这时候任务就绪列表为6,信号量等待列表为4、5。 第5步:任务6释放信号量,由于存在等待任务,所以让等待列表中优先级最高的任务进入就绪列表,重新调度,任务4运行,这时候任务就绪列表为4,信号量等待列表为5。 第6步:任务4得到了信号量开始执行,执行过程中会释放信号量,这样任务5也进入了就绪列表,重新调度仍然优先级高的任务4运行,这时候任务就绪列表为4、5,信号量等待列表为空。 第7步:任务4运行后任务5有机会运行,任务5释放信号量,由于已经没有任务在等待该信号量所以直接让cnt加一,cnt=1,信号量回到了初始状态,这时候任务就绪列表为空,信号量等待列表为空。 |
uC/OS信号量Pend和Post都会做些什么
最新推荐文章于 2023-10-24 18:17:49 发布