查看完整版本: 關於C語言列舉(enum)和 scope 和 life time 的的疑問?
頁: [1]

CodeMonk 發表於 2016-7-5 12:28 AM

關於C語言列舉(enum)和 scope 和 life time 的的疑問?

其實問題是這樣來的,最後再玩Arduino或STM8等開發板,想把所有特殊暫存器和他的控制方法全部塞到一個struct
當中,目前在想控制IO的struct,想好了測試好我會把它塞到那一個特殊暫存器的struct,到時候好處理,
然後想要把處理IO的方法寫成fountion,把他全放入一個叫作HandlePort的fountion(希望
HandlePort這個fountion的引數為列舉),然後把他加入struct中,最後就是用Commit把這個資料塞到真的控制
IO的暫存器當中,
總之用起來要會像這樣,

Creat_GPIO_SFR_Copy PoE = {&new};
PoE.new(&PoE)//這會初始化所有在Creat_GPIO_SFR_Copy這個struct裡的東西,
PoE.HandlePort("active low");
PoE.Commit();//真的改變特殊暫存器的內容,有就是把PortE這個struct裡的東西送到特殊暫存器理。

然後就再要如何宣告就有一堆問題了!


問題一: 目前是不知道如何定義一個scope只在這個struct裡的列舉,所以先用char來做,但總覺得好浪費空間的感覺!
所與想要把引數做成列舉,但是又想要它的 life time 和 scope 都只有再這個 struct,想不出怎麼辦!
問題二: new的  life time拿不定很難處理,我不想讓new變成全域subroutine但是總得有一個subroutine要把
這一個struct初始化吧!



void  new(char WhichPort);
static void  HANDLE_PORT(char * args , ....);
static void  COMMIT(char Port);

typedef struct {
    void (*new)(Creat_GPIO_SFR_Copy *This);
    void (*HandlePort)(char * args , ....);
     void (*Commit)(char Port);
    uint8_t Port_DataOutputLatchRegister;
    uint8_t Port_InputPinValueValueRegister;
    uint8_t Port_DataDirectionRegister;
    uint8_t Port_ControlRegister1;
    uint8_t Port_ControlRegister2;
} Creat_GPIO_SFR_Copy;



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

CodeMonk 發表於 2016-7-5 04:59 PM

本帖最後由 CodeMonk 於 2016-7-5 06:04 PM 編輯

目前寫到這樣子,其實我只是想要依組資料各自帶著操作自己資料function而已,
寫起來很亂,有沒有亙清楚的方法?這樣子感覺起來資料初始化會很困難。
所以開始學C語言,雖然現在有用puts或print f之類的
東西,但之後會拿掉。

##################################################################
#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>

typedef enum {
    test
} HandlePortArgs_t;

typedef enum {
    PortA,
    PortB,
    PortC,
    PortD,
    PortE,
    PortF
} newArgs_t;


struct  GPIO_Copy {
    newArgs_t WhichPort;
    void (*Commit)(struct GPIO_Copy *This);
    void (*HandlePort)(struct GPIO_Copy *This, ...);
    void (*ResetThePort)(struct GPIO_Copy *This);
    uint8_t Port_DataOutputLatchRegister;
    uint8_t Port_InputPinValueValueRegister;
    uint8_t Port_DataDirectionRegister;
    uint8_t Port_ControlRegister1;
    uint8_t Port_ControlRegister2;
};


static void new( struct GPIO_Copy *This,  newArgs_t ThisPort);
static void Commit(struct GPIO_Copy *This);
static void HandlePort(struct GPIO_Copy *This, ...);
static void ResetThePort(struct GPIO_Copy *This);


static void new(struct GPIO_Copy *This, newArgs_t ThisPort){
    This->WhichPort = ThisPort;
    This->Commit = &Commit;
    This->HandlePort = &HandlePort;
    This->ResetThePort = &ResetThePort;
    This->Port_DataOutputLatchRegister = 0x00;
    This->Port_InputPinValueValueRegister = 0x00;
    This->Port_DataDirectionRegister = 0x00;
    This->Port_ControlRegister1 = 0x00;
    This->Port_ControlRegister2 = 0x00;
}



static void Commit(struct GPIO_Copy *This){
    //not yet
   
    if(PortA == This->WhichPort){
        puts("PortA");
    }
    if(PortB == This->WhichPort){
        puts("PortB");
    }
    if(PortC == This->WhichPort){
        puts("PortC");
    }
    if(PortD == This->WhichPort){
        puts("PortD");
    }
    if(PortE == This->WhichPort){
        puts("PortE");
    }
    if(PortF == This->WhichPort){
        puts("PortF");
    }

}


static void HandlePort(struct GPIO_Copy *This, ...){
    //not yet
}

static void ResetThePort(struct GPIO_Copy *This){
    new(This, This->WhichPort);
}

typedef struct GPIO_Copy GPIO_Copy_t;


void main (void){
    GPIO_Copy_t a;
    new(&a, PortA);
    a.Commit(&a);  
}
##################################################################EOF

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2016-7-5 05:37 PM

本帖最後由 chevylin0802 於 2016-7-5 05:41 PM 編輯

Arduino是採取接近C++的語法做各種模組程式庫
但是如果是主程式則一般都只有用C的語法

主程式的部份最主要是把它規範成初始化以及迴圈執行的部份
因此setup成了初始化的函式而loop成了它迴圈執行的函式部份

也因為是如此
所以我看不懂你Arduino的時候怎麼會有main這種東西

一般來講
如果是8051的單晶片
則通常會直接就定義成P0, P1, P2....這個方式
P0.0表示是P0八個腳位裏的第一個GPIO腳
而且單晶片的程式寫法
還得看每一個晶片廠的習慣
比如TI的藍芽跟Zigbee晶片就有它自己的一套規範寫法

像你那樣的方式其實是想把控制的GPIO進行物件化
但事實上是沒有意義的
而且反而是在浪費時間
單晶片並沒有額外的RAM空間
因此寫單晶片的人從來不會考慮使用動態記憶體配置這種概念
因為記憶體空間很容易爆掉

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

CodeMonk 發表於 2016-7-5 05:42 PM

本帖最後由 CodeMonk 於 2016-7-5 05:45 PM 編輯

chevylin0802 發表於 2016-7-5 05:37 PM static/image/common/back.gif
Arduino是採取接近C++的語法做各種模組程式庫
但是如果是主程式則一般都只有用C的語法


我只是用他的開發板而已,事實上我完全不是用Arduion的IDE,然後目前我寫的這個少要用到STM8上的,
我用的編譯器是SDCC,雖然哪有一些版本不support AVR,學習的主要目的是了解8 bit mcu,但不太會寫C語言(剛學),其實也沒學過C++。
那樣的寫法容易把空間擠爆,了解,要想辦法減少空間(思考要如何做成macro吧)。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]