網站首頁 學習教育 IT科技 金融知識 旅遊規劃 生活小知識 家鄉美食 養生小知識 健身運動 美容百科 遊戲知識 綜合知識
當前位置:趣知科普吧 > 綜合知識 > 

嵌入式思考題:什麼是臨界代碼段,進出臨界代碼段的必須進行是哪行|單片機臨界段代碼怎麼寫

欄目: 綜合知識 / 發佈於: / 人氣:2.89W
1.嵌入式思考題:什麼是臨界代碼段,進出臨界代碼段的必須進行是哪行

嵌入式還有臨界代碼這麼高端?

單片機臨界段代碼怎麼寫 嵌入式思考題:什麼是臨界代碼段,進出臨界代碼段的必須進行是哪行

計算機世界裏面的臨界代碼段一般是指多線程下多個線程想要執行同一段代碼的情況,這一個同一段代碼就叫做臨界代碼段。

具體看你寫什麼程序,不同程序有不同的要求。

進出臨界代碼段的話,如果進入的線程數量等於程序要求的最大併發執行數量的話就應該對臨界代碼段進行鎖定,讓其他想進入臨界代碼段的線程進入阻塞狀態,等待執行狀態的線程執行完以後再申請進入臨界代碼段。出來也是差不多,線程出臨界代碼段應該釋放有關的代碼段資源(一般是弄成信號量、有的書會寫叫做同步鎖,反正都是一個意思),反正就是解鎖,然後進入阻塞狀態。

簡單來說,線程去申請執行臨界代碼段,如果發現滿足條件將可以執行就執行,如果發現臨界代碼段被鎖定了就掛起進入阻塞,等待能有信號量的時候再去申請。

那一本日本人寫的很有名的多線程書的比喻來說,臨界代碼段其實可以看成是一個房子或者是看成是電梯,人就相當於線程,當電梯到達最大載重的時候,這時候人就不能進入電梯,就好比當前臨界代碼段同時併發執行的線程到達程序設定的最大數量的時候,就不能再給新的線程進入了,就如電梯那樣,再進人就超載了,這個時候想進電梯的人就必須在外面重新等待,等待電梯上的人到達所要到的樓層以後,再騰出空位接新的乘客一樣。。。有位置就可以進,沒有位置就得等(也就數進入阻塞狀態),等到有位置電梯自然會通知你,然後你跟其他人一起重新排隊等待進入電梯。。。大概也就是這個過程。

如果覺得說的好,請採納。

2.單片機代碼編寫

假設:

P0和P1接數碼管顯示,

熄滅P1.0用低電平,

按鍵盤P3.2按下是低電平,

程序如下:

1 ORG 0000H

0000 020030 2 LJMP 0030H

3 ORG 0030H

0030 75803F 4 MOV P0,#3FH

0033 7590FF 5 MOV P1,#0FFH

0036 75A000 6 MOV P2,#00H

0039 C290 7 CLR P1.0

003B D2B2 8 L01: SETB P3.2

003D 20B209 9 JB P3.2,L02

0040 75805B 10 MOV P0,#5BH

0043 75905B 11 MOV P1,#5BH

0046 02003B 12 LJMP L01

0049 75803F 13 L02: MOV P0,#3FH

004C 7590FF 14 MOV P1,#0FFH

004F 02003B 15 LJMP L01

16 END

3.單片機一段代碼,求解釋

前面改一下 ORG 0000H

LJMP START

ORG 000BH

LJMP TIME0T

ORG 0030H意思是程序從0地址開始跳轉主程序,定時器0中斷入口地址000BH,主程序地址從0030H開始。

主程序中MOV SP,#70H是指堆棧從70H開始(默認爲07H,由於0BH要放定時器0中斷的入口地址,07H到0AH明顯不夠,所以將堆棧開闢到70H後)

MOV TMOD,#01H

MOV TH0,#00H

MOV TL0,#01H

SETB EA

SETB ET0

SETB TR0爲定時器0的初始化和開中斷

LOOP: INC R1

LJMP LOOP用來無限循環(即等待中斷)

當定時器0從0001H開始加直到溢出後從主程序跳到定時器0的中斷子程序。

TIME0T: MOV TH0,#00H

MOV TL0,#01H 中斷子程序中這兩句用來設定初值

MOV A,P1 主程序中給P1賦值爲08H,這句將寄存器A賦值08H

JB ACC.0, TT1 這句用來判斷寄存器A的最低位是否爲1,不是的話A循環右移然後跳轉到子程序TT2(TT2的作用是將循環右移後的值重新賦給P1),是的話跳轉TT1(TT1的作用是重新賦值A爲08H)然後執行TT2即將A的值給P1。

總得來看是原先P1=00001000b,主程序等待,當定時中斷觸發,在中斷子程序中將P1值給A即A=00001000b,顯然ACC.0=0,那麼執行RR A,這是A=00000100b,TT2中將A的值給P1即P1=00000100b,等待下一次定時器0溢出執行中斷子程序,跟上面一樣A=00000100b,顯然ACC.0任爲0,A繼續循環右移,A=00000010b,繼續以上,下一次循環右移後A=00000001b,再下一次執行JB ACC.0, TT1時,顯然ACC.0=1,就跳轉TT1即P1重新賦值爲08H,就這樣不斷循環。

可以用來當流水燈。

4.這個單片機代碼怎麼寫 求大神解答最好有註釋阿

#include#define uchar unsigned char#define uint unsigned intsbit RED_A=P1^0; //東西向燈sbit YELLOW_A=P1^1;sbit GREEN_A=P1^2;sbit RED_B=P1^5; //南北向燈sbit YELLOW_B=P1^6;sbit GREEN_B=P1^7;uchar Flash_Count=0,Operation_Type=1; //閃爍次數,操作類型變量//延時void DelayMS(uint x){ uchari; while(x--)for(i=0;i<120;i++);}//交通燈切換void Traffic_Light(){ switch(Operation_Type) { case1: //東西向綠燈與南北向紅燈亮 RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=0;YELLOW_B=1;GREEN_B=1; DelayMS(2000); Operation_Type=2; break; case2: //東西向黃燈閃爍,綠燈關閉 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10)return; //閃爍5次 Flash_Count=0; Operation_Type=3; break; case3: //東西向紅燈,南北向綠燈亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break; case4: //南北向黃燈閃爍5次 DelayMS(300); YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10)return; Flash_Count=0; Operation_Type=1; }}//主程序void main(){ while(1)Traffic_Light();}。

5.51單片機的一個短代碼,幫看看

這是三個問題。

;------------------------------------------

將片內20H~2FH及片外0010H~001FH單元清0;

代碼是:

ORG 0000H

CLR A

MOV R0, #20H

IN0:

MOV @R0, A

INC R0

CJNE R0, #30H, IN0

;------------------------------------------

然後將片內30H~3FH的數據移到片外0000H~000FH中;

代碼是:

;這裏,應該先寫一段,對30H~3FH送入數據的程序

MOV R0, #30H

MOV DPTR, #0000H

INN:

MOV A, @R0

MOVX @DPTR, A

INC R0

INC DPTR

CJNE R0, #40H, INN

;------------------------------------------

判斷:

若(30H)≤10,則求其平方存到31H中,並將位00H置1(其它位清0)

若(30H)=10, 則將AA存到31H中,並位01H置1(其它位清0)

若(30H)≥10,則減10存到31H中,並位02H置1(其它位清0)

;這裏,應該先寫一段:對30H送入數據的程序,如:

MOV 30, #10

判斷代碼是:

CLR 20H.0

CLR 20H.1

CLR 20H.2

MOV A, 30H

CLR C

SUBB A, #10

JZ DENG

JC SMA

BIG:

MOV 31H, A

SETB 20H.2

JMP OUT

SMA:

MOV A, 30H

MOV B, A

MUL AB

MOV 31H, A

SETB 20H.0

JMP OUT

DENG:

MOV 31H, #0AAH

SETB 20H.1

OUT:

SJMP $

END

6.單片機課設代碼 要詳細講解

這是我以前自己寫的一個實例,你看一下,課程設計還有一些必須東西你自己加,你用這個參考下 實驗的目的就是寫一個可以調時間的電子時鐘。

它使用七段數碼管顯示。我買的單片機開發板上自帶有兩個四位的數碼管。

一般數碼管的顯示驅動可以有幾種方法,直接驅動顯示和循環掃描顯示這是兩種最常用的方法。用於單片機的IO口只有區區的32個,用直接驅動顯示就是很浪費IO口的資源 ,但是它的電路很容易理解。

我用的板子上的數碼管是使用循環掃描法顯示的。每一個四位數碼管都有12根引腳。

其中的8根用於輸入信號,4根用來做選通 用。循環掃描是利用人眼的視覺誤差來達到顯示目的的。

它是一位接一位的選通(直接驅動顯示就是同時都選通),它的選通頻率非常的高,這樣人看起來就好像數碼管的每一位都同時在亮。如果一個數碼管一秒中亮10次,我們眼睛就可以看到他在閃,如果它一秒亮幾萬次的話,我們人眼看到的效果就是它一直都在亮而並沒有閃。

我第一次寫的那個程序就是能夠看到數碼管在閃,因爲我寫顯示子程序的時候用的延時時間太長了,這樣單位時間內選通次數也就減少了,人眼就能看到它在閃了。透過修改延時,將延時時間縮短,改過之後就看不到他在閃了。

下面是我使用的數碼管的邏輯電路圖,實際電路圖也很簡單。 它使用P0口用作輸入信號,P2口用於輸入選通信號。

數碼管是使用共陽接法。那麼低電平就是有效電平。

選通信號可以看出也是低電平有效。數碼管的連接原理也很簡單:每一位數碼管的每一段和每一位數碼管的小數點按序連接到P0端口,8位數碼管都這樣連接到P0端口,即每一位數碼管的第一段並聯在一起後然後再與P0.0相串聯。

每一位數碼管都有一個選通引腳。8位數碼管就需要8個選通引腳。

上圖中的P2.0--P2.7就是都起選通作用。在寫程序的時候就是一位接一位分別選通並且都是透過P0口傳送數據。

當有很多位時,可以用一個譯碼器進行選通這樣也能節約IO口資源。如下所示: MOV P0, #DATA CLR P2.0 LCALL DELAY ;延時一段時間 循環賦值並依次選通各位數碼管 使用共陽接法的數碼管在寫程序的時候如果使用查表法的時候那個表格數據可以這樣定義: TABLE:DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H 在單片機彙編中,8位的立即數如果高四位的值大於等於A,前面一定要加零,否則在編譯的時候就會有錯誤,提示是你的程序中有一個未定義的符號。

不加零時編譯器KEIL uvision2將立即數視爲符號。我想這是初學者很容易忽略的一個問題。

在用C編寫時十六進制立即數只要在其前面加0X就可以了。 下面將這次實例中我做的源程序列出來,然後一點點分析其中要注意的知識點: 源程序;************************************************************************; 這是一個單片機時鐘程序,RESET後顯示12-00-00; 調時方法:按下S6鍵後,進入調時設定; 按S3鍵,可以調整小時; 按S1鍵,可以調整十分鐘位; 按S4鍵,可以調整分鐘位; 按S2鍵,可以調整十秒位; 按S5鍵,可以調整秒位; 再次按S6鍵,退出調時設定;************************************************************************SECOND EQU 30H ;定義顯示緩衝區TSECOND EQU 31HMINUTE EQU 32HTMINUTE EQU 33HHOUR EQU 34HTCOUNT EQU 35H ORG 0000H ;中斷向量表AJMP MAINORG 0003HLJMP INT_X0ORG 000BHLJMP INT_T0 MAIN:MOV DPTR, #TABLE ;初始化賦值 MOV TCOUNT, #00 MOV SECOND, #00 ;賦顯示初值,顯示初始化 MOV TSECOND, #00 MOV MINUTE, #00 MOV TMINUTE, #00 MOV HOUR, #12 MOV TMOD, #01H ;定時計數器採用工作方式1 MOV TH0, #0D8H ;賦定時初值爲10ms MOV TL0, #0F0H SETB IT0 ;使定時計數器0中斷和外部中斷0使能 SETB TR0 SETB ET0 SETB EX0 SETB EALOOP:LCALL DISPLAY AJMP LOOP INT_X0:LCALL DELAY ;外部中斷0中斷服務子程序 JB P3.2, EXIT JNB P3.2, $ LOOP1:LCALL DISPLAY JB P3.2, N1 LCALL DELAY JNB P3.2, EXIT N1:JB P3.3, N2 LCALL DELAY JB P3.3, N2 INC HOUR MOV A, HOUR CJNE A, #24, G1 MOV HOUR, #00 G1:JNB P3.3, $ N2:JB P3.4, N3 LCALL DELAY JB P3.4, N3 INC TMINUTE MOV A, TMINUTE CJNE A, #6, G2 MOV TMINUTE, #00 G2:JNB P3.4, $ N3:JB P3.5, N4 LCALL DELAY JB P3.5, N4 INC MINUTE MOV A, MINUTE CJNE A, #10, G3 MOV MINUTE, #00 G3:JNB P3.5, $ N4:JB P3.6, N5 LCALL DELAY JB P3.6, N5 INC TSECOND MOV A, TSECOND CJNE A, #6, G4 MOV TSECOND, #00 G4:JNB P3.6, $ N5:JB P3.7, NEXT LCALL DELAY JB P3.7, NEXT INC SECOND MOV A, SECOND CJNE A, #10, G5 MOV SECOND, #00 G5:JNB P3.7, $ NEXT:AJMP LOOP1 EXIT: JNB P3.2, $ RETI INT_T0:MOV TH0, #0D8H ;定時器T0中斷服務程序入口 MOV TL0, #0F0H INC TCOUNT MOV A, TCOUNT CJNE A, #100, EXIT_T0 INC SECOND MOV TCOUNT, #00 MOV A, SECOND CJNE A, #10, EXIT_T0 INC 。

7.單片機定時器實驗的代碼怎麼寫

如果是100ms中斷一次,那麼晶振需要用6MHz

#include

#define uchar unsigned char

uchar t1,sec1,dscan=0,dis[3]={0,0,0};

uchar table={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t1++;

if(t1>=20)

{

t1=0;

sec1++;

dis[0]=sec1%10;

dis[1]=sec1%100/10;

dis[2]=sec1/100;

}

}

void t1isr() interrupt 3

{

TH1=(65536-5000)/256;

TL1=(65536-5000)%256;

P2=1P0=table[dis[dscan]];

}

main()

{

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-5000)/256;

TL1=(65536-5000)%256;

TR0=1;

ET0=1;

TR1=1;

ET1=1;

EA=1;

t1=0;

sec1=0;

while(1);

}