1. 程式人生 > 其它 >四、共享資源保護

四、共享資源保護

一、共享資源

典型的共享資源有:變數(靜態或全域性)、資料結構體、RAM中的表格、I/O裝置中的暫存器、多個任務訪問的函式等。 共享資源的可靠訪問,任務必須對資料具有獨享權變得極其重要,否則將可能導致任務間的競爭與資料損壞。 最常用的獨佔共享資源的方法有以下幾種:
  • 關中斷
  • 禁止任務排程
  • 使用訊號量
  • 使用互斥型訊號量(互斥鎖)
獨佔共享資源的方法,取決於程式碼訪問共享資源的速度,即佔用共享資源的時間(重點),具體使用說明如下表:

二、選擇題

1.以下請問使用( A )方式保護最為合適。

void T1(void *parg)
{
	while(1)
	{ 
         ...........
	        喂狗	
         ...........		
	}
}
A. 關中斷、開中斷   B.給排程器上鎖、解鎖   C.訊號量   D.互斥鎖

2.以下請問使用( B )方式保護最為合適。

uint32 g=0;
void T1(void *parg)
{
	while(1)
	{ 
         ...........
	        g++;	
         ...........		
	}
}

void T2(void *parg)
{
   uint32_t a=0;
	while(1)
	{ 
         ...........
	        a = g;	
         ...........		
	}
}
A. 關中斷、開中斷   B.給排程器上鎖、解鎖   C.訊號量   D.互斥鎖

3.以下請問使用( A )方式保護最為合適。

uint32 g=0;

void T1(void *parg)
{
	while(1)
	{ 
         ...........
	        g++;	
         ...........		
	}
}

void T2(void *parg)
{
   uint32_t a=0;
	while(1)
	{ 
         ...........
	        a = g;	
         ...........		
	}
}

void USART1_IRQHandler(void)
{
    
         ...........
	        g = USART_ReceiveData(USART1);	
         ...........  
    
}
A. 關中斷、開中斷   B.給排程器上鎖、解鎖   C.訊號量   D.互斥鎖

4.以下請問使用( C )方式保護最為合適。

void T1(void *parg)
{
	while(1)
	{ 
         ...........
         printf("hello teacher.wen\r\n");	
         ...........		
	}
}

void T2(void *parg)
{

	while(1)
	{ 
         ...........
         printf("good bye teacher.wen\r\n");	
         ...........		
	}
}

 

A. 關中斷、開中斷   B.給排程器上鎖、解鎖   C.訊號量   D.互斥鎖

5.以下請問使用( D )方式保護最為合適。

void T1(void *parg)
{
	while(1)
	{ 
         ...........
         printf("hello teacher.wen\r\n");	
         ...........		
	}
}

void T2(void *parg)
{

	while(1)
	{ 
         ...........
         printf("good bye teacher.wen\r\n");	
         ...........		
	}
}

void T3(void *parg)
{
	while(1)
	{ 
         ...........
         printf("he's teacher.wen\r\n");	
         ...........		
	}
}

 

A. 關中斷、開中斷   B.給排程器上鎖、解鎖   C.訊號量   D.互斥鎖

三、辨析題

1.請分析以下程式碼。

void T1(void *parg)
{

	while(1)
	{ 
            排程器上鎖
            printf("hello teacher.wen\r\n");
            delay_ms(1000)	
            排程器解鎖		
	}
}

void T2(void *parg)
{
	while(1)
	{ 
            排程器上鎖
            printf("good bye teacher.wen\r\n");
            delay_ms(1000)	
            排程器解鎖			
	}
}

2.請分析以下程式碼。

void T1(void *parg)
{

	while(1)
	{ 
            等待互斥鎖
            printf("hello teacher.wen\r\n");
            OLED_ShowString(0,2,"this is task 1\r\n");
            釋放互斥鎖		
	}
}

void T2(void *parg)
{
   uint8_t buf[5]={0};
	while(1)
	{ 
            等待互斥鎖
            printf("good bye teacher.wen\r\n");
            dht11_read(buf)
            ......
            釋放互斥鎖			
	}
}

3.請分析以下程式碼。

void T1(void *parg)
{

	while(1)
	{ 
            等待互斥鎖
            printf("hello teacher.wen\r\n");
            OLED_ShowString(0,2,"this is task 1\r\n");
            釋放互斥鎖		
	}
}

void T2(void *parg)
{
   uint8_t buf[5]={0};
	while(1)
	{ 
            等待互斥鎖
            printf("good bye teacher.wen\r\n");
            dht11_read(buf)
            ......
            釋放互斥鎖			
	}
}

4.請分析以下程式碼。

void app_task_init(void *parg)
{
    建立訊號量,初值為0
}

void T1(void *parg)
{
	while(1)
	{ 
            等待訊號量
            printf("hello teacher.wen\r\n");
            釋放訊號量		
	}
}

void T2(void *parg)
{
	while(1)
	{ 
            等待訊號量
            printf("good bye teacher.wen\r\n");
            釋放訊號量			
	}
}