我想自己做的知道网站,wordpress 定向次数过多,自贡跨省特大虚假广告案,内蒙古网站建站文章目录 前言一、什么是信号量二、信号量种类和对比三、信号量和队列的区别四、信号量相关的函数1.创建函数2.删除函数3.获取和释放信号量函数 总结 前言
本篇文章正式带大家开始学习什么是信号量#xff0c;并且掌握信号量函数的基本使用方法#xff0c;并且将和队列进行一… 文章目录 前言一、什么是信号量二、信号量种类和对比三、信号量和队列的区别四、信号量相关的函数1.创建函数2.删除函数3.获取和释放信号量函数 总结 前言
本篇文章正式带大家开始学习什么是信号量并且掌握信号量函数的基本使用方法并且将和队列进行一个对比。
一、什么是信号量
FreeRTOS 中的信号量是一种用于任务间同步和互斥的机制。它允许任务在临界区保护资源的访问、线程间通信以及任务之间的同步操作。信号量可以用来保护共享资源限制对资源的并发访问以及进行任务间的事件通知。
二、信号量种类和对比
FreeRTOS 提供了两种类型的信号量二值信号量Binary Semaphore和计数型信号量Counting Semaphore。
二值信号量Binary Semaphore
二值信号量是最简单的一种信号量它只能有两个状态0 和 1。它常用于互斥访问共享资源的情况如保护共享数据结构、保证一次只有一个任务执行临界区等。任务可以通过获取或释放二值信号量来请求或释放对共享资源的访问。
创建二值信号量使用 xSemaphoreCreateBinary 函数并通过 xSemaphoreGive 和 xSemaphoreTake 函数来释放和获取信号量。
计数型信号量Counting Semaphore
计数型信号量可以有多个状态值允许多个任务同时访问共享资源可以用于控制资源的可用性。计数型信号量常用于限制任务的并发执行数量或者用于任务间的生产者-消费者模型等场景。
创建计数型信号量使用 xSemaphoreCreateCounting 函数并通过 xSemaphoreGive 和 xSemaphoreTake 函数来增加和减少信号量的计数值。
在使用信号量时任务通过获取信号量来尝试占用资源并在未能获取时阻塞等待。一旦资源可用或条件满足任务释放信号量让其他任务可以获取资源或继续执行。这样可以确保对共享资源的安全性和正确性。
需要注意的是使用信号量时要小心处理同步和互斥问题以避免竞态条件和死锁。此外信号量的使用应该遵循良好的软件设计原则以避免过度使用和滥用信号量。
二种信号量的对比
1.功能
二值信号量Binary Semaphore只有两个状态0 和 1。主要用于互斥访问共享资源的情况保护共享数据结构限制对资源的并发访问。一般用于排它性操作尽量保持资源独占一个任务操作。
计数型信号量Counting Semaphore可以有多个状态值用于控制资源的可用性。可用于限制并发执行数量、任务间的生产者-消费者模型等场景。
2.创建和初始化
二值信号量可以使用 xSemaphoreCreateBinary 函数创建并使用 xSemaphoreGive 进行初始化调用 xSemaphoreTake 来获取信号量。 计数型信号量可以使用 xSemaphoreCreateCounting 函数创建并使用 xSemaphoreGive 进行初始化调用 xSemaphoreTake 来获取信号量。
3.值的范围
二值信号量具有两个状态0 和 1。只能通过 xSemaphoreGive 和 xSemaphoreTake 将其值从 0 切换到 1 或者从 1 切换到 0。 计数型信号量具有更大的范围可以从 0 到一个设定的最大数值之间进行计数。
4.使用场景
二值信号量适用于互斥访问共享资源的场景例如保护共享数据结构、保证一次只有一个任务执行临界区等。 计数型信号量适用于控制并发执行数量的场景或者用于任务间的生产者-消费者模型等
三、信号量和队列的区别
1.功能
信号量信号量是一种用于任务间同步和互斥的机制。它可以用于保护共享资源、限制并发访问、控制任务的执行顺序等。信号量具有两种类型二值信号量和计数型信号量。
队列队列是一种用于任务间传递数据的机制。它允许任务按照先进先出FIFO的顺序共享数据。任务可以将数据发送到队列并从队列接收数据。队列的长度限制了可以在其中排队的数据项的数量。
2.数据传输方式
信号量信号量一般用于同步和互斥不直接传输数据。通过获取和释放信号量来控制任务对资源的访问。二值信号量和计数型信号量的获取和释放操作可以用来表示任务的事件和计数。
队列队列用于任务间传递数据。任务通过发送和接收操作将数据项从一个任务传递到另一个任务。发送操作将数据项复制到队列中接收操作将数据项从队列中复制到接收任务的缓冲区中。
3.数据复制
信号量信号量在任务间的数据共享过程中通常不涉及数据复制。它们通常用于任务间对资源的访问控制而不是实际的数据传输。二值信号量和计数型信号量是通过操作信号量的计数值来控制任务的行为。
队列队列在任务间传递数据时涉及数据的复制。发送任务向队列发送数据项时数据项的副本将存储在队列中。接收任务从队列接收数据项时队列将数据项的副本复制到接收任务的缓冲区中。
4.用途
信号量信号量在需要任务进行同步和互斥的场景下非常有用。例如保护共享资源、控制并发访问、任务的事件通知等。
队列队列在需要任务间传递数据的场景下非常有用。例如实现生产者-消费者模型、任务间的消息传递、任务间的数据通信等。
综上所述信号量主要用于同步和互斥控制任务对资源的访问。它们不直接传输数据而是控制任务的行为。队列则用于任务间传递数据按照先进先出的顺序共享数据项。选择使用信号量还是队列取决于需求如任务间的数据传输、共享资源的访问控制以及任务的同步需求。
四、信号量相关的函数
1.创建函数
创建二值信号量函数
xSemaphoreCreateBinary 函数原型
SemaphoreHandle_t xSemaphoreCreateBinary( void );
参数无 返回值SemaphoreHandle_t一个二值信号量的句柄。
创建计数信号量函数
xSemaphoreCreateCounting 函数原型
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );
参数 uxMaxCount信号量的最大计数值即最多可以计数到多少。 uxInitialCount信号量的初始计数值通常为 0。 返回值SemaphoreHandle_t一个计数型信号量的句柄。
2.删除函数
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
参数 xSemaphore要删除的信号量的句柄。 要注意的是删除一个信号量前请确保没有任务正在等待该信号量否则可能导致未定义的行为。在删除信号量之前可以使用 uxSemaphoreGetCount 函数来获取当前信号量的计数值以确保没有任务在等待。
3.获取和释放信号量函数
获取信号量函数
xSemaphoreGive 函数原型
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
参数 xSemaphore信号量的句柄。 返回值如果成功释放信号量则返回 pdPASS1否则返回 pdFAIL0。
中断中释放信号量函数
xSemaphoreGiveFromISR 函数原型
BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );
xSemaphore信号量的句柄。 pxHigherPriorityTaskWoken一个指向 BaseType_t 类型的变量的指针用于指示在 ISR 中调用时是否唤醒了更高优先级的任务。 返回值如果成功释放信号量则返回 pdPASS1否则返回 pdFAIL0。
xSemaphoreGive 函数原型
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
参数 xSemaphore信号量的句柄。 返回值如果成功释放信号量则返回 pdPASS1否则返回 pdFAIL0。
总结
本篇文章主要讲解了信号量的概念及API函数使用大家看完后可以做个总结并进行对应的实验。