浓毛老太交欧美老妇热爱乱,蜜臀性色av免费,妺妺窝人体色www看美女,久久久久久久久久久大尺度免费视频,麻豆人妻无码性色av专区

位置:51電子網(wǎng) » 技術(shù)資料 » 測(cè)試測(cè)量

構(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

相關(guān)IC型號(hào)

熱門點(diǎn)擊

 

推薦技術(shù)資料

音頻變壓器DIY
    筆者在本刊今年第六期上著重介紹了“四夾三”音頻變壓器的... [詳細(xì)]
版權(quán)所有:51dzw.COM
深圳服務(wù)熱線:13692101218  13751165337
粵ICP備09112631號(hào)-6(miitbeian.gov.cn)
公網(wǎng)安備44030402000607
深圳市碧威特網(wǎng)絡(luò)技術(shù)有限公司
付款方式


 復(fù)制成功!