一、实验内容
1、 完成S3C2440开发板的基本测试任务。
在PC机上运行DNW.exe,在configuration中设置为:COM1,波特率为115200,USBPort中地址选择0x32000000
开发板上电或复位后,在DNW中敲入任意键进入Bootloader功能界面,如下图:
在DNW中输入“0”进入USB下载并运行,出现“USBhost is connected.waiting a download.” 说明USB正确枚举了,这时可以通过USB下载了。在DNW中选择“USB Port”下的”Transmit”选项,选择SYSTEM-2440A_Test.bin 这个映像文件,接着点击打开,这样就开始下载了。下载结束后,会自动运行。出现如下界面,然后可以分别进行相关外围资源测试,分别有:蜂鸣器测试(Test PWM),实时时钟测试(RTC time display),ADC测试(Test ADC),按键测试(Testinterrupt and key scan),触摸屏测试(Test Touchpanel),LCD 测试(Test LCD),红外线测试(Test IrDA),IIC 测试(Test IIC EEPROM),音频输出测试(UDA1341 playmusic),音频输入测试(UDA1341 recird voice)。
1、 编写Hello World!,完成编译,下载到开发板运作。
首先需要启动Linux,进入Bootloader的主功能菜单后,选择“7”对启动参数进行配置,在接着出现的选项中输入“0”进行启动系统选择设置,然后回车,在出现“please enter value:”的提示下,输入1(1为Linux系统,3为WIN CE系统),然后回车,接着再进行一次回车(相当于输入15号退出功能),将会提示“Do you want to saveparameters? press y or Y for save.”,这时输入“y”,这样就将该参数保存了。如下图所示,退出后返回上一级界面,选择“5”从Nand Flash上启动程序。
然后在虚拟机上实验程序,hello.c代码如下:
#include<stdio.h>
int main()
{
printf(“Hello World!\n”);return 0;
}
由于虚拟机没有安装交叉编译软件包,所以需要将硬盘中“Linux源码和工具”下“toolchain”文件夹下的编译工具arm-linux-3.4.1.tar.bz2拷贝linux系统下的某个目录下,然后进入该目录,执行解包命令
#tar –xjvf arm-linux-3.4.1.tar.bz2,
之后可编辑/etc/bashrc文件,在最后添加路径export PATH=/usr/local/arm/3.4.1/bin:$PATH,以后编译内核或其他应用程序均可用arm-linux-来指定交叉编译器。最后可以echo $PATH查看环境变量中是否有/usr/local/arm/3.4.1/bin路径变量。
然后用编译hello.c文件,用如下命令:
#arm-linux-gcc–o hello hello.c
生成hello文件,将文件传送至开发板,发现传送过程有很多乱码,最后采用超级终端代替DNW软件的使用,于是重新设置。首先打开超级终端,基本设置与DNW软件差不多即可,这样就不需要USB线了。在终端下使用命令进入tmp目录,因为这是开发板与外部提供的交互的地方,然后点击传送文件,将hello文件送入开发板。
传送至开发板以后,由于外部文件进入至开发板会失去“可执行”属性,估需要重新添加上去,命令如下:
#chmod +x hello
修改成可执行文件以后就可以去运行了,执行命令“./hello”运行即可,超级终端会反馈开发板的信息显示“Hello World!”。
1、 编写UDP通信,完成第3章的例2.
由于实验过程中出现一些问题,开发板与虚拟机之间的通信效果不理想,最后降低了实验要求,在虚拟机之间开启两个终端进行通信进行通信,实验采用可见Linux编程基础.ppt上的130页的程序代码,代码如下:
client.c
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define DEST_PORT 3000
#define DSET_IP_ADDRESS "192.168.0.104"
int main()
{
int sock_fd;/*套接字文件描述符*/
int send_num;
int recv_num;
int dest_len;
char send_buf[20]={"hello tiger"};
char recv_buf[20];
struct sockaddr_in addr_serv;/*服务端地址,客户端地址*/
sock_fd = socket(AF_INET,SOCK_DGRAM,0);//创建套接子
//初始化服务器端地址
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
addr_serv.sin_port = htons(DEST_PORT);
dest_len = sizeof(struct sockaddr_in);
printf("begin send:\n");
send_num = sendto(sock_fd,send_buf,sizeof(send_buf),0,(struct sockaddr *)&addr_serv,dest_len);
if(send_num < 0){
perror("sendto");
exit(1);
}else{
printf("send sucessful:%s\n",send_buf);
}
recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_serv,&dest_len);
if(recv_num <0 ){
perror("recv_from");
exit(1);
}else{
printf("recv sucessful\n");
}
recv_buf[recv_num]='\0';
printf("the receive:%s\n",recv_buf);
close(sock_fd);
return 0;
}
需要注意的是#define DSET_IP_ADDRESS定义的ip地址换成虚拟机的ip地址,查看ip地址的命令用“ifconfig”命令即可。
server.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
#define SERV_PORT 3000
int main()
{
int sock_fd;
int recv_num;
int send_num;
int client_len;
char recv_buf[20];
struct sockaddr_in addr_serv;
struct sockaddr_in addr_client;
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
if(sock_fd < 0){
perror("socket");
exit(1);
}else{
printf("sock sucessful\n");
}
memset(&addr_serv,0,sizeof(struct sockaddr_in));
addr_serv.sin_family = AF_INET;//协议族
addr_serv.sin_port = htons(SERV_PORT);
addr_serv.sin_addr.s_addr = INADDR_ANY;
client_len = sizeof(struct sockaddr_in);
if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0)
{
perror("bind");
exit(1);
}else{
printf("bind sucess\n");
}
while(1){
printf("begin recv:\n");
recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_client,&client_len);
if(recv_num < 0){
printf("bad\n");
perror("again recvfrom");
exit(1);
}else{
recv_buf[recv_num]='\0';
printf("recv sucess:%s\n",recv_buf);
}
printf("begin send:\n");
send_num = sendto(sock_fd,recv_buf,recv_num,0,(struct sockaddr *)&addr_client,client_len);
if(send_num < 0){
perror("sendto");
exit(1);
}else{
printf("send sucessful\n");
}
}
close(sock_fd);
return 0;
}
分别编译生成可执行文件,开两个中断,首先运行service程序,然后运行client程序。显示结果如下: