用IAR编译器开发DS80C400
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
- DS80C400的Keil C语言编程(02-01)
- 嵌入式软件设计中查找缺陷的几个技巧(03-06)
- 基于算法的DSP硬件结构分析(04-02)
- Windows CE下驱动程序开发基础(04-10)
- DSP+FPGA在高速高精运动控制器中的应用(05-17)
- 基于USB接口和DSP的飞机防滑刹车测试系统设计(05-19)