一个网站源码值多少钱,做1688网站需要懂英语吗,做网站的环境配置,新吴区网站建设目录 一、信号量的特性1、信号量跟队列的对比2、两种信号量的对比 二、信号量1、二值信号量1.1 二值信号量用于同步1.2 二值信号量用于互斥 2、计数信号量 三、信号量函数1、创建2、删除3、give/take 一、信号量的特性
信号量#xff08;Semaphore#xff09;是一种实现任务… 目录 一、信号量的特性1、信号量跟队列的对比2、两种信号量的对比 二、信号量1、二值信号量1.1 二值信号量用于同步1.2 二值信号量用于互斥 2、计数信号量 三、信号量函数1、创建2、删除3、give/take 一、信号量的特性
信号量Semaphore是一种实现任务间通信的机制可以实现任务之间同步或临界资源的互斥访问其实信号量主要的功能就是实现任务之间的同步与互斥实现的方式主要就是依靠队列(信号量是特殊的队列)的任务阻塞机制。
1、信号量跟队列的对比
差异列表如下
队列信号量可以容纳多个数据创建队列时有两部分内存: 队列结构体、存储数据的空间只有计数值无法容纳其他数据。创建信号量时只需要分配信号量结构体生产者没有空间存入数据时可以阻塞生产者用于不阻塞计数值已经达到最大时返回失败消费者没有数据时可以阻塞消费者没有资源时可以阻塞
由上面的表格可以看出信号量相比队列更节省空间因为实现同步与互斥不需要传递数据所以信号量没有队列后面的环形存储区信号量主要就是依靠计数值 uxMessagesWaiting在队列中表示队列现有消息个数在信号量中表示有效信号量个数。 其实创建信号量就对应创建特殊队列获取信号量就对应队列出队释放信号量就对应队列入队学好了队列就基本学好了信号量。 2、两种信号量的对比
信号量的计数值都有限制限定了最大值。如果最大值被限定为 1那么它就是二值信号量如果最大值不是 1它就是计数型信号量。
二值信号量计算型信号量被创建时初始值为 0被创建时初始值可以设定其他操作是一样的其他操作是一样的
二、信号量
首先来看一下信号的种类相关的信号量函数放在第三章。
1、二值信号量
所谓二值信号量其实就是一个队列长度为1没有数据存储器的队列而二值则表示计数值uxMessagesWaiting只有0和1两种状态(就是队列空与队列满两种情况)uxMessagesWaiting在队列中表示队列中现有消息数量而在信号量中则表示信号量的数量。
uxMessagesWaiting 为 0 表示信号量资源被获取了.uxMessagesWaiting 为 1 表示信号量资源被释放了
把这种只有 0 和 1 两种情况的信号量称之为二值信号量。
由于二值信号量就是特殊的队列其实它的运转机制就是利用了队列的阻塞机从而达到实现任务之间的同步与互斥(有优先级反转的缺陷)。
1.1 二值信号量用于同步
在多任务系统中经常会使用二值信号量来实现任务之间或者任务与中断之间的同步比如某个任务需要等待一个标记那么任务可以在轮询中查询这个标记有没有被置位则任务在等待的过程也会消耗 CPU 的资源如下所示
// 任务一
void Task1Function(void *param)
{volatile int i 0;while (1) {for (i 0; i 10000000; i) {sumj;}flagCalcEnd 1;vTaskDelete(NULL);}
}// 任务二
void Task2Function(void *param)
{while (1) {if (flagCalcEnd)printf(sum %d\r\n, sum);}
}总体工作流程如下任务二等待任务一等待 flagCalcEnd 置一计算完sum 的值累加一百万次。然后进行数据处理这里简单打印 sum 的值。
上面的代码看似没问题其实存在有两个问题
使用了全局变量 flagCalcEnd(如果同时读写 flagCalcEnd 则会出问题)。任务二在等待任务一计算完 sum 的值的过程中任务二也会参与任务调度消耗 CPU 资源假设只有这两个任务优先级相同且支持时间片轮转则在任务一在计算 sum 值的过程中任务一与任务二轮流执行相同时间片只不过任务二就一直判断 flagCalcEnd 的值是否为1相当于就是浪费 CPU 的资源)
所以二值信号量就可以解决这个问题在任务一计算 sum 的值的过程中任务二应该进入阻塞态让出 CPU 的使用权在任务二阻塞期间任务一就可以独占 CPU 全速计算 sum 的值代码如下所示
// 任务一
void Task1Function(void *param)
{volatile int i 0;while (1) {for (i 0; i 10000000; i) {sumj;}// 等待 sum 计算完成释放信号量信号量计数值 uxMessagesWaiting 加 1xSemaphoreGive(xSemcalc); vTaskDelete(NULL);}
}// 任务二
void Task2Function(void *param)
{while (1) {flagCalcEnd 0;// 若 sum 未计算完成则获取信号量失败任务会进入阻塞状态其他任务得以调度// 若 sum 计算完成信号量为 1则任务被唤醒 sum 得以打印xSemaphoreTake(xSemcalc, portMAX_DELAY);flagCalcEnd 1;printf(sum %d\r\n, sum);}
}1.2 二值信号量用于互斥
我们在串口接收中我们并不知道什么时候有数据发送过来等数据过来标记一次还有一个处理串口接收到的数据在任务系统中不可能时时刻刻去判断是否有串口有数据过来判断标志位所以在这种情况下使用二值信号量是很好的办法当没有数据到来的时候任务就进入阻塞态不参与任务的调度等到数据到来了释放一个二值信号量任务就立即从阻塞态中解除进入就绪态然后运行的时候处理数据这样子系统的资源就会很好的被利用起来。
二值信号量一般不用于任务之间的互斥任务之间互斥的访问一个临界资源同一时间只能一个任务可以使用因为它有优先级反转的缺点解决互斥的方式就是使用互斥信号量具有优先级继承的机制能减少优先级反转的影响关于优先级反转优先级继承等下一讲讲互斥量的时候在讲。
2、计数信号量
计数值信号量也与二值信号量一样也是特殊的队列二值信号量是长度为 1 的队列而计数值信号量是长度大于 0 的队列他们本质的区别就是应用场景不同二值信号量常用于同步计数值信号量常用于事件计数、资源管理其实如果限定计数值信号量计数值最大值只能为 1 则就等同于二值信号量。
计数值信号量的应用场景
事件计数 在这种场合下每次事件发生后在事件处理函数中释放计数型信号量计数型信号量的资源数加 1其他等待事件发生的任务获取计数型信号量计数型信号量的资源数减 1这种场景下计数型信号量的资源数一般在创建时设置为 0。资源管理 在这种场合下计数型信号量的资源数代表着共享资源的可用数量一个任务想要访问共享资源就必须先获取这个共享资源的计数型信号量之后在成功获取了计数型信号量之后才可以对这个共享资源进行访问操作当然在使用完共享资源后也要释放这个共享资源的计数型信号量。在这种场合下计数型信号量的资源数一般在创建时设置为受其管理的共享资源的最大可用数量。
三、信号量函数
使用信号量时先创建、然后去添加资源、获得资源。使用句柄来表示一个信号量。
1、创建
使用信号量之前要先创建得到一个句柄使用信号量时要使用句柄来表明使用哪个信号量。对于二值信号量、计数型信号量它们的创建函数不一样
二值信号量计数型信号量动态创建xSemaphoreCreateBinary计数值初始值为 0xSemaphoreCreateCountingvSemaphoreCreateBinary(过时了)计数值初始值为 1静态创建xSemaphoreCreateBinaryStaticxSemaphoreCreateCountingStatic
创建二值信号量的函数原型如下
/* 创建一个二值信号量返回它的句柄。* 此函数内部会分配信号量结构体* 返回值: 返回句柄非NULL表示成功*/
SemaphoreHandle_t xSemaphoreCreateBinary( void );/* 创建一个二值信号量返回它的句柄。* 此函数无需动态分配内存所以需要先有一个StaticSemaphore_t结构体并传入它的指针* 返回值: 返回句柄非NULL表示成功*/
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t*pxSemaphoreBuffer );创建计数型信号量的函数原型如下
/* 创建一个计数型信号量返回它的句柄。* 此函数内部会分配信号量结构体* uxMaxCount: 最大计数值* uxInitialCount: 初始计数值* 返回值: 返回句柄非NULL表示成功*/
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_tuxInitialCount);/* 创建一个计数型信号量返回它的句柄。* 此函数无需动态分配内存所以需要先有一个StaticSemaphore_t结构体并传入它的指针* uxMaxCount: 最大计数值* uxInitialCount: 初始计数值* pxSemaphoreBuffer: StaticSemaphore_t结构体指针* 返回值: 返回句柄非NULL表示成功*/
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount,UBaseType_t uxInitialCount,StaticSemaphore_t*pxSemaphoreBuffer );2、删除
对于动态创建的信号量不再需要它们时可以删除它们以回收内存。vSemaphoreDelete 可以用来删除二值信号量、计数型信号量函数原型如下
/** xSemaphore: 信号量句柄你要删除哪个信号量*/
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );3、give/take
二值信号量、计数型信号量的 give、take 操作函数是一样的。这些函数也分为 2 个版本给任务使用给 ISR 使用。列表如下
在任务中使用在 ISR 中使用givexSemaphoreGivexSemaphoreGiveFromISRtakexSemaphoreTakexSemaphoreTakeFromISR
xSemaphoreGive 的函数原型如下
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );参数说明xSemaphore信号量句柄释放哪个信号量返回值pdTRUE 表示成功,如果二值信号量的计数值已经是 1再次调用此函数则返回失败如果计数型信号量的计数值已经是最大值再次调用此函数则返回失败
xSemaphoreGiveFromISR 的函数原型如下
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);参数说明xSemaphore信号量句柄释放哪个信号量pxHigherPriorityTaskWoken如果释放信号量导致更高优先级的任务变为了就绪态则*pxHigherPriorityTaskWoken pdTRUE返回值pdTRUE 表示成功,如果二值信号量的计数值已经是 1再次调用此函数则返回失败如果计数型信号量的计数值已经是最大值再次调用此函数则返回失败
xSemaphoreTake 的函数原型如下
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);参数说明xSemaphore信号量句柄获取哪个信号量xTicksToWait如果无法马上获得信号量阻塞一会0不阻塞马上返回portMAX_DELAY: 一直阻塞直到成功其他值: 阻塞的 Tick 个数可以使用 pdMS_TO_TICKS() 来指定阻塞时间为若干 ms返回值pdTRUE 表示成功
xSemaphoreTakeFromISR 的函数原型如下
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);参数说明xSemaphore信号量句柄获取哪个信号量pxHigherPriorityTaskWoken如果获取信号量导致更高优先级的任务变为了就绪态则*pxHigherPriorityTaskWoken pdTRUE返回值pdTRUE 表示成功 文章转载自: http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn http://www.morning.rnmdp.cn.gov.cn.rnmdp.cn http://www.morning.rkjz.cn.gov.cn.rkjz.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.zdsdn.cn.gov.cn.zdsdn.cn http://www.morning.bpxmw.cn.gov.cn.bpxmw.cn http://www.morning.lhgkr.cn.gov.cn.lhgkr.cn http://www.morning.fnpyk.cn.gov.cn.fnpyk.cn http://www.morning.nrfrd.cn.gov.cn.nrfrd.cn http://www.morning.jsljr.cn.gov.cn.jsljr.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.gsqw.cn.gov.cn.gsqw.cn http://www.morning.mstrb.cn.gov.cn.mstrb.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.qzbwmf.cn.gov.cn.qzbwmf.cn http://www.morning.lzzqz.cn.gov.cn.lzzqz.cn http://www.morning.yktr.cn.gov.cn.yktr.cn http://www.morning.xlxmy.cn.gov.cn.xlxmy.cn http://www.morning.ppllj.cn.gov.cn.ppllj.cn http://www.morning.qcwrm.cn.gov.cn.qcwrm.cn http://www.morning.fwrr.cn.gov.cn.fwrr.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.ympcj.cn.gov.cn.ympcj.cn http://www.morning.mpscg.cn.gov.cn.mpscg.cn http://www.morning.mytmx.cn.gov.cn.mytmx.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.lpcct.cn.gov.cn.lpcct.cn http://www.morning.rgnp.cn.gov.cn.rgnp.cn http://www.morning.rmpkn.cn.gov.cn.rmpkn.cn http://www.morning.qflcb.cn.gov.cn.qflcb.cn http://www.morning.hengqilan.cn.gov.cn.hengqilan.cn http://www.morning.cjrmf.cn.gov.cn.cjrmf.cn http://www.morning.rbkgp.cn.gov.cn.rbkgp.cn http://www.morning.kpxky.cn.gov.cn.kpxky.cn http://www.morning.qykxj.cn.gov.cn.qykxj.cn http://www.morning.dhmll.cn.gov.cn.dhmll.cn http://www.morning.knscf.cn.gov.cn.knscf.cn http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn http://www.morning.kjyhh.cn.gov.cn.kjyhh.cn http://www.morning.bxrqf.cn.gov.cn.bxrqf.cn http://www.morning.kxmyj.cn.gov.cn.kxmyj.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.lpskm.cn.gov.cn.lpskm.cn http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.wqfj.cn.gov.cn.wqfj.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn http://www.morning.cgtfl.cn.gov.cn.cgtfl.cn http://www.morning.lwqst.cn.gov.cn.lwqst.cn http://www.morning.gbqgr.cn.gov.cn.gbqgr.cn http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.ptqds.cn.gov.cn.ptqds.cn http://www.morning.wslpk.cn.gov.cn.wslpk.cn http://www.morning.rxwfg.cn.gov.cn.rxwfg.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.rqxhp.cn.gov.cn.rqxhp.cn http://www.morning.simpliq.cn.gov.cn.simpliq.cn http://www.morning.brrxz.cn.gov.cn.brrxz.cn http://www.morning.rqqn.cn.gov.cn.rqqn.cn http://www.morning.xqmd.cn.gov.cn.xqmd.cn http://www.morning.wwdlg.cn.gov.cn.wwdlg.cn http://www.morning.kxltf.cn.gov.cn.kxltf.cn http://www.morning.lftpl.cn.gov.cn.lftpl.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.tfrlj.cn.gov.cn.tfrlj.cn http://www.morning.xzsqb.cn.gov.cn.xzsqb.cn http://www.morning.klpwl.cn.gov.cn.klpwl.cn http://www.morning.wrqw.cn.gov.cn.wrqw.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.yhrfg.cn.gov.cn.yhrfg.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.xxwfq.cn.gov.cn.xxwfq.cn http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn