亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        “嵌入式C語言”教學中的問題及策略研究

        2022-06-04 05:12:52
        江蘇科技信息 2022年12期
        關(guān)鍵詞:嵌入式程序設(shè)置

        黎 建

        (廣州工商學院,廣東 廣州 528138)

        0 引言

        隨著科學技術(shù)的進步,嵌入式系統(tǒng)已大量應用于制造工業(yè)、過程控制、機器人、通訊、儀器儀表、汽車、船舶、航空航天、軍事裝備、消費類產(chǎn)品等國民經(jīng)濟的主要行業(yè)[1-3]。在嵌入式產(chǎn)品日漸普及和迅速發(fā)展的今天,對嵌入式人才的需求越來越大,對嵌入式系統(tǒng)開發(fā)人才的素質(zhì)和能力要求也越來越高。嵌入式技術(shù)人才緊缺現(xiàn)象日漸突出,眾多公司和科研院所不惜重金招聘嵌入式系統(tǒng)開發(fā)方面的高層次人才。高校是培養(yǎng)科研人才的重要基地,是創(chuàng)造高科技產(chǎn)品的重要基地,也是推動社會科技發(fā)展的重要力量,培養(yǎng)具備嵌入式系統(tǒng)設(shè)計能力的復合型專業(yè)人才已是迫在眉睫。然而,嵌入式技術(shù)涉及的知識面廣、實踐性強、技術(shù)發(fā)展快,跨越了電子、計算機、控制和通信等多個專業(yè),學習難度大[4],對嵌入式系統(tǒng)教學提出了更高要求。嵌入式C語言是對嵌入式系統(tǒng)開發(fā)使用最多的語言,主要是由于C語言兼具高低級語言的特性,支持對硬件的直接操作[5],開發(fā)速度快、可讀性好、工作效率高等優(yōu)勢,加上高級功能的開發(fā)必須在操作系統(tǒng)下進行,故逐漸取代了匯編語言成為嵌入式系統(tǒng)的主流開發(fā)工具。因此,在嵌入式教學中,都會使用嵌入式C語言來完成實驗和實訓項目。一般情況下,C語言課程都在大學一年級開設(shè),是學生學習編程語言的入門課程。由于課時限制,學習的課程內(nèi)容有限,導致學生對C語言一知半解。在嵌入式課程實驗中,C語言編寫的程序存在較多問題,調(diào)試進展緩慢,嚴重影響學習效率。讓學生了解嵌入式C語言的特點,掌握嵌入式開發(fā)技巧,設(shè)計出良好的軟件代碼,是教師的重要職責。

        1 不良編程習慣問題

        嵌入式系統(tǒng)是以應用為中心,以計算機技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統(tǒng)。嵌入式系統(tǒng)要求高效率、低成本,在軟件設(shè)計上,代碼的優(yōu)化尤其重要,還有硬件資源的利用。嵌入式的概念非常廣,嵌入式計算機可以從8位的51系列單片機到64位的ARM系處理器。嵌入式計算機有運行內(nèi)存容量比通用計算機(如PC機)少的特點(手機應用除外),一般在100多字節(jié)到100 M字節(jié)間,因成本要求,不可能豐富。嵌入式系統(tǒng)課程都在大學三年級和四年級開設(shè),而大學一、二年級的上機實驗課程基本上在PC機上進行,對硬件資源幾乎沒有約束,學生也就“大手大腳”:在程序代碼里喜歡定義和申請大數(shù)組,其實數(shù)據(jù)量并不大;可以使用一維數(shù)組的,卻使用二維數(shù)組;可以用char類型數(shù)組來存放的數(shù)據(jù),為圖方便,經(jīng)常使用int數(shù)組類型;本可以用一個for循環(huán)解決的問題,卻使用多循環(huán)結(jié)構(gòu),只要結(jié)果正確就行,不管CPU耗時多少。如果嵌入式設(shè)計還是采取這樣的形式,可能導致項目失敗或成本劇增。為了糾正學生這些不良編程習慣,教師先要講解嵌入式系統(tǒng)資源的組成,不同芯片有不同資源;不同功能需求,使用不同的芯片;不同資源,有不同成本價格。設(shè)定項目需求、CPU類型和存儲容量,讓學生采用C語言編程實現(xiàn),通過檢查學生的代碼,了解他們對資源的使用情況、程序優(yōu)化情況以及運行情況。通過這樣的訓練,可以培養(yǎng)學生良好的編程習慣和嵌入式軟件編程風格。

        2 執(zhí)行速度問題

        在嵌入式應用領(lǐng)域,計算機運行速度是一個非常重要的指標,在滿足功能的前提下,希望速度越快越好。在硬件一定的情況下,系統(tǒng)的執(zhí)行時間取決于編程效率和優(yōu)化處理等,而學生不一定能理解和掌握。

        2.1 數(shù)據(jù)訪問局部性

        在嵌入式C語言中,內(nèi)存分配方式主要是堆和棧。棧是一種數(shù)據(jù)結(jié)構(gòu),計算機會在底層對棧提供支持,分配專門的寄存器存放棧的地址,壓棧出棧都有專門的執(zhí)行指令(如ARM系列的STMFD,LDMFD指令),這決定了棧的效率比較高,但??臻g一般都不大,很容易溢出。用malloc()分配的空間就是堆空間,編程者可以自由分配和釋放。另外,還有全局與靜態(tài)數(shù)據(jù)、常量等存放空間。顯然,由于棧空間有硬件的支持,棧內(nèi)存取數(shù)據(jù)是最快的,故存放函數(shù)的局部變量、返回值等熱數(shù)據(jù)。

        下面的程序,破壞了數(shù)據(jù)訪問局部性,運行效率不高,執(zhí)行速度下降:

        在求和過程中,變量sum要調(diào)用1 000次,是熱數(shù)據(jù)[6],應該定義在函數(shù)內(nèi),放到??臻g里,上面程序沒有,而是作為全局變量定義。如果把sum作為靜態(tài)變量放在函數(shù)內(nèi),其效果類似于全局變量,執(zhí)行效率都受影響,因為二者都沒有把變量定義在棧中,破壞了數(shù)據(jù)訪問的時間局部性。

        2.2 數(shù)組存放的行優(yōu)先

        在實驗項目編程中,很多學生喜歡使用C語言數(shù)組,覺得簡單、方便,但對數(shù)組的讀寫機制并不清楚??聪旅孢@2段程序。

        程序1

        程序1和2功能相同,時間空間復雜度一樣,執(zhí)行時間一樣嗎?多數(shù)同學會回答是一樣的。其實,區(qū)別還是很大的,主要涉及2個方面的問題:首先,數(shù)組分配內(nèi)存,一般是按照行優(yōu)先連續(xù)存放的,即存放順序為a[0][0],a[0][1]…a[0][N-1],然后才是a[1][0],a[1][1]…;對于程序1,數(shù)組的讀寫,符合行優(yōu)先的規(guī)則,下個單元的讀寫,只需要地址按字增1即可,但對程序2,下個單元的讀寫,每次地址需要做+N運算,降低了程序運行速度。其次,高檔一點的嵌入式CPU,如ARM系列,為提高性能,一般都有cache,但容量不大(個別除外),如Cortex-A8處理器一級cache配置了16 kB;假定不考慮其他條件(如二級cache),對Cortex-A8處理器,使用程序1,每執(zhí)行2N次循環(huán),只需要從主內(nèi)存讀數(shù)據(jù)到cache一次(4*N*2=16 kB,int型4字節(jié)),如果使用程序2,每2次循環(huán)后,chache數(shù)據(jù)失缺[6],命中失敗,要從主內(nèi)存再讀2行數(shù)據(jù)到cache,如此類推,每執(zhí)行2N次循環(huán),需要從主內(nèi)存讀數(shù)據(jù)N次,很不合算,運行速度大為降低。所以,一定要讓學生理解數(shù)組存放的行優(yōu)先原則(一般不會設(shè)置列優(yōu)先),還有cache的作用。當然,如果使用指針來代替數(shù)組索引,還能加快速度。

        2.3 移位操作完成乘法運算

        很多嵌入式CPU(一些8位單片機)并沒有乘法器硬件,做乘法運算只能間接實現(xiàn),速度慢、效率低。其實,可以通過移位操作和加法運算來完成乘法運算。一個二進制數(shù)左移一位,相當于乘2,右移一位,相當于除2。利用這一性質(zhì),可以完成一些乘法運算功能,而移位操作是最快的指令之一。

        (1)變量X乘以2n,則直接左移n位即可。如8*X=23*X,編程可以寫成X=X<<3。

        (2)變量X乘以其他數(shù),則需要進行分解處理。如100*X,可以分解為(4+32+64)*X=(22+25+26)*X,編程同a類似,可以寫成X=(X<<2)+(X<<5)+(X<<6)。

        總而言之,通過移位和加法運算,可以完成一些主要的乘法和一些特殊的除法(右移一位相當于除2),這對于沒有硬件乘法器的CPU,能加快運行速度。很多學生不知道對沒有乘法器的CPU,應該怎樣加快乘法運算。

        3 嵌入式C的一些特殊關(guān)鍵字

        嵌入式C語言同其他語言一樣,有很多關(guān)鍵字,有幾個關(guān)鍵字在嵌入式軟件開發(fā)中是很重要的,但在C語言課程中一般不會學到,這幾個關(guān)鍵字跟硬件有關(guān)。

        3.1 interrupt

        interrupt不是標準的關(guān)鍵字,但在使用嵌入式C語言編程時普遍應用,特別是在單片機項目中。用interrupt修飾的函數(shù),應看成一個中斷處理函數(shù)(ISR)。中斷處理函數(shù)要求特殊的寄存器保存規(guī)則,以及一些特殊的返回序列。當C代碼被中斷時,ISR必須預先保存所有會被ISR用到的寄存器內(nèi)容,中斷返回時,按逆順序彈出。中斷處理程序需要滿足下列要求:中斷處理程序不能有返回值,不能給中斷處理程序傳遞參數(shù),中斷處理程序應盡量簡單精煉[7]。由于學生以前沒有學過這些,往往很容易當作普通函數(shù)對待,導致在實驗中調(diào)試失敗。

        3.2 volatile

        volatile關(guān)鍵字在嵌入式C中頻繁使用,作用是告訴編譯器該變量是易變的,要編譯器去注意該變量的狀態(tài),變量是易變的,每次讀取該變量的值都重新從內(nèi)存中讀取。也就是說,優(yōu)化器在用到這個變量時必須每次都重新讀取這個變量的值,而不是使用保存在寄存器里的備份[8]。有幾種情況需要volatile關(guān)鍵字來修飾變量。

        (1)變量值是一個特殊地址,如寄存器地址。

        (2)子線程與主線程共享的全局變量。

        (3)中斷處理函數(shù)(ISR)訪問到的變量。

        如果程序編譯時不做優(yōu)化處理,volatile可能看不出作用,不優(yōu)化的程序效率低下;如果做優(yōu)化處理,上面幾種情況的變量不使用volatile關(guān)鍵字,可能導致值不一致,如一個定時器內(nèi)的變量沒有用volatile修飾,其定時時間與計算的時間相差很大。

        3.3 regester

        被regester修飾的變量,使用寄存器來存儲數(shù)據(jù)。由于寄存讀寫速度比內(nèi)存快一個數(shù)量級以上,對于經(jīng)常反復使用的變量,若在寄存器中讀寫,程序的執(zhí)行時間要快不少:

        程序中的s、i變量每個循環(huán)都要使用,放入寄存器中能大大地縮短運行時間。不過,使用register修飾符有幾點限制。

        (1)register變量長度應該小于或者等于整型的長度(即機器的字長)。

        (2)不能用“&”來獲取register變量的地址,寄存器不是內(nèi)存。

        (3)只有局部變量和形參可以作為寄存器變量。

        由于CPU中的寄存器數(shù)量有限(51系列單片機少的只有幾個,而ARM系列則有幾十個),當寄存器不夠用時,編譯器會自動忽略register修飾符。隨著編譯技術(shù)的發(fā)展,嵌入式C語言在優(yōu)化方面可能比程序員做得更好,在決定哪些變量應該被存到寄存器中時,可能編譯器會考慮。

        4 聯(lián)合位域體及位操作

        在嵌入式軟件開發(fā)過程中,經(jīng)常用到位操作,如I/O口控制、端口寄存器的設(shè)置等。大部分CISC類CPU,有位操作指令(如51系列單片機的SETB bit指令)。但是,對于RISC這類CPU,由于指令要精簡,沒有設(shè)計位指令。要完成對端口寄存器的設(shè)置,只能采用組合操作,不但麻煩,而且可讀性極差,學生不能理解,換一下設(shè)置要求就不會編程了,很難舉一反三。ARM系列S5PV210芯片是應用很廣的32位CPU,有多個I/O口,既可以作為輸入口,也可以作輸出口使用,通過設(shè)置端口控制寄存器來復用,如設(shè)置GPH3的控制寄存器GPH3CON可以決定對應的8個I/O口是作為輸入還是輸出使用。由于沒有位操作指令,要對變量(或寄存器)的某些位設(shè)置,只能通過嵌入式C語言的一些算術(shù)運算和移位操作來達到。如果只是使用某個寄存器其中的某一位,其他位的定義不變,則:

        這對剛進入嵌入式領(lǐng)域的學生,上面的語句難以理解。

        GPH3CON寄存器以4位為一組確定復用功能,0000作為輸入,0001作為輸出??梢?,GPH3需要用4×8=32位來控制8個I/O口。如果借助于C語言的聯(lián)合位域結(jié)構(gòu)來設(shè)置寄存器,學生就很容易理解了。這里假定,要求GPH3的0,2,4,6位作輸入,1,3,5,7位作為輸出,如設(shè)置GPH3CON寄存器的嵌入式C聯(lián)合體如下。}H3;

        位域bit與gpcon共32位存儲單元,bit的每個成員占4位,正好作為設(shè)置GPH3CON寄存器復用功能的一組數(shù)據(jù)。

        H3.gpcon=GPH3.GPH3CON;//如果H3的每個口都要設(shè)置,這一句就多余

        顯然,這種設(shè)置控制寄存器的方法,學生容易理解,很快就會掌握設(shè)置方法。經(jīng)過多次練習,上面寄存器設(shè)置,不再需要聯(lián)合位域,而是直接設(shè)置:GPH3.GPH3CON=0×10101010。

        也可以舉一反三:如果定義輸入的4位值不是0000,是0010,則GPH3.GPH3CON=0×12121212。

        5 結(jié)語

        隨著嵌入式技術(shù)的迅速發(fā)展,嵌入式C語言應用越來越廣泛,對嵌入式人才的需求越來越大,開設(shè)嵌入式系統(tǒng)設(shè)計課程的高校也越來越多。有資料統(tǒng)計,90%以上的嵌入式系統(tǒng)應用代碼都是采用C(或者C++)編寫的[9],掌握好C語言是學習嵌入式系統(tǒng)對前導課程的要求。由于課時限制,課程中很多內(nèi)容沒有講到,導致學生的C語言基礎(chǔ)不扎實,在嵌入式課程實驗中,往往C語言編寫的程序問題較多,特別是不會優(yōu)化處理。筆者根據(jù)多年的教學經(jīng)驗,在文章中所提出的問題,都是學生在學習嵌入式系統(tǒng)課程時經(jīng)常發(fā)生的,希望能夠起到拋磚引玉的作用,達到希望的教學目標,盡量通過程序優(yōu)化和編程技巧等方式降低前述問題發(fā)生的概率,提升嵌入式軟件開發(fā)的整體效率與質(zhì)量[10]。

        猜你喜歡
        嵌入式程序設(shè)置
        中隊崗位該如何設(shè)置
        少先隊活動(2021年4期)2021-07-23 01:46:22
        試論我國未決羈押程序的立法完善
        搭建基于Qt的嵌入式開發(fā)平臺
        “程序猿”的生活什么樣
        英國與歐盟正式啟動“離婚”程序程序
        嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應用
        本刊欄目設(shè)置說明
        中俄臨床醫(yī)學專業(yè)課程設(shè)置的比較與思考
        創(chuàng)衛(wèi)暗訪程序有待改進
        Altera加入嵌入式視覺聯(lián)盟
        久久精品国产av大片| 久久精品成人无码观看不卡| 国产精品va在线观看无码| 久久久久中文字幕精品无码免费| 性感人妻一区二区三区| 国产在线一区二区av| 午夜无遮挡男女啪啪免费软件| 少妇激情av一区二区| 中文字幕成人精品久久不卡| 亚洲一区二区蜜桃视频| 欧美牲交a欧美牲交aⅴ| 乱码精品一区二区三区| 亚洲中字幕永久在线观看| 综合久久精品亚洲天堂| 放荡的少妇2欧美版| 国产成人+亚洲欧洲+综合| 人妻中文字幕一区二区二区| 亚洲无精品一区二区在线观看| 中文字幕人妻第一区| 在线中文字幕有码中文| 麻美由真中文字幕人妻| 国产一区二区三区天堂| 精品人妻伦九区久久aaa片| 亚洲红怡院| 国产网红一区二区三区| 久久亚洲精品中文字幕| 女厕厕露p撒尿八个少妇| 色yeye在线观看| 国产一区二区三区成人| 亚洲av无码久久精品色欲| 亚洲精品国产综合一线久久| 日本岛国一区二区三区| 亚洲精品人成中文毛片| 无码国产精品一区二区免费模式| 国产91对白在线观看| 男女搞基视频免费网站| 国产午夜手机精彩视频| 伊人影院综合在线| 亚洲大片一区二区三区四区| 人人妻人人添人人爽欧美一区 | 中日韩字幕中文字幕一区|