|
應(yīng)FFT邀請,談?wù)勗贔149的TCP/IP功能上的增強,實際上我接觸430的時間很短(FFT,moom知道,只有半年多),只是天天跟 CaptureCIS+Allegro,IAR Compiler, CodeWright, VisualC++, cvs, gcc打交道,方方面面都要做(誰叫我在小公司打 工呢),上手快些而已.就如FFT所說,希望在不觸及(或自己不覺得影響到)商業(yè)/工業(yè)秘密的時候,各位同行多多交流交流,互促進步. 程序以TI網(wǎng)站上原碼為最初原型(其實當初我最早想移植uIP的,后來看到時間緊,放棄了)
1.文件結(jié)構(gòu)調(diào)整 當我一看到TI的范例,就對其結(jié)構(gòu)不已為然,通篇項目只有一個C,其他都是關(guān)聯(lián)近來的,這完全不時一個標準C/C++程 序員的風格嘛,對功能擴展,錯誤跟蹤分析不利,所以我第一件事就改了文件結(jié)構(gòu)劃分. 使各個C文件單獨編譯,最后連接,其他應(yīng)用程序當然是單獨的文件了, 免得在調(diào)試和分析的時候在整個項目到處亂翻 編量和代碼實現(xiàn). 另外由于Socket的應(yīng)用顯然包括網(wǎng)絡(luò)的兩端,因此單獨列出一兩個H文件,方便和其他系統(tǒng)C的編譯連接(如port定義, 各個socket命令參數(shù),格式等),由于平臺的相關(guān)性,強烈建議采用uIP等的數(shù)據(jù)類型定義方式,以免以后與32位系統(tǒng) socket聯(lián)調(diào)時麻煩.
2.FLASH區(qū)域的詳細劃分: 主要代碼區(qū) 應(yīng)用數(shù)據(jù)區(qū) 系統(tǒng)升級代碼及永久數(shù)據(jù)區(qū)(永久數(shù)據(jù)包括MAC地址等,注意IP地址并不在此內(nèi),其實IP,Gateway,等參數(shù)隨時可能改 變) 網(wǎng)絡(luò)信息區(qū)(IP地址,SubNetMask,別名等等) 系統(tǒng)版本區(qū)(軟硬件版本信息,只有系統(tǒng)在線自升級才修改,保留信息結(jié)構(gòu)的一致性,要有擴充余地,方便高端程序?qū)? 該設(shè)備基本軟硬件信息的訪問) 中斷向量區(qū)(系統(tǒng)固定,但軟件在線升級時要更改, 因為很可能你的產(chǎn)品安裝后要在線升級軟件版本,而你的新的軟 件版本改變了中斷方式和中斷數(shù)量!!!)
3.編譯器連接器的設(shè)定 配合FLASH的劃分,設(shè)定相關(guān)的連接參數(shù): 我的如下XXXX代表應(yīng)用層)
-cMSP430 -Z(DATA)UDATA0,IDATA0,ECSTR=0200-09FF -Z(DATA)CSTACK#0200-0A00 //keep 300b+(12c) for stack!!! (check map file) -Z(CODE)INFO=1000-10FF // Main memory (FLASH) //map of msp430f149 //1000-107f Segment B (system mode) (128 bytes) Segment B //1080-10ff Segment A (node-net info) (128 bytes) Segment A //1100-11ff NOT USED ..............!!!!!!!!!!.................. (256 bytes) Segment 119# //special for F149!!! see slas272d.pdf P12 //1200-91ff xxxx-zone (32k bytes) Segment 55# - 118# //9200-f9ff general code,const -- changed under system upgraded (26k bytes) Segment 3# - 54# (512B/seg) //fa00-fbff chip info --maybe changed under system upgraded (512 bytes) Segment 2# //fc00-fdff mac address --never change!!! (512 bytes) Segment 1# //fe00-ffff interrupt vectors -- maybe changed (512 bytes) Segment 0# - w/Interrupt Vectors
-Z(CODE)SYS_MODE_TABLE=1000-107F -Z(CODE)NODE_INFO_TABLE=1080-10FF -Z(CODE)xxxx_ZONE=1200-91FF -Z(CODE)CODE,CONST,CSTR,CDATA0,CCSTR=9200-f9ff -Z(CODE)CHIP_INFO=fa00-fbff -Z(CODE)MAC_TABLE=fc00-Fdff -Z(CODE)INTVEC=FFE0-FFFF
4.變量和代碼的優(yōu)化 TCP/IP協(xié)議中用了很多全局/局部變量,我更改了一些簡單變量為結(jié)構(gòu)模式,有些直接放在響應(yīng)的FLASH區(qū),從而提高代 碼的效率和節(jié)約了內(nèi)存.有些函數(shù)的參數(shù)盡量減少到2個以內(nèi)(或分開列出),而有些函數(shù)根本不必要單獨列出,用宏來代 替就可以了(效率),以下范例:
a. 合并兩個重復(fù)的代碼: //#define SwapBytes(Data) ((u16_t)((Data >> 8) | (Data << 8))) #define SWAPB(Word) ((u16_t)((Word) << 8) | ((Word) >> 8))
b. TxTCPBuffer 和 RxTCPBuffer 的直接訪問(不用多次拷貝----浪費內(nèi)寸和時間!!!) extern u8_t RxTCPBuffer[MSP_MAX_TCP_RX_DATA_SIZE]; // space for incoming TCP-data //pointer of RX_BUFFER #define TCP_REQ_PTR_KEY ((u8_t *)TCP_RX_BUF) #define TCP_REQ_PTR_ORDER ((u8_t *)TCP_REQ_PTR_KEY +sizeof(u32_t)) #define TCP_REQ_PTR_LEN ((u8_t *)TCP_REQ_PTR_ORDER +sizeof(u16_t)) #define TCP_REQ_PTR_DATA ((u8_t *)TCP_REQ_PTR_LEN +sizeof(u16_t)) #define TCP_REQ_KEY ((u32_t)*((u32_t *)TCP_REQ_PTR_KEY)) #define TCP_REQ_ORDER ((u16_t)*((u16_t *)TCP_REQ_PTR_ORDER))
|