微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用IAR编译器开发DS80C400

用IAR编译器开发DS80C400

时间:12-16 来源:互联网 点击:

数接收由特殊功能寄存器或堆栈存储器传递的参数。为了从IAR调用方式转换为ROM参数方式,Dallas Semiconductor已经编写了访问ROM函数的库。

在您的C程序中使用ROM函数只需包含一个头文件并与相应的库文件连接即可。用于IAR编译器的ROM库包括:

ROM初始化程序

DHCP客户端

进程调度

Sockets (TCP、UDP和Multicast)

TFTP客户端

功能函数(CRC16, 随机数)

在撰写本文时,还没有为IAR编译器提供包括文件系统、邮件客户端和HTTP服务器之类的扩展库。请关注IAR库主页上的DS80C4004升级信息,我们会添加更多支持IAR的库。

简单应用: HTTP服务器

这里编写了一个简单的http服务器说明如何使用一些ROM库函数,特别是socket和进程调度库。该示例应用程序由两个模块组成:一个HTTP服务器和一个SNTP客户端。主程序生成一个新的子任务来运行http服务器,用于处理80端口上的客户连接。父任务每60秒会试图通过时间服务器同步当前时间。

SNTP客户端模块

以下代码实现SNTP客户端模块的核心功能。

socket_handle = socket(0, SOCKET_TYPE_DATAGRAM, 0);

for (i=0;i256;i++)

buffer[i] = 0;

// set a timeout of about 2 seconds

buffer[0] = 0x0;

buffer[1] = 0x0;

buffer[2] = 0x8;

buffer[3] = 0x0;

setsockopt(socket_handle, 0, SO_TIMEOUT, buffer, 200);

buffer[2] = 0; //reset since we used this in call to setsockopt

buffer[0] = 0x23; // No warning/NTP Ver 4/Client

address.sin_addr[12] = TIME_NIST_GOV_IP_MSB;

address.sin_addr[13] = TIME_NIST_GOV_IP_2;

address.sin_addr[14] = TIME_NIST_GOV_IP_3;

address.sin_addr[15] = TIME_NIST_GOV_IP_LSB;

address.sin_port = htons(NTP_PORT) // port number

sendto(socket_handle, buffer, 48, 0, address, sizeof(struct sockaddr));

recvfrom(socket_handle, buffer, 256, 0, address, sizeof(struct sockaddr));

//IAR uses little Endian for storing data, so reorganize the data before //converting it to long

buffer[0]=buffer[43];

buffer[1]=buffer[42];

buffer[2]=buffer[41];

buffer[3]=buffer[40];

timeStamp = *(unsigned long *)(buffer[0]);

formatTimeString(timeStamp, London, last_time_reading_1);

formatTimeString(timeStamp - (6 * SECONDS_PER_HOUR), Dallas, last_time_reading_2);

formatTimeString(timeStamp + (5 * SECONDS_PER_HOUR) + (30 * SECONDS_PER_MINUTE), Bangalore, last_time_reading_3);

formatTimeString(timeStamp - (10 * SECONDS_PER_HOUR), Honolulu,

last_time_reading_4);

last_reading_seconds = getTimeSeconds();

closesocket(socket_handle);

SNTP客户端模块是通过RFC 1361实现的。SNTP模块通过使用UDP协议和time.nist.gov通信,并请求一个时间标记。需注意撰写本应用笔记时还不能提供DNS查找支持,因此time.nist.gov的IP地址是人工设定的。

首先,创建一个数据包socket并分配一个大约2秒(0x800==2048毫秒)的超时。这样会保证如果和我们选中的服务器通信失败,我们不会无休止地等待响应。

接下来的一行用来设置请求选项。在RFC 1361的第3节对这些位进行了说明。0x23在一个闰秒不产生告警,要求使用版本4 NTP,并声明模式为Client.我们使用普通数据包函数sendto和recvfrom请求发送并接收响应后,将时间标记的秒赋予变量timeStamp,然后调整至参考日期1970年1月1号。用函数formatTimeString将时间标记转换成一个可读字符串,比如说In London it is 05:33:19 on May 11, 2005.

用函数getTimeSeconds 确定基于DS80C400内部时钟的最后一次更新时间。由于程序大约每60秒更新一次,HTML网页time.html将会使用该数值来报告上一次时间更新后已经过了多长时间。最后,关闭socket,SNTP客户端进入另一个60秒的休眠期。

简单HTTP服务器

这个时间服务器应用程序的另一个子模块为web服务器。此应用程序中的HTTP服务器实现了一个RFC 2068中描述的HTTP服务器简易版本。在我们的版本中,仅支持GET方法,忽略输入头文件,并且几乎不给出输出包头。在撰写这篇应用笔记时尚未提供文件系统库,因此示例应用程序动态地生成HTML网页。

通过调用Berkley-style socket函数来创建服务器socket.这使得建立一个服务器socket十分容易。以下代码给出我们的简易HTTP服务器的创建、绑定和接受新连接。

struct sockaddr local;

unsigned int socket_handle, new_socket_handle, temp;

socket_handl

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top