|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
把自己的51程序的框架放出來(lái),希望對(duì)初學(xué)者有幫助。 |
| 作者:yanfengzhu 欄目:單片機(jī) |
把自己的51程序的框架放出來(lái),希望對(duì)初學(xué)者有幫助,如果高手不小心看了,也請(qǐng)?zhí)嵋幌乱庖?jiàn)。 這個(gè)東東寫(xiě)了也有好長(zhǎng)一段時(shí)間了,由于近來(lái)又有了一些想法,加上年底不是很忙了,因此就想對(duì)它進(jìn)行修改。這兩天看過(guò)之后真有點(diǎn)慘不忍睹的感覺(jué),以前怎么會(huì)把簡(jiǎn)單的問(wèn)題搞的那么復(fù)雜呢。 修改起來(lái)不知道怎么下手好了,主要是一些想法不好在51上實(shí)現(xiàn),如果要實(shí)現(xiàn)就要犧牲較大的資源(要么是rom要么是執(zhí)行時(shí)間),今天先把數(shù)據(jù)類型統(tǒng)一了一下,放上來(lái)先,過(guò)幾天再把整理好的放上來(lái)。希望對(duì)初學(xué)者有些許的幫助,也請(qǐng)高手們給些意見(jiàn)和建議。感覺(jué)好長(zhǎng)一段時(shí)間技術(shù)沒(méi)有提高了,唉,郁悶。! 這是我存放東東的地址。 http://yanfeng106.gbaopan.com * - 本貼最后修改時(shí)間:2007-1-28 19:17:35 修改者:yanfengzhu |
| 2樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/22 22:25:00 發(fā)布:
沙發(fā)~~~ |
|
| 3樓: | >>參與討論 |
| 作者: fsaok 于 2007/1/22 23:01:00 發(fā)布:
. 該位置沒(méi)有任何文件! |
|
| 4樓: | >>參與討論 |
| 作者: fsaok 于 2007/1/22 23:05:00 發(fā)布:
. 找到了,正在下載中,原來(lái)樓主的地址寫(xiě)錯(cuò)了 |
|
| 5樓: | >>參與討論 |
| 作者: fsaok 于 2007/1/22 23:15:00 發(fā)布:
很好 粗略看了一下,樓主的程序框架真的別具一格,欣賞中 |
|
| 6樓: | >>參與討論 |
| 作者: 碧水長(zhǎng)天 于 2007/1/22 23:27:00 發(fā)布:
還不錯(cuò),感覺(jué)咱們有點(diǎn)類似,也貢獻(xiàn)一下自己的代碼風(fēng)格,望拍磚 讀了lz的main結(jié)構(gòu),感覺(jué)有點(diǎn)類似,不過(guò)個(gè)人認(rèn)為稍微欠缺的是,沒(méi)有對(duì)任務(wù)的執(zhí)行周期進(jìn)行安排,這樣不利于任務(wù)的增刪。在平均處理器時(shí)間足夠的情況下,安排好各個(gè)任務(wù)的執(zhí)行周期,因增減任務(wù)而對(duì)原有任務(wù)的執(zhí)行情況的影響將將被減至最小。 * - 本貼最后修改時(shí)間:2007-5-10 10:36:41 修改者:碧水長(zhǎng)天 |
|
| 7樓: | >>參與討論 |
| 作者: xwj 于 2007/1/22 23:29:00 發(fā)布:
LZ程序確實(shí)不錯(cuò),結(jié)構(gòu)很清晰 幫你上傳下 * - 本貼最后修改時(shí)間:2007-1-23 10:26:41 修改者:xwj |
|
| 8樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/22 23:38:00 發(fā)布:
倒塌了~~~while(1)+CLS_WDT()是狗論打擊的首要目標(biāo)~~~
|
|
| 9樓: | >>參與討論 |
| 作者: xwj 于 2007/1/22 23:50:00 發(fā)布:
啊,不看不知道,一看... 原來(lái)是只菜狗啊 殺了吃了! |
|
| 10樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/22 23:54:00 發(fā)布:
倒塌了~~~到菜地里隨便拉條菜狗燉著吃,xwj請(qǐng)客~~~ |
|
| 11樓: | >>參與討論 |
| 作者: 碧水長(zhǎng)天 于 2007/1/23 0:11:00 發(fā)布:
感覺(jué)此狗似乎很菜,但一時(shí)還不特別明白,明天再來(lái) 呵呵,又要長(zhǎng)見(jiàn)識(shí)了,謝謝各位,晚安。。 |
|
| 12樓: | >>參與討論 |
| 作者: yewuyi 于 2007/1/23 9:00:00 發(fā)布:
俺比較這樣寫(xiě)main() void main(void){ InitSys(); while(1){ if(flag.bmain){ flag.bmain=faultFlag; clrwdt; SWITCH(maincase){ case 0: break; case 1: break; ... ... ... case n: break; default:while(1){}; //異常復(fù)位 } } } } :::: 能保證中斷、主程序任意一個(gè)異常的情況下都能讓W(xué)DT動(dòng)作才可以。 flag.bmain必須由中斷驅(qū)動(dòng)產(chǎn)生; 需要添加的任務(wù)加到下面的CASE里面,自己感覺(jué)這樣比較容易寫(xiě)狀態(tài)遷移表。 xwj & hotpower也給俺指點(diǎn)指點(diǎn)…… |
|
| 13樓: | >>參與討論 |
| 作者: xwj 于 2007/1/23 10:23:00 發(fā)布:
不錯(cuò),這個(gè)結(jié)構(gòu)值得參考 前臺(tái)任務(wù)基于狀態(tài)遷移(比如界面操作) 后臺(tái)任務(wù)基于中斷(隨機(jī)事件)和時(shí)間片切換(并行輪循) 看門(mén)狗只需檢查并保證前臺(tái)和時(shí)間片輪循正常運(yùn)行即可,當(dāng)然也可附帶檢查或重設(shè)下中斷 這樣子實(shí)際上也就是自己的簡(jiǎn)易OS了 |
|
| 14樓: | >>參與討論 |
| 作者: yewuyi 于 2007/1/23 11:25:00 發(fā)布:
呵呵,可以偷懶免掉檢查中斷 假若中斷異常關(guān)閉后,flag.bmain就不能正常產(chǎn)生,從而導(dǎo)致clrwdt不能執(zhí)行,WDT自然就要‘咬人’了…… 中斷也比較簡(jiǎn)潔,一般里面就是動(dòng)態(tài)掃描、按鍵20ms消抖; 按鍵鍵意解析及響應(yīng)一般放到main()中的一個(gè)CASE分支里面調(diào)用keyscan() 俺一直想找到更好的程序結(jié)構(gòu)…… |
|
| 15樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/23 12:30:00 發(fā)布:
等著所長(zhǎng)來(lái)上課~~~估計(jì)現(xiàn)在農(nóng)忙之中~~~
|
|
| 16樓: | >>參與討論 |
| 作者: yewuyi 于 2007/1/23 12:50:00 發(fā)布:
所長(zhǎng)的書(shū)俺期待了很久…… 可惜不知道到哪兒去了? |
|
| 17樓: | >>參與討論 |
| 作者: gtw 于 2007/1/23 13:22:00 發(fā)布:
看來(lái)英雄草莽所見(jiàn)略同 我的結(jié)構(gòu)和碧水長(zhǎng)天的相似,基于不同的clk進(jìn)行事件驅(qū)動(dòng) 但是這種結(jié)構(gòu)中ClrWDT的時(shí)間間隔也就決定了中間可執(zhí)行指令數(shù) 缺點(diǎn)是有的。 另外yewuyi,多任務(wù)的時(shí)候狀態(tài)機(jī)要拿出去了,是不是。 |
|
| 18樓: | >>參與討論 |
| 作者: gtw 于 2007/1/23 13:35:00 發(fā)布:
如樓主所說(shuō) 時(shí)間、速度、代碼量不可兼得~~ |
|
| 19樓: | >>參與討論 |
| 作者: 碧水長(zhǎng)天 于 2007/1/23 17:22:00 發(fā)布:
關(guān)于喂狗的問(wèn)題,今天思索了一下,總結(jié)如下: 直接在while(1)內(nèi)無(wú)條件清狗,只能監(jiān)控主程序異常和中斷跑飛的情況,但無(wú)法監(jiān)控中斷被異常關(guān)閉的情況. 結(jié)構(gòu)修改如下: #define N 20 /*若主函數(shù)在20個(gè)定時(shí)中斷周期中仍然未執(zhí)行到清除U8Globe_CounterDog計(jì)數(shù)器指令,則判斷主程序異常,可執(zhí)行軟件復(fù)位處理*/ volatile unsigned CHAR U8Globe_CounterDog; //軟件復(fù)位用計(jì)數(shù)器 volatile bit fGlobe_EnClsWDT; //允許喂狗標(biāo)志 void main(void){ test_system_reset(); //測(cè)試系統(tǒng)復(fù)位情況.. init_system(); while(1){ U8Globe_CounterDog = 0; // ....//任務(wù)代碼 fGlobe_EnClsWDT = 1; //在需要狗看門(mén)的地方,設(shè)立此標(biāo)志 .... //任務(wù)代碼 } } void interrupt TimerIsr(oid){ U8Globe_CounterDog ++; if (U8Globe_CounterDog > N) ProcTimerOutReset(); // else if (fGlobe_EnClsWDT) { CLS_WDT(); fGlobe_EnClsWDT = 0; } ...//處理其他事情 } 分析: 優(yōu)點(diǎn): 1 主程序跑飛,則無(wú)法置fGlobe_EnClsWDT標(biāo)志和清計(jì)數(shù)器U8Globe_CounterDog ,則中斷服務(wù)程序也無(wú)法喂狗,將發(fā)生超時(shí)軟件復(fù)位或者看門(mén)狗復(fù)位; 2 若中斷被異常關(guān)閉,則無(wú)法喂狗,將發(fā)生看門(mén)狗復(fù)位; 3 若中斷沒(méi)被關(guān)閉但跑飛,也將無(wú)法喂狗,將發(fā)生看門(mén)狗復(fù)位; 缺點(diǎn): 1 占用一定的中斷處理器時(shí)間; 2 要求TimerIsr優(yōu)先級(jí)為最高; 若有人覺(jué)得在ISR中喂狗不好,那么也可以反過(guò)來(lái),在TimerIsr中設(shè)立標(biāo)志和清計(jì)數(shù)器,而在主程序中喂狗和處理超時(shí)軟件復(fù)位. 至于代碼中加了計(jì)數(shù)器U8Globe_CounterDog,個(gè)人覺(jué)得,用戶可以在復(fù)位前做一些工作,不象看門(mén)狗復(fù)位過(guò)程中,用戶無(wú)法控制. 請(qǐng)hotpower,xwj等前輩點(diǎn)評(píng) * - 本貼最后修改時(shí)間:2007-1-23 17:26:27 修改者:碧水長(zhǎng)天 |
|
| 20樓: | >>參與討論 |
| 作者: gtw 于 2007/1/23 17:43:00 發(fā)布:
何必 這一點(diǎn)和yewuyi的架構(gòu)類似 不過(guò)是將ClrWDT放到檢測(cè)到時(shí)鐘標(biāo)志后清狗 if (fGlobe_1ms){ ClrWDT(); ...... } 只是挪一下地方而已,效果相同 我用兩個(gè)狗,一個(gè)硬件狗,再虛擬一個(gè)軟件狗……哈哈 用軟件狗檢測(cè)異常,提前處理 不過(guò)應(yīng)用還是有限 |
|
| 21樓: | >>參與討論 |
| 作者: hmin500 于 2007/1/23 18:50:00 發(fā)布:
程序框架 都是高手,俺看不明白呀 |
|
| 22樓: | >>參與討論 |
| 作者: yanfengzhu 于 2007/1/23 20:11:00 發(fā)布:
那么多高人捧場(chǎng)啊!偷樂(lè)ing. to fsaok:地址錯(cuò)了嗎?我這里確認(rèn)了確實(shí)是這個(gè)地址啊!也許是我的瀏覽器自動(dòng)登陸了吧。 to 碧水長(zhǎng)天: 原來(lái)我也是這么寫(xiě)的,后來(lái)覺(jué)得羅嗦就改了。因?yàn)楫?dāng)是時(shí)間片的整數(shù)倍時(shí),如100MS時(shí),你的1ms,2ms,5ms,10ms,100MS里的任務(wù)都要執(zhí)行,如果這些任務(wù)執(zhí)行的時(shí)間和超過(guò)了2ms, 那么對(duì)1ms的任務(wù)肯定是有影響的。 謝謝xwj的幫忙了。 to hotpower和xwj : 對(duì)于狗論,我確實(shí)沒(méi)什么研究,純菜狗一條.^_^ 而且這個(gè)結(jié)構(gòu)已經(jīng)好久前寫(xiě)的了,我現(xiàn)在的東東里,狗我都懶得理了,一般都是 #define clr_wdt() 一個(gè)空的宏,(哪些狼狗,波斯狗等狗論高者,暴寒ing). 主要是我覺(jué)得影響系統(tǒng)正常工作的就軟件跟硬件,如果內(nèi)部軟件都寫(xiě)得程序不知道跑哪里去,那就是人品問(wèn)題,如果是外部干擾使程序跑飛,那應(yīng)該從根本解決問(wèn)題,而不是依賴小狗。 小狗拉出去溜溜還行! 我曾經(jīng)做了一個(gè)東東在辦公室工作很正常,但是到現(xiàn)場(chǎng)得時(shí)候確跑得斷斷續(xù)續(xù)的,因?yàn)樾」防鲜菑?fù)位單片機(jī)。 請(qǐng)狗論高者仍磚頭。。。! |
|
| 23樓: | >>參與討論 |
| 作者: gtw 于 2007/1/24 8:25:00 發(fā)布:
0 如100MS時(shí),你的1ms,2ms,5ms,10ms,100MS里的任務(wù)都要執(zhí)行,如果這些任務(wù)執(zhí)行的時(shí)間和超過(guò)了2ms, 那么對(duì)1ms的任務(wù)肯定是有影響的。 肯定會(huì)的…… |
|
| 24樓: | >>參與討論 |
| 作者: yanfengzhu 于 2007/1/24 18:55:00 發(fā)布:
v2版終于該好了。 v2版終于該好了。仍然放在原來(lái)的地方。 http://yanfeng106.gbaopan.com/ 在文件的安排上做了較大的修改,更新并調(diào)整了文件。即具體的細(xì)節(jié)上改動(dòng)較大,而思想方面基本沒(méi)什么變化。 因?yàn)楸容^喜歡在cygwin下工作,今天想寫(xiě)個(gè)makefile來(lái)自動(dòng)編譯工程沒(méi)有成功。我已經(jīng)想到了解決的方法,但是想到的這兩個(gè)方法我都不會(huì)?磥(lái)想擺脫uv2這個(gè)ide還是有點(diǎn)困難。∮袥](méi)有對(duì)makefile方面比較精通的高手,能否指點(diǎn)一下。主要的問(wèn)題在包里的ChangeLog文件里。 |
|
| 25樓: | >>參與討論 |
| 作者: 荒野門(mén)士 于 2007/1/25 10:39:00 發(fā)布:
碧水長(zhǎng)天 ,問(wèn)你一個(gè)問(wèn)題? else if (U81msCounterA == 1) ProcMotorProtect(); /*2ms周期的任務(wù)*/ 中的ProcMotorProtect();程序應(yīng)該是1ms周期的任務(wù),因?yàn)槟愕臉?biāo)志位fGlobe_1ms是一秒標(biāo)志位的, 這只是個(gè)人想法。。有錯(cuò)的說(shuō)一下謝謝 下面幾個(gè)也差不多的,, else if (U81msCounterB == 1) ProcPwmAdjust(); /*5ms周期的任務(wù)*/ else if (U81msCounterB == 3) ProcSpeedCount(); Proc6sCruise();/*100MS周期的任務(wù)*/ |
|
| 26樓: | >>參與討論 |
| 作者: joy晴天 于 2007/1/25 10:52:00 發(fā)布:
先收藏了,好好學(xué)習(xí) |
|
| 27樓: | >>參與討論 |
| 作者: wnch 于 2007/1/25 15:31:00 發(fā)布:
收藏起來(lái)學(xué)習(xí) |
|
| 28樓: | >>參與討論 |
| 作者: 碧水長(zhǎng)天 于 2007/1/25 21:22:00 發(fā)布:
個(gè)人意見(jiàn) 荒野門(mén)士,我的注釋是對(duì)的,請(qǐng)?jiān)僮屑?xì)看看代碼,思考一下。 關(guān)于提到1ms,2ms,5ms等任務(wù)是1ms任務(wù)的整數(shù)倍時(shí),因此對(duì)1ms的任務(wù)有影響的問(wèn)題,我不同意上述幾位同志的觀點(diǎn),我個(gè)人覺(jué)得: 當(dāng)所有Xms的任務(wù)都要執(zhí)行的時(shí)候,此時(shí)是處理器的最大負(fù)荷,設(shè)計(jì)任務(wù)的時(shí)候,要計(jì)算此最大負(fù)荷是否超出了處理器的能力。在滿足處理器能力足夠的情況下,那么,這樣的設(shè)計(jì)會(huì)帶來(lái)這樣的好處: 1 再添加數(shù)量適當(dāng)?shù)姆?ms的任務(wù),不會(huì)對(duì)其他任務(wù)有任何影響,我可以添加到5個(gè)1ms的任務(wù),10個(gè)10ms的任務(wù)等等...; 2 各個(gè)任務(wù)均按照比較嚴(yán)格的時(shí)間周期運(yùn)行,在需要計(jì)時(shí)的時(shí)候(比如鍵盤(pán)掃描、顯示刷新、定時(shí)通信等),均比較方便; |
|
| 29樓: | >>參與討論 |
| 作者: happystar 于 2007/1/25 21:33:00 發(fā)布:
好資料啊。 水平有限,對(duì)這些不太懂,收藏起來(lái),幫前輩們頂頂 |
|
| 30樓: | >>參與討論 |
| 作者: gtw 于 2007/1/26 8:57:00 發(fā)布:
比較同意碧水長(zhǎng)天的說(shuō)法 但在系統(tǒng)負(fù)荷最重的情況下其他任務(wù)有可能被滯后…… 需要即時(shí)處理的任務(wù)只能放到中斷去 |
|
| 31樓: | >>參與討論 |
| 作者: happystar 于 2007/1/27 17:18:00 發(fā)布:
仔細(xì)學(xué)習(xí)了一下,還是不懂 好貼再幫頂一下。我對(duì)這個(gè)模塊花結(jié)構(gòu)很感興趣,增刪都很簡(jiǎn)單啊。但是我不明白:如果你定義一個(gè)大的緩沖區(qū)(全局變量),比如緩沖里的那些變量在每個(gè)模塊都要用到(串口模塊往外發(fā),定時(shí)器模塊顯示它們),這個(gè)緩沖在你的那些文件中具體到哪個(gè)文件定義呢? 本人剛學(xué)MCU,編程都是在一個(gè)文件里的,這樣感覺(jué)結(jié)構(gòu)很糟糕。多謝樓主提供給這么好的結(jié)構(gòu),謝謝拉。 問(wèn)題很菜,別見(jiàn)笑啊。 |
|
| 32樓: | >>參與討論 |
| 作者: yanfengzhu 于 2007/1/28 11:25:00 發(fā)布:
答樓上。 你可以添加自己的文件,在自己的文件中定義,也可以在main.c文件中定義。 |
|
| 33樓: | >>參與討論 |
| 作者: happystar 于 2007/1/28 14:20:00 發(fā)布:
回樓主 按照你的提示,我把全局變量定義在一個(gè)文件里,類似你程序中的config.h這個(gè)文件。這個(gè)問(wèn)題解決拉。 但是我模塊之間的函數(shù)調(diào)用出現(xiàn)問(wèn)題。模仿你的做法: 在kb_scan.c文件有個(gè)函數(shù)void delay(uchar t); 然后在kb_scan.h中定義了extern void delay(uchar t); 當(dāng)task.c模塊要用到這個(gè)函數(shù)的時(shí)候,在task.c里寫(xiě)入#include "kb_scan.h" 然后在這個(gè)模塊的一個(gè)函數(shù)里調(diào)用它,出現(xiàn)一下提示 TASK.C(83): warning C206: 'delay': missing function-prototype 這個(gè)說(shuō)明delay()缺少函數(shù)原形,沒(méi)有聲明它啊。 謝謝樓主耐心幫助。 |
|
| 34樓: | >>參與討論 |
| 作者: yanfengzhu 于 2007/1/28 18:30:00 發(fā)布:
首先你要確認(rèn)你用的是v1版還是v2版。 v1版是很久以前寫(xiě)的,我把它放在網(wǎng)上之前只是把數(shù)據(jù)類型統(tǒng)一了一下。我現(xiàn)在都覺(jué)得那時(shí)把問(wèn)題復(fù)雜化了,所以才會(huì)有v2版的初學(xué)。v1的文件不是放在同一個(gè)目錄的,因此你那樣寫(xiě)是有問(wèn)題的,應(yīng)該改為#include "..\KEYBOARD\kb_scan.h"。建議使用v2版。 還有一個(gè)可能時(shí)你沒(méi)有在config.h文件里使能KEYBOARD_EN,即把按鍵關(guān)閉了,這樣這個(gè)模塊的定義及聲明都被屏蔽了,因此會(huì)提示你沒(méi)有錯(cuò)誤。 #define KEYBOARD_EN 0 建議你不要在KEYBOARD里面定義delay函數(shù),一個(gè)好的建議時(shí)自己寫(xiě)一個(gè)delay.c的文件并在里面定義,或者在misc.c文件里定義。 |
|
| 35樓: | >>參與討論 |
| 作者: happystar 于 2007/1/28 21:29:00 發(fā)布:
回樓主 我使用的V2版本的,而且和你的一樣,所有的.h和.c在同一個(gè)目錄下。所以用#include ""。 但是問(wèn)題是為什么我存放全局變量的那個(gè).h可以被每個(gè)模塊調(diào)用,而每個(gè)模塊的出口函數(shù)用extern定義后再調(diào)用不可以呢?它們都是同一目錄啊。 不好意思,讓樓主多費(fèi)心拉 |
|
| 36樓: | >>參與討論 |
| 作者: yanfengzhu 于 2007/1/28 21:57:00 發(fā)布:
頭文件只用來(lái)聲明,不要用來(lái)定義變量。 這樣我也不能確定是什么問(wèn)題,如果還是不能解決,你可發(fā)郵件給我。 |
|
| 37樓: | >>參與討論 |
| 作者: qianlidou 于 2007/1/31 16:49:00 發(fā)布:
謝謝,學(xué)到很多 謝謝,學(xué)到很多 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |