頁:
[1]
關於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 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: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: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]