構(gòu)造一個(gè)51單片機(jī)的實(shí)時(shí)操作系統(tǒng)
發(fā)布時(shí)間:2008/5/27 0:00:00 訪問次數(shù):776
    
    
    摘 要:從keil c51的內(nèi)存空間管理方式入手,著重討論實(shí)時(shí)操作系統(tǒng)在任務(wù)調(diào)度時(shí)的重入問題,分析一些解決重入的基本方式與方法:分析實(shí)時(shí)操作系統(tǒng)任務(wù)調(diào)度的占先性,提出非占先的任務(wù)調(diào)度是能更適合于keil c51的一種調(diào)度方式。為此,構(gòu)造這一實(shí)時(shí)操作系統(tǒng),并有針對(duì)性地介紹此系統(tǒng)的堆管理方法、任務(wù)的建立以廈任務(wù)的切換等。
    關(guān)鍵詞:51單片機(jī) 實(shí)時(shí)操作系統(tǒng) 任務(wù)重八調(diào)度
    目前,大多數(shù)的產(chǎn)品開發(fā)是在基于一些小容量的單片機(jī)上進(jìn)行的。51系列單片機(jī),是我國目前使用最多的單片機(jī)系列之一,有非常廣大的應(yīng)用環(huán)境與前景,多年來的資源積累,使51系列單片機(jī)仍是許多開發(fā)者的首選。針對(duì)這種情況,近幾年涌現(xiàn)出許多基于51內(nèi)核的擴(kuò)展芯片,功能越來越齊全,速度越來越快,也從一個(gè)側(cè)面說明了51系列單片機(jī)在國內(nèi)的生命力。
    多年來我們一直想找一個(gè)合適的實(shí)時(shí)操作系統(tǒng),作為自己的開發(fā)基礎(chǔ)。根據(jù)開發(fā)需求,整合一些常用的嵌入式構(gòu)件,以節(jié)約開發(fā)時(shí)間,盡最大可能地減少開發(fā)工作量;另外,要求這個(gè)實(shí)時(shí)操作系統(tǒng)能非常容易地嵌入到小容量的芯片中。畢竟,大系統(tǒng)是少數(shù)的,而小應(yīng)用是多數(shù)而廣泛的。顯而易見,μc/os—ii是不太適合于以上要求的,而keil c所帶的rtx tiny不帶源代碼,不具透明性,至于其full版本就更不用說了。
    1 keii c51與重入問題
    說到實(shí)時(shí)操作系統(tǒng),就不能不考慮重入問題。對(duì)于pc機(jī)這樣的大內(nèi)存處理器而言,這似乎并不是一個(gè)很麻煩的問題,借用μc/os—ii rtos的說法,即要求在重入的函數(shù)內(nèi),使用局部變量。但5l系列單片機(jī)堆?臻g很小,僅局限在256字節(jié)之內(nèi),無法為每個(gè)函數(shù)都分配一個(gè)局部堆空間。正是由于這個(gè)原因,keil c51使用了所謂的可覆蓋技術(shù):
    ①局部變量存儲(chǔ)在全局ram空間(不考慮擴(kuò)展外部存儲(chǔ)器的情況);
    ②在編譯鏈接時(shí),即已經(jīng)完成局部變量的定位;
    ③如果各函數(shù)之間沒有直接或間接的調(diào)用關(guān)系,則其局部變量空間便可覆蓋。
    正是由于以上的原因,在keil c51環(huán)境下,純粹的函數(shù)如果不加處理(如增加一個(gè)模擬棧),是無法重人的。那么在keil c5l環(huán)境下,如何使其函數(shù)具有可重人性呢?下面分析在實(shí)時(shí)操作系統(tǒng)下面,任務(wù)的基本結(jié)構(gòu)與模式:
    vold taska(void*ptr){
    uint8 val_a;
    //其他一些變量定義
    do{
    //實(shí)際的用戶任務(wù)處理代碼
    }while(1);
    }
    void taskb(void*ptr){
    uint8 valb;
    //其他一些變量定義
    do{
    funcl();
    //其他實(shí)際的用戶任務(wù)處理代碼
    )while(1);
    void funcl(){
    ulnt8 v al_fa;
    //其他變量的定義
    //函數(shù)的處理代碼
    }
    
    在上面的代碼中,taska與taskb并不存在直接或間接的調(diào)用關(guān)系,因而其局部變量val_a與val_b便是可以被互相覆蓋的,即其可能都被定位于某一個(gè)相同的ram空間。這樣,當(dāng)taska運(yùn)行一段時(shí)間,改變了val_a后,taskb取得cpu控制權(quán)并運(yùn)行時(shí),便可能會(huì)改變val_b。由于其指向相同的ram空間,導(dǎo)致taska重新取得cpu控制權(quán)時(shí),val—a的值已經(jīng)改變,從而導(dǎo)致程序運(yùn)行不正確,反過來亦然。另一方面,funcl()與taskb有直接的調(diào)用關(guān)系,因而其局部變量val_fa與val_b不會(huì)被互相覆蓋,但也不能保證其局部變量val_fa不會(huì)與taska或其他任務(wù)的局部變量形成可覆蓋關(guān)系。
    
    將val_a、val_b以及val_fa等局部變量定義為靜態(tài)變量(加上static指示符)可以解決這一問題。但問題是,定義大量的static類型變量,將導(dǎo)致ram空間的大量占用,有可能直接導(dǎo)致ram空間不夠用。尤其是在一些小容量的單片機(jī)內(nèi),一般只有128或256字節(jié),大量的靜態(tài)變量定義,在如此小的ram資源狀況下顯然就不太合適了。由此而有了另一種的解決方法,如下代碼所示:
    void taskc(void){
    uint8 x,v;
   &nbs
    
    
    摘 要:從keil c51的內(nèi)存空間管理方式入手,著重討論實(shí)時(shí)操作系統(tǒng)在任務(wù)調(diào)度時(shí)的重入問題,分析一些解決重入的基本方式與方法:分析實(shí)時(shí)操作系統(tǒng)任務(wù)調(diào)度的占先性,提出非占先的任務(wù)調(diào)度是能更適合于keil c51的一種調(diào)度方式。為此,構(gòu)造這一實(shí)時(shí)操作系統(tǒng),并有針對(duì)性地介紹此系統(tǒng)的堆管理方法、任務(wù)的建立以廈任務(wù)的切換等。
    關(guān)鍵詞:51單片機(jī) 實(shí)時(shí)操作系統(tǒng) 任務(wù)重八調(diào)度
    目前,大多數(shù)的產(chǎn)品開發(fā)是在基于一些小容量的單片機(jī)上進(jìn)行的。51系列單片機(jī),是我國目前使用最多的單片機(jī)系列之一,有非常廣大的應(yīng)用環(huán)境與前景,多年來的資源積累,使51系列單片機(jī)仍是許多開發(fā)者的首選。針對(duì)這種情況,近幾年涌現(xiàn)出許多基于51內(nèi)核的擴(kuò)展芯片,功能越來越齊全,速度越來越快,也從一個(gè)側(cè)面說明了51系列單片機(jī)在國內(nèi)的生命力。
    多年來我們一直想找一個(gè)合適的實(shí)時(shí)操作系統(tǒng),作為自己的開發(fā)基礎(chǔ)。根據(jù)開發(fā)需求,整合一些常用的嵌入式構(gòu)件,以節(jié)約開發(fā)時(shí)間,盡最大可能地減少開發(fā)工作量;另外,要求這個(gè)實(shí)時(shí)操作系統(tǒng)能非常容易地嵌入到小容量的芯片中。畢竟,大系統(tǒng)是少數(shù)的,而小應(yīng)用是多數(shù)而廣泛的。顯而易見,μc/os—ii是不太適合于以上要求的,而keil c所帶的rtx tiny不帶源代碼,不具透明性,至于其full版本就更不用說了。
    1 keii c51與重入問題
    說到實(shí)時(shí)操作系統(tǒng),就不能不考慮重入問題。對(duì)于pc機(jī)這樣的大內(nèi)存處理器而言,這似乎并不是一個(gè)很麻煩的問題,借用μc/os—ii rtos的說法,即要求在重入的函數(shù)內(nèi),使用局部變量。但5l系列單片機(jī)堆?臻g很小,僅局限在256字節(jié)之內(nèi),無法為每個(gè)函數(shù)都分配一個(gè)局部堆空間。正是由于這個(gè)原因,keil c51使用了所謂的可覆蓋技術(shù):
    ①局部變量存儲(chǔ)在全局ram空間(不考慮擴(kuò)展外部存儲(chǔ)器的情況);
    ②在編譯鏈接時(shí),即已經(jīng)完成局部變量的定位;
    ③如果各函數(shù)之間沒有直接或間接的調(diào)用關(guān)系,則其局部變量空間便可覆蓋。
    正是由于以上的原因,在keil c51環(huán)境下,純粹的函數(shù)如果不加處理(如增加一個(gè)模擬棧),是無法重人的。那么在keil c5l環(huán)境下,如何使其函數(shù)具有可重人性呢?下面分析在實(shí)時(shí)操作系統(tǒng)下面,任務(wù)的基本結(jié)構(gòu)與模式:
    vold taska(void*ptr){
    uint8 val_a;
    //其他一些變量定義
    do{
    //實(shí)際的用戶任務(wù)處理代碼
    }while(1);
    }
    void taskb(void*ptr){
    uint8 valb;
    //其他一些變量定義
    do{
    funcl();
    //其他實(shí)際的用戶任務(wù)處理代碼
    )while(1);
    void funcl(){
    ulnt8 v al_fa;
    //其他變量的定義
    //函數(shù)的處理代碼
    }
    
    在上面的代碼中,taska與taskb并不存在直接或間接的調(diào)用關(guān)系,因而其局部變量val_a與val_b便是可以被互相覆蓋的,即其可能都被定位于某一個(gè)相同的ram空間。這樣,當(dāng)taska運(yùn)行一段時(shí)間,改變了val_a后,taskb取得cpu控制權(quán)并運(yùn)行時(shí),便可能會(huì)改變val_b。由于其指向相同的ram空間,導(dǎo)致taska重新取得cpu控制權(quán)時(shí),val—a的值已經(jīng)改變,從而導(dǎo)致程序運(yùn)行不正確,反過來亦然。另一方面,funcl()與taskb有直接的調(diào)用關(guān)系,因而其局部變量val_fa與val_b不會(huì)被互相覆蓋,但也不能保證其局部變量val_fa不會(huì)與taska或其他任務(wù)的局部變量形成可覆蓋關(guān)系。
    
    將val_a、val_b以及val_fa等局部變量定義為靜態(tài)變量(加上static指示符)可以解決這一問題。但問題是,定義大量的static類型變量,將導(dǎo)致ram空間的大量占用,有可能直接導(dǎo)致ram空間不夠用。尤其是在一些小容量的單片機(jī)內(nèi),一般只有128或256字節(jié),大量的靜態(tài)變量定義,在如此小的ram資源狀況下顯然就不太合適了。由此而有了另一種的解決方法,如下代碼所示:
    void taskc(void){
    uint8 x,v;
   &nbs
熱門點(diǎn)擊
- 51單片機(jī)定時(shí)器實(shí)驗(yàn)
- 單片機(jī)C51串口中斷接收和發(fā)送測(cè)試
- 51單片機(jī)的串行口擴(kuò)展方法
- 24C04在2051系統(tǒng)中的使用
- 大家一起來學(xué)單片機(jī):LED花樣燈
- MIDI信號(hào)的解碼及實(shí)時(shí)音符顯示
- 帶ADC、PWM和比較器的單片機(jī)-EM78P
- 基于AVR的VGA顯示和激光打印系統(tǒng)
- 無觸點(diǎn)云臺(tái)鏡頭通訊控制電路的設(shè)計(jì)
- 51單片機(jī)串-并轉(zhuǎn)換實(shí)驗(yàn)
推薦技術(shù)資料
- CV/CC InnoSwitch3-AQ 開
- URF1DxxM-60WR3系
- 1-6W URA24xxN-x
- 閉環(huán)磁通門信號(hào)調(diào)節(jié)芯片NSDRV401
- SK-RiSC-SOM-H27X-V1.1應(yīng)
- RISC技術(shù)8位微控制器參數(shù)設(shè)
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究