找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2540|回復(fù): 0
收起左側(cè)

單片機(jī)嵌入式好初學(xué)者必備知識(shí)技能,單片機(jī)的框架

[復(fù)制鏈接]
ID:85405 發(fā)表于 2015-7-28 17:46 | 顯示全部樓層 |閱讀模式


任何對(duì)時(shí)間要求苛刻的需求都是我們的敵人,在必要的時(shí)候我們只有增加硬件成本來(lái)消滅它;比如你要8個(gè)數(shù)碼管來(lái)顯示,我們?cè)跊](méi)有相關(guān)的硬件支持的時(shí)候必須用MCU以動(dòng)態(tài)掃描的方式來(lái)使其工作良好;而動(dòng)態(tài)掃描將或多或少的阻止了MCU處理其他的事情。在MCU負(fù)擔(dān)很重的場(chǎng)合,我會(huì)選擇選用一個(gè)類(lèi)似max8279外圍ic來(lái)解決這個(gè)困擾。

然而慶幸的是,有著許多不是對(duì)時(shí)間要求苛刻的事情:
例如鍵盤(pán)的掃描,人們敲擊鍵盤(pán)的速率是有限的,我們無(wú)需實(shí)時(shí)掃描著鍵盤(pán),甚至可以每隔幾十ms才去掃描一下;然而這個(gè)幾十ms的間隔,我們的MCU還可以完成許多的事情;
單片機(jī)雖然是裸機(jī)奔跑,但是往往現(xiàn)實(shí)的需要決定了我們必須跑出操作系統(tǒng)的姿態(tài)——多任務(wù)程序,
比如一個(gè)常用的情況有4個(gè)任務(wù):
1     鍵盤(pán)掃描;
2     led數(shù)碼管顯示;
3     串口數(shù)據(jù)需要接受和處理;
4     串口需要發(fā)送數(shù)據(jù);
如何來(lái)構(gòu)架這個(gè)單片機(jī)的程序?qū)⑹俏覀兊闹攸c(diǎn);

讀書(shū)時(shí)代的我會(huì)把鍵盤(pán)掃描用查詢的方式放在主循環(huán)中,而串口接收數(shù)據(jù)用中斷,在中斷服務(wù)函數(shù)中組成相應(yīng)的幀格式后置位相應(yīng)的標(biāo)志位,在主函數(shù)的循環(huán)中進(jìn)行數(shù)據(jù)的處理,串口發(fā)送數(shù)據(jù)以及l(fā)ed的顯示也放在主循環(huán)中,

這樣整個(gè)程序就以標(biāo)志變量的通信方式,相互配合的在主循環(huán)和后臺(tái)中斷中執(zhí)行。
然而必須指出其不妥之處:
每個(gè)任務(wù)的時(shí)間片可能過(guò)長(zhǎng),這將導(dǎo)致程序的實(shí)時(shí)性能差。如果以這樣的方式在多加幾個(gè)任務(wù),使得一個(gè)循環(huán)的時(shí)間過(guò)長(zhǎng),可能鍵盤(pán)掃描將很不靈敏。所以若要建立一個(gè)良好的通用編程模型,我們必須想辦法,消去每個(gè)任務(wù)中費(fèi)時(shí)間的部分以及把每個(gè)任務(wù)再次分解。下面來(lái)細(xì)談每個(gè)任務(wù)的具體措施:
1 鍵盤(pán)掃描
鍵盤(pán)掃描是單片機(jī)的常用函數(shù),以下指出常用的鍵盤(pán)掃描程序中,嚴(yán)重阻礙系統(tǒng)實(shí)時(shí)性能的地方;
眾所周知,一個(gè)鍵按下之后的波形是這樣的(假定低有效):
在有鍵按下后,數(shù)據(jù)線上的信號(hào)出現(xiàn)一段時(shí)間的抖動(dòng),然后為低,然后當(dāng)按鍵釋放時(shí),信號(hào)抖動(dòng)一段時(shí)間后變高。當(dāng)然,在數(shù)據(jù)線為低或者為高的過(guò)程中,都有可能出現(xiàn)一些很窄的干擾信號(hào)。

2 數(shù)碼管的顯示
一般情況下我們用的八位一體的數(shù)碼管,采用動(dòng)態(tài)掃描的方法來(lái)完成顯示;非常慶幸人眼在高于50hz以上的閃爍時(shí)發(fā)現(xiàn)不了的。所以我們?cè)趧?dòng)態(tài)掃描數(shù)碼管的間隔時(shí)間是充裕的。這里我們定其時(shí)限為4ms(250HZ) ,用定時(shí)器定時(shí)為2ms,在定時(shí)中斷程序中進(jìn)行掃描的顯示,每次只顯示其中的一位;當(dāng)然時(shí)限也可以弄長(zhǎng)一些,更推薦的方法是把顯示函數(shù)放入主循環(huán)中,而定時(shí)中斷中置位相應(yīng)的標(biāo)志位即可;

3 串口接收數(shù)據(jù)幀
串口接收時(shí)用中斷方式的,這無(wú)可厚非。但如果你試圖在中斷服務(wù)程序中完成一幀數(shù)據(jù)的接收就麻煩大了。永遠(yuǎn)記住,中斷服務(wù)函數(shù)越短越好,否則影響這個(gè)程序的實(shí)時(shí)性能。一個(gè)數(shù)據(jù)幀一般包括若干個(gè)字節(jié),我們需要判斷一幀是否完成,校驗(yàn)是否正確。在這個(gè)過(guò)程中我們不能用軟件延時(shí),更不能用死循環(huán)等待等方式;
所以我們?cè)诖诮邮罩袛嗪瘮?shù)中,只是把數(shù)據(jù)放置于一個(gè)緩沖隊(duì)列中。
至于組成幀,以及檢查幀的工作我們?cè)谥餮h(huán)中解決,并且每次循環(huán)中我們只處理一個(gè)數(shù)據(jù),每個(gè)字節(jié)數(shù)據(jù)的處理間隔的彈性比較大,因?yàn)槲覀円呀?jīng)緩存在了隊(duì)列里面。

整體看來(lái)我們的系統(tǒng)就成了將近一個(gè)萬(wàn)能的模版了,根據(jù)自己所選的cpu,選個(gè)定時(shí)器,在添加自己的事件函數(shù)即可,非常靈活方便實(shí)用,一般的單片機(jī)能勝任的場(chǎng)合,該模版都能搞定。
整個(gè)系統(tǒng)以全局標(biāo)志作為主線,形散神不散;系統(tǒng)耗費(fèi)比較小,只是犧牲了一個(gè)Timer而已,在資源缺乏的單片機(jī)中,非常適;曾經(jīng)看過(guò)一個(gè)網(wǎng)友的模版“單片機(jī)實(shí)用系統(tǒng)”,其以51為例子寫(xiě)的,整體思路和這個(gè)差不多,不過(guò)他寫(xiě)得更為規(guī)范緊湊,非常欣賞;但個(gè)人覺(jué)得代碼開(kāi)銷(xiāo)量要大些,用慣了都一樣哦。但是由于本系統(tǒng)以全局標(biāo)志為驅(qū)動(dòng)事件,所以比較感覺(jué)比較凌亂,全局最好都做好注釋?zhuān)湟⒁庖恍╇[形的函數(shù)遞歸情況,千萬(wàn)不要遞歸的太深哦。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表