DS80C400的Keil C語(yǔ)言編程
C_STARTUP: SJMP STARTUP1DB 'TINI' ; Tag for TINI Environment 1.02c; or later (ignored in 1.02b)DB 40h ; Target bank注意SJMP STARTUP1語(yǔ)句位于40區的地址0000處。由于sjmp語(yǔ)句占兩個(gè)字節,所以緊隨其后的執行標記{'T', 'I', 'N', 'I', 40h}位于地址0002。當鍵入'E'時(shí),ROM在FEh存儲區中向下查找可執行代碼。如果鍵入'E'后執行了其他代碼,就說(shuō)明ROM在高于 400000h (裝載你的代碼的位置)的地址處找到了執行標記,你可能需要找到該標記,并刪除該存儲區中的內容。
接口至ROM和ROM庫
從C中調用ROM函數比較復雜(調用ROM函數的步驟參見(jiàn)High-Speed Microcontroller User's Guide supplement for the DS80C4004)。必須將Keil C編譯器規范的參數轉換成ROM所使用的規范。Keil編譯器以XDATA地址和寄存器組合的方式傳遞參數。而ROM函數采用不同的方式接收參數。例如,套接字函數接受存放在單個(gè)參數緩沖器中的參數,而許多其他應用函數接受特殊功能寄存器或直接存儲器地址傳來(lái)的參數。Dallas Semiconductor編寫(xiě)了訪(fǎng)問(wèn)ROM函數的庫,可完成Keil調用規范與ROM參數規范間的翻譯工作。
要在你的C程序中使用ROM函數,只需要導入相應的庫,并包含一個(gè)頭文件。為了在你的項目中導入一個(gè)庫,在Keil項目窗口中右擊Source Group 1,并選擇Add Files to Group 'Source Group 1'。將文件過(guò)濾器改為‘*.lib’,選擇你需要的庫。然后在源代碼頂部加入頭文件。你可以使用任何一個(gè)庫函數。這些ROM庫可支持:
ROM初始化
DHCP客戶(hù)端操作
進(jìn)程管理
套接字函數(TCP、UDP、Multicast)
TFTP客戶(hù)端操作
一些實(shí)用函數(CRC和偽隨機數產(chǎn)生等)
使用擴展庫
除了ROM庫,還有許多其他庫(還有更多正在編寫(xiě)中)提供了很多ROM中沒(méi)有的實(shí)用功能。這些庫包括:
- | 文件系統,改編自TINI文件系統,實(shí)現stdio.h中聲明的方法。 |
- | DNS客戶(hù)端實(shí)現。 |
- | 1-Wire?,采用Public Domain Kit (參見(jiàn)www.ibutton.com.cn/software/1wire/wirckit.html)中定義的API。 |
- | I2C,實(shí)現一個(gè)類(lèi)似于TINI中所用的設計。 |
- | CAN,實(shí)現一個(gè)類(lèi)似于TINI中所用的設計。 |
為DS80C400提供的C庫項目(包括文檔、應用實(shí)例和發(fā)行說(shuō)明)可以在http://files.dalsemi.com/tini/ds80c400/c_libraries/index.html上找到。
一個(gè)簡(jiǎn)單的HTTP服務(wù)器和SNTP客戶(hù)端應用
Dallas Semiconductor編寫(xiě)了一個(gè)小的應用程序來(lái)演示這些庫的功能,特別是文件系統、套接字、進(jìn)程調度器和TFTP庫等。應用實(shí)例中包括一個(gè)SNTP 客戶(hù)端和一個(gè)只響應'GET'請求的HTTP服務(wù)器。它使用Dallas Semiconductor提供的核心庫調用套接字和調度器函數。它還使用文件系統保存了幾個(gè)網(wǎng)頁(yè)。該應用由兩個(gè)進(jìn)程組成:(1) HTTP服務(wù)器作為一個(gè)新進(jìn)程被創(chuàng )建并用來(lái)處理端口80上的連接,以及(2)主進(jìn)程位于一個(gè)循環(huán)中,約每60秒嘗試進(jìn)行一次時(shí)間同步。
文件系統的初始化
啟動(dòng)HTTP服務(wù)器之前,必須初始化文件系統。演示程序確保兩個(gè)靜態(tài)文件,主頁(yè)(index.html)和程序源碼(source.html),在服務(wù)器啟動(dòng)之前已位于文件系統中。 可以用多種方法將這些文件安裝到文件系統。方法之一是在程序代碼數據中包含這些文件的文本,然后,在啟動(dòng)時(shí)將文件數據寫(xiě)到文件系統。這是最簡(jiǎn)單的方法,而且我們的演示程序也有空閑的代碼空間可供使用。
本演示程序通過(guò)TFTP服務(wù)器查找它所需要的文件并初始化其文件系統。這是一種更為有趣、并且更能展示DS80C400內置功能的方法。在我們這個(gè)實(shí)例中,TFTP服務(wù)器在一個(gè)已知的IP地址上運行。文件index.html和source.html由TFTP服務(wù)器獲得,然后被寫(xiě)入文件系統。
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語(yǔ)言相關(guān)文章:c語(yǔ)言教程
評論