天天看點

問題:單片機軟體仿真和實際運作速度不一樣?

問題:單片機軟體仿真和實際運作速度不一樣?

如圖,問題大概就是說初學單片機,用軟體仿真出來的程式,在開發闆上運作的效果比仿真的快,晶振都是一樣的12M。還問到一個1T模式和12T模式的差別?

今天,我們就來說說這個問題,一看問出這樣的問題就知道學單片機沒幾天,還不算是入門吧,還走了軟體仿真的道路。

要說清這個問題,我們分幾步來慢慢叨叨。

>>>>

傳統單片機和增強單片機

傳統單片機,也就是之前的Atmel公司的51單片機,現在好多高校也都還在用的晶片,最有代表的晶片就是AT89S51/52單片機。這個單片機内部資源不多,不帶ADC/DAC ,不帶PWM,供電電壓範圍4.5V-5.2V,最主要的是運作速度的問題,12M的晶振頻率,但是執行最快的 一條指令也需要12個晶振周期才能完成,這也就是所謂的12分頻。這樣一來12M的晶振頻率,到了指令周期就隻有1MHz。這也就是在12M晶振下,傳統51單片機的定時器每加1所需要的時間是1us(1MHz頻率對應的周期是1us),在計算定時器初值時的依據就是出自這裡啦。

問題:單片機軟體仿真和實際運作速度不一樣?

所謂的增強型單片機,其實就是STC的51單片機,在STC最開始的晶片中,比如STC89C51,這些晶片和AT的晶片沒多少差別,運作速度和資源情況都差不多。到了STC12系列以後,STC公司連命名都改了,内部資源和運作速度都有了很大的提升,另一個很大的改動就是引腳的排列方式,之前的STC晶片的引腳排列都是相容傳統的51單機的,到時STC12系列以後,引腳不再相容傳統單片機,而是有了自己獨特的排列,特别是後續的STC15、STC8等系列單片機。

問題:單片機軟體仿真和實際運作速度不一樣?

>>>>

1T和12T

1T和12T隻有在STC12系列以後的單片機裡才出現的。前面我們已經說到了,傳統的單片機其實就是12T單片機,也就是晶振頻率會被12分頻後才是指令運作的頻率。到時STC12系列以後的STC單片機出現1T模式,也就是有些指令的執行時隻需要兩個晶振周期就能執行完。理論上來說,這樣的運作速度會比傳統單片機快6倍,為什麼加“理論”,因為不是所有的指令都快6倍,隻是一部分,還有些是快4倍,快3倍的。具體的需要看STC官方資料手冊,如下圖。

問題:單片機軟體仿真和實際運作速度不一樣?

仔細的小夥伴會看到在第5列的第一行裡有個小括号(采用STC-Y2 CPU核心指令集),STC12用的就是這個核心,而到了STC15系列晶片用的是STC-Y5核心,STC8系列用的是STC-Y6核心,Y後面的數字越大,指令優化的越厲害,表現出來的就是運作的更快,STC-Y5核心的指令集裡,大部分的彙編指令到時一個晶振周期就執行完成的了,也就是比傳統單片機快12倍。

現在我在做單片機開發的時候,絕大部分都是采用的C語言開發,你還在用彙編,那我隻能是膜拜你了。C語言程式設計的程式友善移植,好了解,容易入門,不需要去記住那些複雜的寄存器,但是确定也明顯,就是效率不高,運作速度我們沒辦法準确的計算出來。編譯器在把C語言代碼轉化為彙編語言的過程我們是沒法控制的,這樣編譯出來的機器代碼我們就沒辦法去計算時間的指令運作時間。

>>>>

軟體仿真和實際開發闆

仿真軟體,外國老表開發的,STC國産(好吧,核心還是人家的)。不知道什麼原因,我們不知道,也不敢問,在仿真軟體裡就是沒有STC的單片機晶片可以選擇,沒有STC的單片機,我們隻能選擇傳統51單片機,這樣一來,仿真的時候,程式運作的速度是傳統的12T模式,也就是晶振頻率12分頻後才是執行的實際頻率。

單片機開發闆運作時,因為提問小夥伴用的單片機是STC12系列的晶片,就算他運作在12T模式下,指令系統還是有優化,速度肯定比傳統的指令集要快。更何況呢,他連1T和12T都分不清,運作在1T模式下也是有可能的,是以,今天的問題就來了。實際開發闆運作速度肯定會比軟體仿真快。

寫在最後

在很久之前,我就寫過一篇文字,就說了不建議初學單片機的菜鳥從軟體仿真開始。現在還有多少高校的單片機課程還在是以仿真運作的呢,希望是沒有了,但我想,僅僅是我想想。

其實,小代覺得,學單片機的最終是要自己設計屬于自己的東西,比如自己的畢設,更或是親手做一個小禮物俘獲女神的芳心。但是自己寫的代碼永遠都運作在軟體裡,沒有實際電路,你又怎麼可能會自己設計電路呢。你不自己看見過電阻,又怎麼可能會知道一個長得很像電阻的電子元件它其實是二極管。

最最後,回到今天的問題上,當我們把軟體仿真運作完美的代碼移植到實際開發闆上運作時,代碼是需要做單片機的适配的,比如,采用代碼方式實作的延時函數,比如IO端口的配置,比如某些中斷的入口,比如某些寄存器的定義等等。在移植之前,還是得拿目标晶片的資料手冊來看看。