国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 2962|回復(fù): 0
打印 上一主題 下一主題

C程序的嵌入式軟件分層,看您躺槍沒(méi)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-24 10:56:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
      計(jì)算機(jī)系畢業(yè)的人,大概都會(huì)有一門專業(yè)課,曰為《軟件工程》,當(dāng)年我不僅上了一次中文版的,后來(lái)學(xué)校搞什么中英教學(xué),又上了一個(gè)學(xué)期的英文版的。盡管上了兩遍,但我回憶起來(lái)當(dāng)年的教學(xué)內(nèi)容。第一個(gè)閃念,卻是“大錘測(cè)試”,純屬是因?yàn)槊肿屓擞∠笊羁潭选?/font>
       當(dāng)年的我,學(xué)習(xí)也算認(rèn)真的,上了兩遍的同一門課程,也是隱隱約約找到感覺(jué)了。什么需求分析啦、瀑布開(kāi)發(fā)模型啦、項(xiàng)目管理啦、小組成員激勵(lì)啦。當(dāng)時(shí)正處大三下學(xué)期,正開(kāi)始憧憬著未來(lái)的就業(yè)生活。當(dāng)時(shí)那個(gè)信心爆棚啊,只想著出社會(huì)后,在軟件公司即使領(lǐng)著一幫牛鬼蛇神,也能夠如何如何叱咤風(fēng)云來(lái)著。卻不曾想,畢業(yè)后的第一年,只是查bug查得狗跳雞飛而已。總而言之,在這樣美好的愿景下,我對(duì)這門專業(yè)課還是比較上心的。
       如今工作多年后,獨(dú)立完成的案子也不少,卻發(fā)現(xiàn)軟件工程里面講的這些東西,恐怕對(duì)于90%的國(guó)內(nèi)公司而言,基本形同虛設(shè)哎呀呀,偏題啦偏題啦。今日此篇,說(shuō)說(shuō)軟件分層的事兒。這只是軟件工程里面一個(gè)小小的分支,而它的理念也基本普及到每個(gè)軟件工程師的心中。但老實(shí)說(shuō),做得好的人還不多。(哎,這話該不該講我還猶豫挺久,說(shuō)不定是自己公司太弱了,沒(méi)見(jiàn)世面呢,但不管怎樣,語(yǔ)不驚人死不休的目的是達(dá)到了)。
        老外的東西,直譯過(guò)來(lái),說(shuō)什么高內(nèi)聚、低耦合,對(duì)于沒(méi)有一定構(gòu)建系統(tǒng)經(jīng)驗(yàn)的大學(xué)生來(lái)說(shuō),無(wú)亦于催眠良藥。哎,再贊一個(gè)加拿大,先工作再上學(xué),再工作再上學(xué),隨時(shí)可進(jìn)修的教育制度。
        我先用一個(gè)比喻來(lái)闡述一下軟件分層的概念,然后再來(lái)講述常見(jiàn)的錯(cuò)誤,看看您躺槍了沒(méi)?
        好吧,直接一點(diǎn),先說(shuō)嵌入式軟件模塊吧,它就是一個(gè)插座,接口就是插孔。
       什么是軟件模塊呢? 說(shuō)白了,你可以理解成一個(gè)獨(dú)立的xxxx.c檔和相應(yīng)的xxxx.h檔。.c檔里面的東西是經(jīng)過(guò)精挑細(xì)選的,主題明確的幾個(gè)函數(shù)和一些變量等等匯集而成。.h檔呢,里面放的也是精挑細(xì)選的函數(shù)聲明,供別人調(diào)用。這個(gè)別人,軟件模塊叫做“上層”,它還說(shuō)如果你是第n層,那么調(diào)用者就是第n+1層,你就是它的下層。下層不可依賴上層噢。這些函數(shù),就是傳說(shuō)中的接口。
      在這里我急不可耐的要發(fā)第一槍: 許多工程師習(xí)慣把全局變量extern出來(lái)放到.h里面,這里我要很明確的不怕得罪人地表達(dá): 我鄙視這種不成熟的做法。這種感覺(jué)如同把插座里面的導(dǎo)線裸露在機(jī)殼外一般。也許有人說(shuō),為了壓縮代碼空間,為了提高執(zhí)行時(shí)間。但,我還是表示更加強(qiáng)烈的鄙視:時(shí)空效率的提高可不是這么干的。用這種做法壓縮時(shí)空只是戰(zhàn)術(shù)上的,小道爾,整個(gè)框架的修改調(diào)整方為正道。還有些工程師,習(xí)慣把只有a.c檔會(huì)用到的define常量,結(jié)構(gòu)體,IO定義,enum等,放到a.h里面。最郁悶的是,所有的x.c   xx.c    xxx.c都包含有一個(gè)all_include.h文檔,而a.h就包含在在這個(gè)無(wú)所不包的all_include.h里面。這感覺(jué),這感覺(jué),就像所有的隱私都泄露在外,家丑,還有各種卡密碼...
      回過(guò)頭來(lái)再說(shuō)插座吧,插孔(接口)許多人還是整理得不錯(cuò)的。可是插座還有一個(gè)非常重要的組成部分------插頭,如果是一個(gè)轉(zhuǎn)換插座的話。更常見(jiàn)的是一個(gè)一米五左右的220V連接線,接往另外一個(gè)“插座”。在軟件上說(shuō)白了,就是你這個(gè)module.c檔里面的代碼調(diào)用了哪些外部函數(shù),所以包含了哪些.h檔,沒(méi)有了它們,你這個(gè)module.c就無(wú)法編譯過(guò)了。我們通常關(guān)心對(duì)上層提供了什么接口,卻常常忽略自己依賴了哪些外部接口。這部分,只有在軟件移植,特別是重大的平臺(tái)移植時(shí),才能體現(xiàn)出來(lái)它的重要性。
      平臺(tái)的移植,我們無(wú)法做到拔營(yíng)即走,攻城略地。在51時(shí)代,我們無(wú)可奈何(源于靜態(tài)棧),只能放任它們。但如今m3的時(shí)代來(lái)臨,我們可以將所有的這些對(duì)下一層的依賴打包起來(lái),整一整,對(duì)下層的依賴,可以整得像插頭一般爽利。
      針對(duì)插頭這件事,我要發(fā)一個(gè)組合槍,裝的是霰彈,您可接好了。
      第二槍:你的設(shè)備驅(qū)動(dòng)嵌入式程序移植起來(lái)是不是巨艱難,因?yàn)樗牟孱^不利索。舉例說(shuō)明如下:
       1.裸露的寄存器名到處都是,比如p1^x = 0,  tcnt = xxx, 這一部分最好用define打包在一起放在文件頭。
       2.違法依賴了“上一層”的模塊內(nèi)容。
        在設(shè)備初始化函數(shù)中,你是否會(huì)直接訪問(wèn)系統(tǒng)參數(shù),不管是用全局變量也好還是函數(shù)調(diào)用。以lcd初始化為例。
                     lcd_init(void)
                    {
                             lcd_contrast_set (sys_para.lcd_contrast);    /* 我最鄙視的全局變量風(fēng) */
                             or
                             lcd_contrast_set ( get_sys_para_lcd_contrast() ); /* 我次鄙視的層次不分明的風(fēng)格 */
                     }
                     這個(gè)事兒,比較恰當(dāng)?shù)淖龇ㄊ恰?/font>
                     lcd_init (uint_fast8_t contast)
                     {
                             /* 接下來(lái)你懂的  */
                     }
       3.沒(méi)有保持設(shè)備驅(qū)動(dòng)的純潔性,這個(gè)同樣屬于層次不分明的做法。以buzzer為例。
        /*
          input:   0,長(zhǎng)嗶~(yú)~     1,嗶      2,嗶嗶       3,嗶嗶嗶      
         */
         void  buzzer_ctrl (uint_fast8_t    para)     
          {
                  if  (“應(yīng)用層”狀態(tài) == xxx)
                  {
                            return;     
                   }
                   if (其他不相干的設(shè)備狀態(tài)  ==  xxx)
                  {
                            return;
                  }
          }                 
          這就他媽的坑爹,明明按合約說(shuō)好了,我傳入?yún)?shù)1,就叫一聲。你說(shuō),你說(shuō),為何不叫,為何....
          為了獲取其他模塊的狀態(tài),你不得不在buzzer.c包含無(wú)關(guān)的.h檔在里面。這就是污染,玷污了設(shè)備的純潔。
         這事兒也簡(jiǎn)單,就是把if拉到外面判斷。你可能要說(shuō),那我要寫(xiě)好多的if語(yǔ)句啊,浪費(fèi)程序空間。哈哈,你就等著再中槍吧,希望你像紅軍一樣可以中槍不倒,繼續(xù)沖鋒,或者發(fā)表一大段的臨死表白。


存?zhèn)草稿,未完待續(xù)

插孔         -----  對(duì)上層接口函數(shù),放.h檔,基本的要有,init, read/recv,  write/send,其他的可以盡量的豐富多彩。放心,不調(diào)用就不鏈接(得懂鏈接器原理和操作方式噢),不浪費(fèi)空間。
插座座體  -----  主題明確的軟件模塊,
插頭         -----  對(duì)下層的依賴,常常被忽略的地方,導(dǎo)致移植困難。m3/m0時(shí)代的到來(lái),這一切終將改變,但對(duì)于函數(shù)指針的使用得有一定的造詣。

第一槍: 許多工程師習(xí)慣把全局變量extern出來(lái)放到.h里面,這里我要很明確的不怕得罪人地表達(dá): 我鄙視這種不成熟的做法
第二槍: 你的設(shè)備驅(qū)動(dòng)程序移植起來(lái)是不是巨艱難,因?yàn)樗牟孱^不利索。詳見(jiàn)上述的舉例說(shuō)明。

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区www| 国产日韩免费视频 | 美女又黄又免费的视频 | 最新综艺 | 亚洲视频四区 | 这里精品| 日韩欧美中 | 日韩在线免费观看视频 | 欧美日韩亚洲一区 | 久久99精品国产一区二区三区 | 久久99热这里只有精品高清 | 日本免费二区三区久久 | 亚洲综合色秘密影院秘密影院 | 国产伦精一区二区三区视频 | 99热精品国产麻豆 | 欧美亚洲国产日韩综合在线播放 | 朝鲜一级一级妇女毛片 | 日本高清视频成人网www | 亚洲黄色免费网站 | 欧美一级黄色片在线观看 | 国产成人精品一区二区三在线观看 | 97高清| 日韩免费视频 | 国产日韩精品一区在线不卡 | 野外一级毛片黑人 | 视频二区 国产精品 职场同事 | 免费日韩| 国产麻豆高清在线观看 | 免费在线观看一级片 | 香蕉1024| 欧美区一区 | 日本丰满大乳欲妇三级 | 欧美成a人片免费看久久 | 亚洲欧美一区二区三区久本道 | 青青青视频在线播放视频 | 国产福利在线观看 | 精品一区二区在线观看 | 亚洲综合色就色手机在线观看 | 国产精品va免费视频 | 欧美在线一区二区 | 国产高清成人 |