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

用IAR编译器开发DS80C400

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

e = socket(0, SOCKET_TYPE_STREAM, 0);

local.sin_port = htons(80);

bind(socket_handle, local, sizeof(local));

listen(socket_handle, 5);

printf(Ready to accept HTTP connections…r

);

// here is the main loop of the HTTP server

while (1)

{

new_socket_handle = accept(socket_handle, address, sizeof(address));

handleRequest(new_socket_handle);

closesocket(new_socket_handle);

}

注意当接收到一个新的socket时,这一简易应用程序不会启动一个新的线程或进程处理该请求,而是在同一进程中处理请求。任何优于该演示的HTTP服务器都会在一个新的线程中处理到来的请求,允许同时发生多个连接并能进行处理。请求处理完毕后我们关闭socket并等待下一个到来的连接。

handleRequest方法从接入的请求中解析出文件名并且验证请求方法为GET.不允许使用其它方法(即使是POST、HEAD或OPTIONS)。

为IAR编译器编写DS80C400汇编函数的注意事项

IAR文档提供了在8051汇编中编写程序,可从C程序中调用的方法。若8051汇编函数由IAR编译器编写的C程序来调用,在编写这些汇编语言时需切记以下几点。如果没有可用的寄存器传递变量时,会将这些变量以Little Endian顺序压入堆栈。

1.函数参变量传递约定

下表说明了变量的传递方式。

 下表显示了函数返回值的规则。

函数int foo(int x, int y,void* ptr);的变量和返回值的传递如下:

2.数据类型存储规则

  IAR遵循Little Endian存储规则。注意,IAR使用最低有效字节在前的二进制数据存储格式。

  例如,一个4字节长的数值0xDEADBEEF,将会按如下方式存储:

3.一个简单的汇编程序与'C'接口

本节演示如何编写一个汇编程序并用IAR Embedded Workbench与'C'程序接口。应用程序交换16位和32位字节,并将交换后的字节输出到默认的控制台。C的可调用函数原型是int ltob( int *shortptr , long *longptr)。

本示例程序由两个文件组成:main.c和eswap.s51.main.c调用我们用汇编语言编写的示例函数ltob()。创建一个新项目,命名为endian;添加cstartup.s51、low_level_init.s51、putchar.c文件以及Dallas Semiconductor ROM初始化库rominit.r51.详细资料请参考上述从8051 IAR Embedded Workbench开始。

用以下内容来创建一个新的main.c文件,并将该文件添加到项目endian中。在C中,必须声明一个函数,以便让编译器知道如何调用它。ltob()函数在main()之前声明。注意在成功运行后函数ltob()会返回'0',而且,如果任一指针为NULL则返回非零值。程序应向控制台输出以下结果:

创建一个新文件eswap.s51,输入以下汇编代码,并将它加入到项目endian中。这个汇编程序将我们的函数ltob()声明为PUBLIC,因此它能够由'C'程序调用。ltob()的第一个参数是指针,并通过DS80C400控制器的寄存器r3:r2:r1来传递。第二个参数也是一个指针,由IAR编译器压入偏移3至5堆栈(偏移3含有最低有效字节,偏移5含有最高有效字节)。首先,函数重新找到堆栈中存储的指针(指向一个32位值),交换它所指向的值,将交换后的字节存储在相同位置。同样,16位值也被字节交换并存储在交换前的同一位置。注意,通过汇编函数来保留寄存器r6和r7.这是因为IAR编译器将这些寄存器视为永久寄存器,意味着任何函数调用都不应修改这些寄存器。

#include reg400.inc

r0_b0 equ 0 ; Register bank 0 equates.

r1_b0 equ 1

r2_b0 equ 2

r3_b0 equ 3

r4_b0 equ 4

r5_b0 equ 5

r6_b0 equ 6

r7_b0 equ 7

PROGRAM ENDIAN_SWAP

PUBLIC ltob

RSEG FAR_CODE:CODE:NOROOT(0)

; ********************************************************************

;

; int ltob(unsigned int* shortptr, unsigned long* longptr)

;

;

********************************************************************

ltob:

// shortptr is in r3:r2:r1

// longptr is in stack at offset 5

; get the longptr stored in the stack

mov a,SP

clr c

subb a,#5

mov b,a

mov a,esp

anl a,#0x3

orl a,#0xDC ; extended stack is at 0xff dc00

subb a,#00 ; subtract 0x0005 to point to MSB of 2 nd argument

mov DPX,#0xFF

mov DPH,a

mov DPL,b

push r6_b0 ; save r6:r7 for the compiler

push r7_b0

movx a,@DPTR

mov r4,a ;store least significant byte of 'longptr' in r4

inc DPTR

movx a,@DPTR

mov r5,a ;store middle byte of 'longptr' in r5

inc DPTR

movx a,@DPTR

mov r6,a ;store most significant byte of 'longptr' in r6

mov a

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

网站地图

Top