藍橋杯-單片機組基礎6——定時計數器與外部中斷混合使用(附小蜜蜂課程代碼)

藍橋杯單片機組備賽指南請查看這篇文章:戳此跳轉藍橋杯備賽指南文章

本文章針對藍橋杯-單片機組比賽開發板所寫,代碼可直接在比賽開發板上使用。

型號:國信天長4T開發板(綠板),芯片:IAP15F2K61S2

(使用國信天長藍板也可以完美兼容,與綠板幾乎無差別)


1.編程目的

????????通過定時/計數器實現數碼管的時鐘顯示,顯示格式例如“12-13-14”,表示12點13分14秒時刻。并通過設置外部中斷0,當S5按下時計時暫停,再次按下時繼續計時。

2.定時/計數器原理

2.1 單片機的基本中斷系統

????????比賽用單片機最多允許兩層中斷的嵌套。即在低級的中斷服務函數執行過程中,收到了更高級的中斷信號,而去先執行更高級的中斷工作,執行完再返回繼續執行低級的中斷工作,低級的中斷工作做完,再回到最原本的代碼繼續執行。

? ? ? ? 本文中,我們使用到的外部中斷0與定時/計數器中斷0,本身自帶優先級,且INT0的優先級已經高于T0,因此我們不需要對兩個中斷的優先級進行單獨設置。

比賽用芯片IAP15F2K61S2 涉及的中斷共有14個,這里介紹常用的5個:

中斷號中斷名中斷名解釋
0INT0外部中斷0
1T0定時/計數器中斷0
2INT1外部中斷1
3T1定時/計數器1
4TI/RI串口中斷
5T2定時/計數器中斷2

本文聚焦外部中斷0與定時/計數器中斷0,只對INT0和T0進行講解,他們的中斷號對應為0和1。比賽用開發板中還有INT2,INT3,INT4,T2共計5個外部中斷信號源,三個定時/計數器中斷信號源,其余中斷源將在專欄“藍橋杯-單片機組進階”中講解。

2.2 什么是定時/計數器中斷

????????定時/計數器可以想象成一個每隔一定時間,就會自動產生一次中斷的開關。但它產生中斷的時間間隔是固定的,由我們來設置。中斷產生的感覺可以想象成一個正在接水的水桶,當水桶里的水接滿溢出時產生中斷,由此每次產生中斷所需要的時間就可以比擬成水桶接滿水的時間。那我們如果按照自己的需求,讓水桶接滿水的時間被人為精確控制呢?設置初值——即在最開始讓水桶里裝有一定數量的水,最開始水桶里面的水越多,水桶就越快溢出,產生中斷所需要的時間就越短。上述為口語化的理解,更本質的解釋如下:

????????

????????定時/計數器的核心是16位的加法計數器,在8位的51單片機中,使用兩個8位的寄存器THx和TLx共同組成16位,并分別叫做高8位和低8位。當這16位加法計數器計數溢出,則產生一次定時/計數器中斷。單片機的晶振我們假定是12Mhz,單片機會將12Mhz進行12分頻后傳入加法計數器中,即一個機器周期(12Mhz/12=1Mhz,Tcy=1us),此時,我們可以認為在晶振為12Mhz的單片機中,沒經過1us的時長,加法計數器的值加1 。假設我們讓16位加法計數器從0開始計數,即計數初值為0(0000 0000 0000 0000) ,當變成計數值變成(1111 1111 1111 1111)時在經過1us,計數器就會溢出,并產生一次定時/計數器中斷,此時計數值為65535? 。此時,我們可以認為在初值為0,16位計數器,晶振為12Mhz的單片機中,產生一次中斷所需要的時間為65535us=65.535ms 。當我們需要單片機50ms就產生一次中斷時,就可以設置初值為15535 (65.535ms-50.000ms) 。

????????實際的單片機中,為了方便我們的使用,晶振頻率可能為12Mhz,11.05926Mhz;同時在定時/計數器不同的工作方式下,計數器的位數可能為16位(最大值65535),13位(最大值8191),8位(最大值255);因此我們需要根據不同的設置,進行不同的計算。相關的計算過程可查看TMOD寄存器設置的部分。

2.3 定時/計數器中斷涉及的寄存器

????????為了簡短篇幅,下面將寄存器IP、IE、TCON簡略說明,詳細內容可以查看文章:戳此跳轉

我們著重介紹TMOD寄存器

兩級中斷允許控制:IE(interrupt enable)

EA-ET2ESET1EX1ET0EX0

IE中各位的功能如下:

EA—中斷總開關控制位,EA=1,所有的中斷請求開放。

ES—串行口中斷允許位。

ET1—定時器/計數器T1溢出中斷允許位。

EX1—外部中斷1中斷允許位。

ET0—定時器/計數器T0的溢出中斷允許位。

EX0—外部中斷0中斷允許位。

? ? ? ? 該寄存器允許位尋址,在編程時,如果只用到一個外部中斷0和T0,則我們只需要設置總開關EA、外部中斷0允許位EX0 、T0中斷允許為ET0。

兩級優先級控制:IP(interrupt priority)

--PT2PSPT1PX1PT0PX0

中斷優先級寄存器IP各位含義:

PS—串行口中斷優先級控制位,1—高級;0—低級。

PT1—T1中斷優先級控制位,1—高級;0—低級。

PX1—外部中斷1中斷優先級控制位,1—高級;0—低級。

PT0—T0中斷優先級控制位,1—高級;0—低級。

PX0—外部中斷0中斷優先級控制位,1—高級;0—低級。

? ? ? ? 該寄存器允許位尋址,本題中采用默認優先級,因此不用管這個寄存器。

特殊功能寄存器:TCON(timer controller)

TF1TR1TF0TR0IE1IT1IE0IT0

TCON寄存器中與中斷系統有關各標志位功能如下:

TF1—定時器/計數器T1的溢出中斷請求標志位。

TF0—定時器/計數器T0溢出中斷請求標志位似。

IE1—外部中斷請求1中斷請求標志位。

IE0—外部中斷請求0中斷請求標志位,與IE1類似。

IT1—選擇外中斷1請求方式。0--電平觸發方式,1--跳沿觸發方式。

IT0—選擇外中斷0請求方式。0--電平觸發方式,1--跳沿觸發方式。

?????????該寄存器允許位尋址,在編程時,如果只用到一個外部中斷0,則我們只需要設置IT0從而確定外部中斷0的觸發方式 。而對于TF0,它不需要我們設置,只是在程序中我們可以通過查詢TF0是否等于1,從而判斷T0是否溢出。

特殊方式寄存器:TMOD(timer mode)

GATEC/TM1M0GATEC/TM1M0
<----? 定時器1(T1)? ----><----? 定時器0(T0)? ---->

TMOD寄存器中與中斷系統有關各標志位功能如下:

????????通過觀察可以發現,TMOD寄存器左邊4位與右邊4位幾乎一樣,只是左邊針對定時/計數中斷1,右邊針對定時/計數中斷2。本文中我們使用T0,因此我們介紹T0各位的含義,T1與T0相同:

GATE: 用于控制定時器啟動是否受外部中斷源的影響?
? ? ? 當GATE=0時,只要用軟件使TR0或TR1等于1,就可以啟動T0或T1定時/計數器工作。
? ? ? 當GATE=1時,除了用軟件使TR0或TR1等于1外,還要使外部中斷引腳INT0/1為高電平,這樣定時/計數器才能啟動工作。
? ? ? 注意:GATE=0表示控制定時器啟動不受外部中斷源的影響

?C/T=0為定時模式,C/T=1為計數模式。
?

M1 M0工作方式選擇位,兩位一起看:

M1 M0工作方式工作說明
00方式013位定時/計數器,最大值8192
01方式116位定時/計數器,最大值65535
10方式28位自動重裝定時/計數器,最大值255
11方式3T1分成兩個獨立的定時/計數器,T1停止計數

舉例:我們在12Mhz的單片機中,不設置外部中斷觸發定時,設置T0工作在方式1,實現50ms的定時中斷。則GATE=0,C/T=0,M1 M0=01 ,剩下的位全部賦值0,則TMOD應該賦值:TMOD=0000 0001=0x01? 。

????????該寄存器不可位尋址,編程時,我們必須對TMOD寄存器進行整體賦值,才能正確設置。充分考慮要使用T1或者T0,然后進行對應位的設置,并轉換成BCD碼寫入代碼。?

初值寄存器:THx TLx

????????如果是使用T1,則初值的高8位寄存器為TH1,低8位寄存器為TL1

????????如果是使用T0,則初值的高8位寄存器為TH0,低8位寄存器為TL0

????????如果T1和T0都使用,則TH1,TL1,TH0,TL0都需要設置初值

????????

????????藍橋杯比賽使用的開發板是12Mhz的,剛好對于加法器加1的時長為1us。假如我們設置TMOD寄存器使得定時/計數器工作在方式1,最大計數值為65535,則最長的中斷間隔時長為65535us=65.535ms 。如果我們需要的中斷間隔時長為50ms,即每50ms產生一次中斷,則我們需要讓加法器有一個固定的初值為65.535ms-50.000ms=15.535ms。則初值為15535,轉換成16進制為:3caf。高8位為3c,需要賦值給THx,低8位位af,需要賦值給TLx。

????????但每次轉換進制很麻煩,因此我們可以通過以下公式,快速寫出代碼:

????????最大值就是工作方式的最大計數值,方式1為16位定時/計數器,2 ^16=65535,即最大值為65535 。定時值是我們的定時時長,如果是50ms,則為50 000us,即定時值為50000 。帶入式子即可在運行時由單片機自己進行運算,方便我們進行代碼編寫。注意:當計算式確定之后,還是要手動把計算結果替換進賦值表達式,減少單片機資源占用。

3.編程中涉及的中斷函數

3.1 定時/計數器初始化函數

????????目的:使用T0產生一個9.216ms的定時/計數中斷

????????該函數中,首先是對TMOD進行設置,方式一,定時中斷,無需外部中斷,只是用T0,因此為0x01 。然后設定計數初值,對TH0,TL0進行賦值。EA和ET0是IE寄存器的對應位,作用分別為打開總中斷,打開定時/計數器T0中斷。TR0是TCON寄存器的對應位,作用為T0開始計數。

3.2 定時/計數器服務函數

????????中斷的服務函數,作用是當中斷產生時,系統暫停當前工作,而去執行中斷服務函數里面的程序,執行完服務函數的程序后,再返回繼續執行先前的工作。在這個函數中,首先我們對初值寄存器TH0和TL0進行賦值,因為工作方式1不會自動重裝初值,只有工作方式2(8位自動重裝方式)會自動重新裝載初值,因此除了方式2以外的所有方式,都需要在中斷服務函數中重新對THx和TL0重新賦值。然后下面的自增指令是我們自己定義的功能。

4.代碼參考

4.1 編程目的代碼,代碼效果:

實現數碼管的時鐘顯示,顯示格式例如“23-20-00”,表示23點20分00秒時刻。并通過設置外部中斷0,當S5按下時計時暫停,再次按下時繼續計時。

//寫一個計時器,分-秒-20ms
#include < REGX52.h >
#include < INTRINS.h >unsigned char code SMG_duanma [18]={ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,0xbf , 0x7f };sbit S5 = P3^2;void select_HC573 ( unsigned char channal )
{switch ( channal ){case 4:P2 = ( P2 & 0x1f ) | 0x80;break;case 5:P2 = ( P2 & 0x1f ) | 0xa0;break;		case 6:P2 = ( P2 & 0x1f ) | 0xc0;break;case 7:P2 = ( P2 & 0x1f ) | 0xe0;break;}
}void Input_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{select_HC573 ( 6 );P0 = 0x01 << pos_SMG;select_HC573 ( 7 );P0 = value_SMG;
}void Delay ( unsigned char t )
{while ( t-- ){unsigned char i,j;_nop_ ();_nop_ ();i = 22;j = 128;do {while ( --j );}while ( --i );	}
}//=======================================
void Init_timer0_INT0 ()
{//設置T0初始化TMOD = 0x01;TH0 = ( 65535 - 18433 ) / 256;TL0 = ( 65535 - 18433 ) % 256;ET0 = 1;//設置INT0初始化IT0 = 1;EX0 = 1;//打開總中斷開關,以及啟動定時器EA = 1;TR0 = 1;
}unsigned char state_INT0 = 0;
void Service_INT0 () interrupt 0
{	state_INT0+=1;//注意 這里有按鍵產生中斷的操作,但是沒有進行消抖處理//但是中斷的執行過程會過濾掉部分抖動時間//因此按下S5只要不是很刁鉆,單片機都會正確響應//正常情況下,不推薦在服務函數中寫入if語句,這里為了使用外部中斷,無法使用消抖處理,因此出此下策if( state_INT0%2==0 ){TR0 = 1;}else{TR0 = 0;}}unsigned char timer0_50ms = 0;
void Service_timer0 () interrupt 1
{TH0 = ( 65535 - 50000 ) / 256;TL0 = ( 65535 - 50000 ) % 256;timer0_50ms ++;
}
//========================================unsigned char timer0_s = 00;
unsigned char timer0_m = 20;
unsigned char timer0_h = 23;
void time_SMGrunning ()
{if ( timer0_50ms == 20 ){timer0_s ++;timer0_50ms = 0;if ( timer0_s == 60 ){timer0_m ++;timer0_s = 0;timer0_50ms = 0;if ( timer0_m == 60 ){ timer0_m = 0;timer0_h++;}			}}Input_SMG ( 7 , SMG_duanma[ timer0_s%10 ] );Delay ( 1 );Input_SMG ( 6 , SMG_duanma[ timer0_s/10 ] );Delay ( 1 );Input_SMG ( 5 , SMG_duanma[16] );Delay ( 1 );Input_SMG ( 4 , SMG_duanma[ timer0_m%10 ] );Delay ( 1 );Input_SMG ( 3 , SMG_duanma[ timer0_m/10 ] );Delay ( 1 );Input_SMG ( 2 , SMG_duanma[16] );Delay ( 1 );Input_SMG ( 1 , SMG_duanma[ timer0_h%10 ] );Delay ( 1 );Input_SMG ( 0 , SMG_duanma[ timer0_h/10 ] );Delay ( 1 );
}void main ()
{Init_timer0_INT0 ();while ( 1 ){time_SMGrunning ();}
}

4.2 小蜜蜂課程代碼:

代碼1://使用定時器實現間隔時間閃爍燈光

//使用定時器實現間隔時間閃爍燈光
#include < REGX52.h >sbit L1 = P0^0;
sbit L8 = P0^7;
unsigned char code SMG_duanma [18]={ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,0xbf , 0x7f };void select_HC573 ( unsigned char channal )
{switch ( channal ){case 4:P2 = ( P0 & 0x1f ) | 0x80;break;case 5:P2 = ( P0 & 0x1f ) | 0xa0;break;		case 6:P2 = ( P0 & 0x1f ) | 0xc0;break;		case 7:P2 = ( P0 & 0x1f ) | 0xe0;break;		}
}void Input_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{select_HC573 ( 6 );P0 = 0x01 << pos_SMG;select_HC573 ( 7 );P0 = value_SMG;}///============================================
void Init_Timer0 ()
{TMOD = 0x01;TH0 = (65535-9216) / 256;TL0 = (65535-9216) % 256;EA = 1;		TR0 = 1;	ET0 = 1;	
}unsigned char count_timer0;
unsigned char value_SMG=0;
void Service_timer0 () interrupt 1
{TH0 = (65535-9216) / 256;TL0 = (65535-9216) % 256;count_timer0++;
}void Time_Led_Timer0 ()
{	if ( count_timer0 == 100 ){count_timer0 = 0;value_SMG++;		Input_SMG ( 0 , SMG_duanma [value_SMG] );}if ( value_SMG == 9 ){value_SMG = 0;}}//=============================================void main ()
{Init_Timer0 ();while ( 1 ){Time_Led_Timer0 ();}
}

代碼2://寫一個計時器,分-秒-20ms

//寫一個計時器,分-秒-20ms
#include < REGX52.h >
#include < INTRINS.h >unsigned char code SMG_duanma [18]={ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,0xbf , 0x7f };sbit S5 = P3^2;
sbit S4 = P3^3;void select_HC573 ( unsigned char channal )
{switch ( channal ){case 4:P2 = ( P2 & 0x1f ) | 0x80;break;case 5:P2 = ( P2 & 0x1f ) | 0xa0;break;		case 6:P2 = ( P2 & 0x1f ) | 0xc0;break;case 7:P2 = ( P2 & 0x1f ) | 0xe0;break;}
}void Input_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{select_HC573 ( 6 );P0 = 0x01 << pos_SMG;select_HC573 ( 7 );P0 = value_SMG;
}void Delay ( unsigned char t )
{while ( t-- ){unsigned char i,j;_nop_ ();_nop_ ();i = 22;j = 128;do {while ( --j );}while ( --i );	}
}//=======================================
void Init_timer0 ()
{TMOD = 0x01;TH0 = ( 65535 - 18433 ) / 256;TL0 = ( 65535 - 18433 ) % 256;ET0 = 1;EA = 1;TR0 = 1;
}unsigned char timer0_20ms = 0;
void Service_timer0 () interrupt 1
{TH0 = ( 65535 - 18433 ) / 256;TL0 = ( 65535 - 18433 ) % 256;timer0_20ms ++;
}
//========================================void time_SMGrunning ()
{static unsigned char timer0_s = 0;static unsigned char timer0_m = 0;if ( timer0_20ms == 50 ){timer0_s ++;timer0_20ms = 0;if ( timer0_s == 60 ){timer0_m ++;timer0_s = 0;timer0_20ms = 0;if ( timer0_m == 99 ){ timer0_m = 0;}			}}if ( S5 == 0 ){Delay ( 3 );if ( S5 == 0 ){TR0 = 0;}else ;}else {TR0 = 1;}if ( S4 == 0 ){Delay ( 3 );if ( S4 == 0 ){timer0_20ms = 0;timer0_s = 0;timer0_m = 0;}}Input_SMG ( 7 , SMG_duanma[ timer0_20ms%10 ] );Delay ( 1 );Input_SMG ( 6 , SMG_duanma[ timer0_20ms/10 ] );Delay ( 1 );Input_SMG ( 5 , SMG_duanma[16] );Delay ( 1 );Input_SMG ( 4 , SMG_duanma[ timer0_s%10 ] );Delay ( 1 );Input_SMG ( 3 , SMG_duanma[ timer0_s/10 ] );Delay ( 1 );Input_SMG ( 2 , SMG_duanma[16] );Delay ( 1 );Input_SMG ( 1 , SMG_duanma[ timer0_m%10 ] );Delay ( 1 );Input_SMG ( 0 , SMG_duanma[ timer0_m/10 ] );Delay ( 1 );
}void main ()
{Init_timer0 ();while ( 1 ){time_SMGrunning ();}
}

5.編程思路重述

????????對定時計數器的使用在比賽中至關重要,主要就是在初始化的時候:對TMOD的正確設置(GATE、C/T),對THx和TLx的初值正確賦值,然后不要忘記對TCON寄存器的TR0和TR1要賦值為1啟動,最后是IE寄存器里面的各個開關要打開。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714022.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常見的瀏覽器跨域解決方法

1. 前端方法&#xff1a;JSONP&#xff08;僅適用于GET請求&#xff09; JSONP&#xff08;JSON with Padding&#xff09;是一種利用<script>標簽的src屬性不受同源策略限制的特性來實現跨域數據請求的方法。JSONP通過在前端動態創建<script>標簽&#xff0c;并將…

4.1.CVAT——目標檢測的標注詳細步驟

文章目錄 1. 進入任務1. 創建任務2. 已創建的task3. 進入標注界面 2. 選擇標注類型2.1 選擇標注類型2.2 進行標注2.3 遮擋 2.快捷鍵3.導出標注結果 1. 進入任務 登錄后會看到如下圖界面&#xff0c;CVAT的標注最小單位是Task&#xff0c;每個Task為一個標注任務。點擊Task按鈕…

[法規規劃]國家數據局局長劉烈宏《激活數據要素價值》演講要點解析

國家數據局黨組書記、局長劉烈宏在北大光華論壇上發表了題為《激活數據要素價值》的演講&#xff0c;當時曾極大推動了市場熱度&#xff0c;引發了行業思考。現在演講過去了一段時間&#xff0c;但是溫故而知新&#xff0c;我們不妨結合演講之后的市場反應&#xff0c;回顧一下…

蚓鏈數字化快速轉型五步

數字化轉型對于許多企業來說是一個頭痛的問題&#xff0c;因為他們可能感到缺乏明確的方向和方法。不過&#xff0c;蚓鏈數字化生態系統提出了一套快速轉型五步法&#xff0c;旨在幫助企業明確目標、建立團隊、設計權益、提供思維和方法&#xff0c;并共享生態資源&#xff0c;…

【java任意文件漏洞修復,使用文件魔數解決】

java任意文件漏洞修復&#xff0c;使用文件魔數解決 背景&#xff1a; 客戶進行滲透測試&#xff0c;驗證上傳文件的程序沒有對上傳文件作任何過濾&#xff0c;導致可以上傳任意文件到服務器&#xff0c;甚至是病毒文件和Webshell木馬文件。 解決辦法&#xff1a;對于上傳的附件…

html基本標簽

<h1></h1> <p></p> h是標簽從h1~h6&#xff0c;沒用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平臺</a> href可以指定鏈接進行跳轉 <img src"https://www.educoder.net/attachments/download/2078…

【論文精讀】DALLE: Zero-Shot Text-to-Image Generation零樣本文本到圖像生成

文章目錄 一、前言二、摘要三、方法&#xff08;一&#xff09;主要目標&#xff08;二&#xff09;stage 1&#xff1a;訓練離散變分自動編碼器&#xff08;dVAE&#xff09;&#xff08;三&#xff09;stage 2&#xff1a;訓練自回歸轉換器&#xff08;四&#xff09;公式表達…

「優選算法刷題」:最后一塊石頭的重量

一、題目 有一堆石頭&#xff0c;每塊石頭的重量都是正整數。 每一回合&#xff0c;從中選出兩塊 最重的 石頭&#xff0c;然后將它們一起粉碎。假設石頭的重量分別為 x 和 y&#xff0c;且 x < y。那么粉碎的可能結果如下&#xff1a; 如果 x y&#xff0c;那么兩塊石頭…

Flutter開發之CupertinoApp

Flutter開發之CupertinoApp 最近由于使用Flutter編程更多&#xff0c;使用Flutter更順手&#xff0c;相對于其他前端框架來說&#xff0c;Flutter在跨平臺、響應式UI、自繪引擎、即插即用的組件和龐大的社區生態支持方面有更大的優勢&#xff1b;Flutter擁有更低的學習成本&am…

2024牛客寒假算法基礎集訓營5 H sakiko的排列構造(hard)個人補題o(╥﹏╥)o

sakiko要構造一個長度為 nnn 的排列 ppp &#xff0c;使得每一個 pii (1≤i≤n)p_ii\ (1\leq i\leq n)pi?i (1≤i≤n) 都是質數。 排列的定義為&#xff1a;長度為 nnn 的數組&#xff0c;其中 1?n1-n1?n 每個數字在數組中各出現一次。 輸入描述: 第一行輸入一個整數 n(1…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的數字化時代扮演著越來越重要的角色&#xff0c;它們通過人工智能技術&#xff0c;可以自動批量生成各種類型的文章&#xff0c;為用戶提供了便利和效率。本文將介紹5款不同的GPT批量工具&#xff0c;并介紹一款知名的147GPT生成工具&#xff0c;以及另外一款…

c++/c圖的鄰近矩陣表示

#include<iostream> using namespace std;#define MaxVerterNum 100 typedef char VerterType; typedef int EdgeType; typedef struct {VerterType vexs[MaxVerterNum]; // 存儲頂點EdgeType edges[MaxVerterNum][MaxVerterNum]; // 存儲鄰接矩陣int n, e; // 頂點數和邊…

JVM堆內存中新生代晉升到老年代的條件

1. 一般年齡判斷 當對象在Eden區中經過第一次 Minor GC 后&#xff0c;如果仍然存活&#xff0c;則會被移動到 From Survivor 區&#xff0c;并且對象的年齡設為 1。每經過一次 Minor GC&#xff0c;存活下來的對象年齡加 1&#xff0c;若存活對象在 From Survivor 區的年齡達…

netlink原理及應用

什么是netlink netlink是一種基于網絡的通信機制&#xff0c;允許內核內部、內核與用戶態應用之間甚至用戶態應用之間進行通信&#xff1b;netlink的主要作用是內核與用戶態之間通信&#xff1b;它的思想是&#xff0c;基于BSD的socket使用網絡框架在內核和用戶態之間進行通信…

GaussDB跨云容災:實現跨地域的數據庫高可用能力

背景 金融、銀行業等對數據的安全有著較高的要求&#xff0c;同城容災建設方案&#xff0c;在絕大多數場景下可以保證業務數據的安全性&#xff0c;但是在極端情況下&#xff0c;如遇不可抗力因素等&#xff0c;要保證數據的安全性&#xff0c;就需要采取跨地域的容災方案。 …

Dell R730 2U服務器實踐3:安裝英偉達上代專業AI訓練Nvidia P4計算卡

Dell R730是一款非常流行的服務器&#xff0c;2U的機箱可以放入兩張顯卡&#xff0c;這次先用一張英偉達上代專業級AI訓練卡&#xff1a;P4卡做實驗&#xff0c;本文記錄安裝過程。 簡潔步驟&#xff1a; 打開機箱將P4顯卡插在4號槽位關閉機箱安裝驅動 詳細步驟&#xff1a; 對…

2024目前三種有效加速國內Github

大家好我是咕嚕美樂蒂&#xff0c;很高興又和大家見面了&#xff01;截至2024年&#xff0c;國內訪問 GitHub 的速度受到多種因素的影響&#xff0c;包括網絡封鎖、地理距離、網絡帶寬等。為了提高國內用戶訪問 GitHub 的速度&#xff0c;以下是目前較為有效的三種加速方式&…

網絡工程師學習筆記——VRP配置命令大全

VRP是Versatile Routing Platform的簡稱&#xff0c;它是華為公司數據通信產品的通用網絡操作系統。它以IP業務為核心&#xff0c;采用組件化的體系結構&#xff0c;在實現豐富功能特性的同時&#xff0c;還提供了基于應用的可裁剪和可擴展的功能&#xff0c;使得路由器和交換機…

計算機網絡物理層知識點總結

本篇博客是基于謝希仁編寫的《計算機網絡》和王道考研視頻總結出來的知識點&#xff0c;本篇總結的主要知識點是第二章的物理層。上一章的傳送門&#xff1a;計算機網絡體系結構-CSDN博客 通信基礎 物理層概念 物理層解決如何在連接各種計算機的傳輸媒體上傳輸數據比特流&am…

【Kubernetes】k8s中容器之間、pod之間如何進行網絡通信?

目錄 PodKubernetes 網絡模型同一Pod上的容器之間進行通信同一Node上的不同Pod之間進行通信不同Node上的Pod之間進行通信Service參考 Pod 首先來回顧一下Pod&#xff1a; Pod 是用于構建應用程序的最小可部署對象。單個 Pod 代表集群中正在運行的工作負載&#xff0c;并封裝一…