DS80C400的Keil C語言編程
C_STARTUP: SJMP STARTUP1DB 'TINI' ; Tag for TINI Environment 1.02c; or later (ignored in 1.02b)DB 40h ; Target bank注意SJMP STARTUP1語句位于40區的地址0000處。由于sjmp語句占兩個字節,所以緊隨其后的執行標記{'T', 'I', 'N', 'I', 40h}位于地址0002。當鍵入'E'時,ROM在FEh存儲區中向下查找可執行代碼。如果鍵入'E'后執行了其他代碼,就說明ROM在高于 400000h (裝載你的代碼的位置)的地址處找到了執行標記,你可能需要找到該標記,并刪除該存儲區中的內容。
接口至ROM和ROM庫
從C中調用ROM函數比較復雜(調用ROM函數的步驟參見High-Speed Microcontroller User's Guide supplement for the DS80C4004)。必須將Keil C編譯器規范的參數轉換成ROM所使用的規范。Keil編譯器以XDATA地址和寄存器組合的方式傳遞參數。而ROM函數采用不同的方式接收參數。例如,套接字函數接受存放在單個參數緩沖器中的參數,而許多其他應用函數接受特殊功能寄存器或直接存儲器地址傳來的參數。Dallas Semiconductor編寫了訪問ROM函數的庫,可完成Keil調用規范與ROM參數規范間的翻譯工作。
要在你的C程序中使用ROM函數,只需要導入相應的庫,并包含一個頭文件。為了在你的項目中導入一個庫,在Keil項目窗口中右擊Source Group 1,并選擇Add Files to Group 'Source Group 1'。將文件過濾器改為‘*.lib’,選擇你需要的庫。然后在源代碼頂部加入頭文件。你可以使用任何一個庫函數。這些ROM庫可支持:
ROM初始化
DHCP客戶端操作
進程管理
套接字函數(TCP、UDP、Multicast)
TFTP客戶端操作
一些實用函數(CRC和偽隨機數產生等)
使用擴展庫
除了ROM庫,還有許多其他庫(還有更多正在編寫中)提供了很多ROM中沒有的實用功能。這些庫包括:
- | 文件系統,改編自TINI文件系統,實現stdio.h中聲明的方法。 |
- | DNS客戶端實現。 |
- | 1-Wire?,采用Public Domain Kit (參見www.ibutton.com.cn/software/1wire/wirckit.html)中定義的API。 |
- | I2C,實現一個類似于TINI中所用的設計。 |
- | CAN,實現一個類似于TINI中所用的設計。 |
為DS80C400提供的C庫項目(包括文檔、應用實例和發行說明)可以在http://files.dalsemi.com/tini/ds80c400/c_libraries/index.html上找到。
一個簡單的HTTP服務器和SNTP客戶端應用
Dallas Semiconductor編寫了一個小的應用程序來演示這些庫的功能,特別是文件系統、套接字、進程調度器和TFTP庫等。應用實例中包括一個SNTP 客戶端和一個只響應'GET'請求的HTTP服務器。它使用Dallas Semiconductor提供的核心庫調用套接字和調度器函數。它還使用文件系統保存了幾個網頁。該應用由兩個進程組成:(1) HTTP服務器作為一個新進程被創建并用來處理端口80上的連接,以及(2)主進程位于一個循環中,約每60秒嘗試進行一次時間同步。
文件系統的初始化
啟動HTTP服務器之前,必須初始化文件系統。演示程序確保兩個靜態文件,主頁(index.html)和程序源碼(source.html),在服務器啟動之前已位于文件系統中。 可以用多種方法將這些文件安裝到文件系統。方法之一是在程序代碼數據中包含這些文件的文本,然后,在啟動時將文件數據寫到文件系統。這是最簡單的方法,而且我們的演示程序也有空閑的代碼空間可供使用。
本演示程序通過TFTP服務器查找它所需要的文件并初始化其文件系統。這是一種更為有趣、并且更能展示DS80C400內置功能的方法。在我們這個實例中,TFTP服務器在一個已知的IP地址上運行。文件index.html和source.html由TFTP服務器獲得,然后被寫入文件系統。
void initialize_filesystem(){struct sockaddr address;unsigned int i;unsigned int result;void* start = (void*)FS_START;// initialize the file systemint x = finit(FOPEN_MAX, FS_BLOCKS, start);printf("Result of FS init: %d r", x);if ((x==0) (fexists("index.html")==0) (fexists("source.html")==0)){printf("File system OK, skip TFTP init.r");return;}// lets get the files we want off a TFTP server// initialize TFTP server settingfor (i=0;i18;i++)address.sin_addr[i] = 0;// since the DS80C400 supports Ipv6, the address is 16 bytes long// however, since we are only using Ipv4 addresses, only the last// 4 bytes are meaningfuladdress.sin_addr[12] = TFTP_IP_MSB;address.sin_addr[13] = TFTP_IP_2;address.sin_addr[14] = TFTP_IP_3;address.sin_addr[15] = TFTP_IP_LSB;result = settftpserver(address, sizeof(struct sockaddr));printf("Set TFTP server to selected server, result: %ur", result);result = tftp_init();printf("Result of TFTP init: %u r", result);get_tftp_file("source.html");get_tftp_file("index.html");}void get_tftp_file(char* filename){unsigned int result;unsigned char* TFTP_MSG;FILE* file;printf("Free FS RAM: %ldr", getFreeFSRAM());TFTP_MSG = getTFTPData();file = fopen(filename, "w");result = tftp_first(filename);if (result==0xFFFF){printf("Error in TFTP_FIRST...r");return;}printf("Result of first segment: %ur", result);fwrite(TFTP_MSG, 1, result, file);while (result >= 512){result = tftp_next(TFTP_MORE_DATA);if (result==0xFFFF){printf("Error in TFTP_NEXT...r");return;}printf("Result of next segment: %ur", result);TFTP_MSG[result] = 0;fwrite(TFTP_MSG, 1, result, file);}tftp_next(TFTP_LAST_SEGMENT);fclose(file);printf("Done with TFTP server.r");}
c語言相關文章:c語言教程
評論