新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > DS80C400的Keil C语言编程

DS80C400的Keil C语言编程

作者:时间:2012-02-01来源:网络收藏
      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 4)。必须将 C编译器规范的参数转换成ROM所使用的规范。编译器以XDATA地址和寄存器组合的方式传递参数。而ROM函数采用不同的方式接收参数。例如,套接字函数接受存放在单个参数缓冲器中的参数,而许多其他应用函数接受特殊功能寄存器或直接存储器地址传来的参数。Dallas Semiconductor编写了访问ROM函数的库,可完成调用规范与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中所用的设计。

提供的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服务器查找它所需要的文件并初始化其文件系统。这是一种更为有趣、并且更能展示内置功能的方法。在我们这个实例中,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语言教程




评论


相关推荐

技术专区

关闭