一 首先總結一下SD卡的寫檔案,需注意的事項如下:
1. FAT16 寫的時候必須至少寫一個扇區。
2. FAT表不能頻繁的讀寫,否則會出錯。申請新的一個簇時,直接在這個簇裡面(即下一簇號)的寫為0XFFFF。
3. FAT似乎必須轉化成u16才能寫。貌似是這樣,具體沒仔細看。
4. 擷取新的索引簇的時候,直接從舊的索引簇的後面開始寫新的索引簇號,並在新的索引簇號中寫0XFFFF。
5. 寫FAT1後要寫FAT2。
6. 推薦幾款很不錯的工具:WinHex.exe。幫了我不少忙,可以將FAT裡面的資料分析得一清二楚。
二 其次,這次遇到了一個符號 “##”,到網上查了很長時間,沒有很明確的意思。
# 井號
# 前端處理符號
出現這個符號的代碼如下:
#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)</p><p>/* USB Endpoint Events Callback Pointers */<br />void (* const USB_P_EP[16]) (U32 event) = {<br /> P_EP(0),<br /> P_EP(1),<br /> P_EP(2),<br /> P_EP(3),<br /> P_EP(4),<br /> P_EP(5),<br /> P_EP(6),<br /> P_EP(7),<br /> P_EP(8),<br /> P_EP(9),<br /> P_EP(10),<br /> P_EP(11),<br /> P_EP(12),<br /> P_EP(13),<br /> P_EP(14),<br /> P_EP(15),<br />};</p><p>/*<br /> * USB Endpoint 1 Event Callback<br /> * Called automatically on USB Endpoint 1 Event<br /> * Parameter: event<br /> */</p><p>void USB_EndPoint1 (U32 event) {<br />}</p><p>/*<br /> * USB Endpoint 2 Event Callback<br /> * Called automatically on USB Endpoint 2 Event<br /> * Parameter: event<br /> */</p><p>void USB_EndPoint2 (U32 event) {</p><p> switch (event) {<br /> case USB_EVT_OUT:<br /> MSC_BulkOut();<br /> break;<br /> case USB_EVT_IN:<br /> MSC_BulkIn();<br /> break;<br /> }<br />}
其中的這句話 USB_EndPoint##n , 剛開始沒看懂,後來看懂了
比方說N是1的話,那麼USB_EndPoint##n即表示函數USB_EndPoint1。
這種寫法真是奇怪,等我搞明白後再來寫。
三 備忘一些函數指標相關的東東
int *p; p為指向整型量的指標變數
int *p[n]; p為指標數組,由n個指向整型量的指標元素組成。
int (*p)[n]; p為指向整型二維數組的指標變數,二維數組的列數為n
int *p() p為返回指標值的函數,該指標指向整型量
int (*p)() p為指向函數的指標,該函數返回整型量
int **p p為一個指向另一指標的指標變數,該指標指向一個整型量。
其中的int (*p)[n]; 遇到的情況貌似較少。