MCU的程序的編寫與PC下的程序的編寫存在很大的差異,雖然現(xiàn)在根據(jù)C的MCU開發(fā)工具越來越流行,但關(guān)于一個(gè)高效的程序代碼和喜歡運(yùn)用匯編的規(guī)劃者來講,匯編言語仍然是最簡(jiǎn)練、最有用的編程言語。
關(guān)于MCU的程序編寫,其底子的結(jié)構(gòu)能夠說是大體一致的,一般分為初始化部分(這是超低功耗MCU程序規(guī)劃與PC最大的不同),主程序循環(huán)體和間斷處理程序三大部分,其分別闡明如下:
1、初始化:關(guān)于全部的MCU程序的規(guī)劃來講,初始化是最底子也是最重要的一步,一般包含如下內(nèi)容:
屏蔽全部間斷并初始化堆棧指針:初始化部分一般不希望有任何間斷產(chǎn)生。
鏟除系統(tǒng)的RAM區(qū)域和閃現(xiàn)Memory:雖然有時(shí)或許沒有完全的必要,但從可靠性及一致性的角度動(dòng)身,特別是關(guān)于防止意外的差錯(cuò),仍是主張養(yǎng)成良好的編程習(xí)氣。
IO口的初始化:根據(jù)項(xiàng)目的運(yùn)用的要求,設(shè)定相關(guān)IO口的輸入輸出方法,關(guān)于輸進(jìn)口,需求設(shè)定其上拉或下拉電阻;關(guān)于輸出口,則有必要設(shè)定其初始的電平輸出,以防呈現(xiàn)不必要的差錯(cuò)。
間斷的設(shè)置:關(guān)于全部項(xiàng)目需求用到的間斷源,應(yīng)該給予開啟并設(shè)定間斷的觸發(fā)條件,而關(guān)于不運(yùn)用的多余的間斷,則有必要給予關(guān)閉。
其他功能模塊的初始化:關(guān)于全部需求用到的MCU的外圍功能模塊,有必要按項(xiàng)目的運(yùn)用的要求進(jìn)行相應(yīng)的設(shè)置,如UART的通訊,需求設(shè)定Baud Rate,數(shù)據(jù)長(zhǎng)度,校驗(yàn)方法和Stop Bit的長(zhǎng)度等,而關(guān)于Programmer Timer,則有必要設(shè)置其時(shí)鐘源,分頻數(shù)及Reload Data等。
參數(shù)的初始化:完成了低功耗MCU的硬件和資源的初始化后,接下來就是對(duì)程序中運(yùn)用到的一些變量和數(shù)據(jù)的初始化設(shè)置,這一部分的初始化需求根據(jù)詳細(xì)的項(xiàng)目及程序的整體安排來規(guī)劃。關(guān)于一些用EEPROM來保存項(xiàng)目預(yù)制數(shù)的運(yùn)用來講,主張?jiān)诔跏蓟瘯r(shí)將相關(guān)的數(shù)據(jù)拷貝到MCU的RAM,以進(jìn)步程序?qū)?shù)據(jù)的拜訪速度,一同降低系統(tǒng)的功耗(原則上,拜訪外部EEPROM都會(huì)增加電源的功耗)。
2、主程序循環(huán)體:大多數(shù)MCU是歸于長(zhǎng)時(shí)刻不間斷工作的,因此其主程序體底子上都是以循環(huán)的方法來規(guī)劃,關(guān)于存在多種作業(yè)模式的運(yùn)用來講,則或許存在多個(gè)循環(huán)體,相互之間通過狀況標(biāo)志來進(jìn)行轉(zhuǎn)化。關(guān)于主程序體,一般狀況下首要安排如下的模塊:
核算程序:核算程序一般比較耗時(shí),因此堅(jiān)決對(duì)立放在任何間斷中處理,特別是乘除法運(yùn)算。
實(shí)時(shí)性要求不高或沒有實(shí)時(shí)性要求的處理程序;
閃現(xiàn)傳輸程序:首要針對(duì)存在外部LED、LCD Driver的運(yùn)用。
3、間斷處理程序:間斷程序首要用于處理實(shí)時(shí)性要求較高的任務(wù)和事情,如,外部突發(fā)性信號(hào)的檢測(cè),按鍵的檢測(cè)和處理,守時(shí)計(jì)數(shù),LED閃現(xiàn)掃描等。
一般狀況下,間斷程序應(yīng)盡或許保證代碼的簡(jiǎn)練和短小,低功耗芯片關(guān)于不需求實(shí)時(shí)去處理的功能,能夠在間斷中設(shè)置觸發(fā)的標(biāo)志,然后由主程序來實(shí)行詳細(xì)的事務(wù)――這一點(diǎn)非常重要,特別是關(guān)于低功耗、低速的MCU來講,有必要保證全部間斷的及時(shí)呼應(yīng)。
4、關(guān)于不同任務(wù)體的安排,不同的MCU其處理的方法也有所不同:
例如,關(guān)于低速、低功耗的MCU(Fosc=32768Hz)運(yùn)用,考慮到此類項(xiàng)目均為手持式設(shè)備和選用一般的LCD閃現(xiàn),對(duì)按鍵的反響和閃現(xiàn)的反響要求實(shí)時(shí)性較高,因此一般選用守時(shí)刻斷的方法來處理按鍵的動(dòng)作和數(shù)據(jù)的閃現(xiàn);而關(guān)于高速的MCU,如Fosc》1MHz的運(yùn)用,因?yàn)榇藭r(shí)MCU有滿足的時(shí)刻來實(shí)行主程序循環(huán)體,因此能夠只在相應(yīng)的間斷中設(shè)置各種觸發(fā)標(biāo)志,并將全部的任務(wù)放在主程序體中來實(shí)行。
5、在MCU的程序規(guī)劃中,還需求特別注意的一點(diǎn)就是:
要防止在間斷和主程序體中一同拜訪或設(shè)置同一個(gè)變量或數(shù)據(jù)的狀況。有用的預(yù)防方法是,將此類數(shù)據(jù)的處理安排在一個(gè)模塊中,通過判別觸發(fā)標(biāo)志來決定是否實(shí)行該數(shù)據(jù)的相關(guān)操作;而在其他的程序體中(首要是間斷),對(duì)需求進(jìn)行該數(shù)據(jù)的處理的當(dāng)?shù)刂辉O(shè)置觸發(fā)的標(biāo)志。――這能夠保證數(shù)據(jù)的實(shí)行是可預(yù)知和僅有的。