自由RTOS互斥锁
信号量是任务与任务之间、任务与中断之间同步的重要方式,二元信号量与互斥很相似。 两者的区别在于优先级继承机制,如果另一个具有较高优先级的任务尝试获得相同的独占锁,则已经获得独占锁的任务将继承尝试获得相同独占锁的任务的优先级。 另一方面,由于信号量没有这种机制,二元信号量适合实现同步,而排他锁适合实现简单的排他锁。 必须注意的是,独占锁必须在使用资源后返回。 否则,高优先级任务将永远无法获得独占锁,低优先级任务将不会放弃继承优先级。 因为二维信号量不需要在得到后立即释放,所以同步操作通常可以通过一个任务或中断持续释放信号量,另一个任务持续获得信号量来实现。
一.简单例行程序
排他锁的主要作用是保护资源,创建全局变量test_value作为共享资源。 其中,任务2每10毫秒申请操作资源,将test_value分配为1,任务1每100ms申请排他锁,成功后将test_value清零,等待1秒,1秒内test_value变为
/* includes. */
#包含
#include 'FreeRTOS.h '
#include 'task.h '
#include 'queue.h '
#include 'stm32f10x.h '
#include 'semphr.h '
#include 'portmacro.h '
staticvoidprvsetuphardware (void;
voidvprinttask (void * PV parameters;
voidvtask1(void*PVparameters;
voidvtask2(void * PV参数;
voidvledinit(void;
voiduartinit(void;
#defineleD1_on(gpio_setbits ) gpiob,GPIO_Pin_0) ) ) ) ) ) ) ) ) ) ) ) 652
# define led1_ off (gpio _ reset bits (gpiob,GPIO_Pin_0) ) ) ) ) ) ) ) ) ) ) ) ) )。)
semaphore handle _ tx semaphore=null;
unsigned int test_value=0;
入主(void ) )。
{
prvSetupHardware (;
/*创建独占信号量*
xsemaphore=xsemaphorecreatemutex (
xaskcreate(vTask1,' vtask1',configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY 6,NULL );
xaskcreate(vTask2,' vtask2',configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY 7,NULL );
vTaskStartScheduler (;
返回0;
}
voidvtask1(void * PV参数) )。
{
TickType_t xLastWakeTime;
while(1)。
{
xsemaphoretake (xsemaphore,port max _ delay==PD true ) ) )。
{
test_value=0;
xlastwaketime=xtaskgettickcount (;
vtaskdelayuntil(xlastwaketime,1000/portTICK_RATE_MS );
if (! test_value )
打印(测试! rn ';
else
printf (测试假! rn ';
xsemaphoregive(xsemaphore;
}
xlastwaketime=xtaskgettickcount (;
vtaskdelayuntil(xlastwaketime,100/portTICK_RATE_MS );
}
}
voidvtask2(void * PV参数) )。
{
TickType_t xLastWakeTime;
while(1)。
{
xsemaphoretake (xsemaphore,port max _ delay==PD true ) ) )。
{
test_value=1;
xsemaphoregive(xsemaphore;
}
xlastwaketime=xtaskgettickcount (;
taskdelayuntil(xlastwaketime,10/portTICK_RATE_MS );
}
}
结果:
二.分析
semaphore handle _ tx semaphore=null;
创建独占锁定句柄。
xsemaphore=xsemaphorecreatemutex (
创建互斥锁。
xsemaphoretake(xsemaphore,portMAX_DELAY ) ) ) ) ) ) )。
申请独占锁,第一个参数是独占锁句柄,第二个参数是最大等待时间,如果成功则返回pdTRUE,如果失败则返回pdFALSE。
xsemaphoregive(xsemaphore;
解除互斥锁。
三.其他
要使用互斥锁,FreeRTOSConfig.h中必须有宏定义#define configUSE_MUTEXES 1