四、共享資源保護
阿新 • • 發佈:2021-08-15
一、共享資源
典型的共享資源有:變數(靜態或全域性)、資料結構體、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");
釋放訊號量
}
}