分类: LINUX
2007-12-02 16:44:46
/*
* LED blink function.
* this function blink the led
*/
void led_blink(void)
{
static int led_status = 0;
led_status += 1;
if(led_status % 2 == 0)
*(char *)0x02000000 = 0xff;
else
*(char *)0x02000000 = 0x00;
}
/*
* LED blink function.
* this function blink the led
*/
void seg_blink(void)
{
static unsigned char seg_value[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };
static int seg_status = 0;
*((unsigned char *)0x8000000) = seg_value[seg_status];
seg_status += 1;
if(seg_status > 15)
seg_status = 0;
}
int main()
{
int loopcnt;
printf("hello world!!!\n");
while(1)
{
led_blink();
seg_blink();
sleep(1);
}
return 0;
}
使用如下Makefile文件编译
CC = arm-elf-gcc
LD = arm-elf-ld
EXEC = leddemo
OBJS = leddemo.o
CFLAGS +=
LDFLAGS += -Wl,-elf2flt
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@))
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
$(OBJS):
将上述两个文件保存在一个目录下,然后使用make命令编译,编译成功将生成leddemo和leddemo.gdb,其中leddemo文件即为生成的uClinux应用程序,可以将其加载到文件系统中,然后在uClinux中运行。
2、EB44B0的uClinux采用的是哪个版本?
EB44B0教学实验系统采用uCLinux发行版本20040408
3、EB44B0的uClinux采用的编译器是什么?
EB44B0教学实验系统采用arm-linux-gcc编译器编译uClinux核心,安装过程见用户手册,也可以使用arm-elf-gcc编译器,安装过程为:
从上下载arm-elf-tools-20030314.sh安装包。得到这个文件以后,执行以下命令:
sh arm-elf-tools-20030314.sh
4、怎样检测arm-elf-gcc编译器是否安装成功?
安装完成后,键入arm-elf-gcc, 如果能看到下面的输出信息:
Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc version 2.95.3 20010315 (release)
(ColdFire patches - 20010318 from )(uClinux XIP and shared lib patches from )
表示uClinux-ARM的交叉编译环境已经建立起来了。
5、怎样修改使用arm-elf-gcc编译器编译内核?
EB44B0发布缺省使用arm-linux-gcc编译器,如果需要修改,请修改linux-2.4.x目录下的Makefile文件,在该文件中搜索arm-linux-然后将其替换为arm-elf-。
6、使用arm-linux-gcc编译器能编译应用程序吗?
不能,编译应用程序请使用arm-elf-gcc编译器,并使用-Wl,-elf2flt连接参数生成flat格式文件。
7、如何配置应用程序自动运行?
如果需要在系统启动以后自动运行leddemo程序,需要编辑ramdisk中的启动脚本文件,该文件为
etc/rc
使用vi编辑器编辑,在该文件最后添加如下脚本:
/bin/leddemo
该脚本将启动后运行leddemo,直到程序退出。或
/bin/leddemo&
它将在后台运行leddemo,不影响其他的程序运行。
8、EB44B0 uClinux使用什么文件系统?
EB44B0使用ramdisk。
9、怎样制作和修改ramdisk?
1. 怎样建立ramdisk
mkfs /dev/ram0
mount /dev/ram0 /mnt/ram0
df
cd /mnt/ram0
拷贝文件到/mnt/ram0
cat /dev/ram0 > ramdisk
gzip ramdisk
2. 怎样从压缩ramdisk中复原
cat /var/ftp/incoming/ramdisk_12_16.gz | gunzip > /dev/ram1
mount /dev/ram1 /mnt/ram1
df
10、怎样修改ramdisk的大小?
1. 修改ramdisk 压缩文件起始位置和大小:
cd /usr/local/src/uClinux-dist/linux-2.4.x/arch/armnommu/mach-s3c44b0/
vi arch.c
修改linux-2.4.x/arch/armnommu/mach-s3c44b0/arch.c文件中的fixup_s3c44b0中的setup_initrd函数调用,如下所示
setup_initrd( (0x0c300000), 0x200000);
第一个参数为ramdisk地址,第二个参数为大小。
如果你的ramdisk压缩后小于2M可以不修改
2. 修改ramdisk大小
vi /usr/local/src/uClinux-dist/linux-2.4.x/arch/armnommu/mach-s3c44b0/arch.c
文件中的fixup_s3c44b0中的setup_ramdisk函数调用,如下所示
setup_ramdisk( 1, 0, 0, 4096);
最后一个参数为大小。上图为4096kbytes, 即为4Mbytes
11、怎样下载uCLinux映像
可以通过如下方式下载:
1)串口下载:
使用Alt+1开启一个控制台,在该控制台下启动minicom:
#minicom -s
缺省设置一般为串口0。将EB44B0的串口0与PC的串口0连接,然后将EB44B0上电,正常情况下将在minicom中看到bootloader菜单界面,如果没有请检查串口连接以及EB44B0电源是否接通。
在minicom中输入2,将进入串口uClinux下载界面,首先提示输入待下载文件的大小。
使用Alt+2开启另外一个控制台,在该控制台下输入:
#cd /home/cvtech/jx44b0/uClinux-dist/images
#ls –l
记下zImage的大小并按Alt+1控制台的minicom界面中输入zImage文件的大小,然后回车确认。
按Alt+2,输入:
cat zImage > /dev/ttyS0
程序将通过串口0发送zImage,请等待一定时间,在此过程中没有任何提示,请用户注意,下载速度约为10kbytes/s,也就是说1M字节的文件大概需要100秒钟。
按Alt+1,在程序下载结束后将打印提示信息,下载完成后,请输入n或者N,将自动运行刚才下载的uClinux映像或者输入y将烧写uClinux映像到flash中。
2) Tftp下载:
使用Alt+1开启一个控制台,在该控制台下启动minicom:
#minicom
缺省设置一般为串口0,如果不是,请参照用户手册的附录中关于minicom的设置进行设置。将EB44B0的串口0与PC的串口0连接,然后将EB44B0上电,正常情况下将在minicom中看到bootloader菜单界面,如果没有请检查串口连接以及EB44B0电源是否接通。
在minicom中输入8,将进入tftp uClinux下载界面。
使用Alt+2开启另外一个控制台,在该控制台下输入:
#cd /home/cvtech/jx44b0/uClinux-dist/images
#tftp 192.168.1.45
将进入tftp界面,在该界面分别输入
tftp>binary
tftp>put zImage
如果正常,在minicom中将显示下载进度,下载速度在100kbytes/s以上。
按Alt+1,在程序下载结束后将打印提示信息,下载完成后,请输入n或者N,将自动运行刚才下载的uClinux映像。
12、怎样下载uCLinux的ramdisk
可以通过如下方式下载:
1)串口下载:
使用Alt+1开启一个控制台,在该控制台下启动minicom:
#minicom -s
缺省设置一般为串口0。将EB44B0的串口0与PC的串口0连接,然后将EB44B0上电,正常情况下将在minicom中看到bootloader菜单界面,如果没有请检查串口连接以及EB44B0电源是否接通。
在minicom中输入5,将进入串口uClinux下载界面,首先提示输入待下载文件的大小。
使用Alt+2开启另外一个控制台,在该控制台下输入:
#cd /home/cvtech/jx44b0/uClinux-dist/images
#ls –l
记下ramdisk的大小并按Alt+1控制台的minicom界面中输入ramdisk.gz文件的大小,然后回车确认。
按Alt+2,输入:
cat ramdisk.gz> /dev/ttyS0
程序将通过串口0发送ramdisk.gz,请等待一定时间,在此过程中没有任何提示,请用户注意,下载速度约为10kbytes/s,也就是说1M字节的文件大概需要100秒钟。
按Alt+1,在程序下载结束后将打印提示信息,下载完成后,请输入n或者N,将自动运行刚才下载的uClinux映像或者输入y将烧写uClinux映像到flash中。
2) Tftp下载:
使用Alt+1开启一个控制台,在该控制台下启动minicom:
#minicom
缺省设置一般为串口0,如果不是,请参照用户手册的附录中关于minicom的设置进行设置。将EB44B0的串口0与PC的串口0连接,然后将EB44B0上电,正常情况下将在minicom中看到bootloader菜单界面,如果没有请检查串口连接以及EB44B0电源是否接通。
在minicom中输入9,将进入tftp uClinux下载界面。
使用Alt+2开启另外一个控制台,在该控制台下输入:
#cd /home/cvtech/jx44b0/uClinux-dist/images
#tftp 192.168.1.45
将进入tftp界面,在该界面分别输入
tftp>binary
tftp>put ramdisk.gz
如果正常,在minicom中将显示下载进度,下载速度在100kbytes/s以上。
按Alt+1,在程序下载结束后将打印提示信息,下载完成后,请输入n或者N,将自动运行刚才下载的uClinux映像。
13、怎样在uClinux中测试以太网连接?
在bootloader中按7启动uClinux,然后在pc机上输入:
#ping 192.168.1.45
正常将得到结果如下:
Pinging 192.168.1.45 with 32 bytes of data:
Reply from 192.168.1.45: bytes=32 time<10ms TTL=128
Reply from 192.168.1.45: bytes=32 time<10ms TTL=128
Reply from 192.168.1.16: bytes=32 time<10ms TTL=128
Reply from 192.168.1.16: bytes=32 time<10ms TTL=128
Ping statistics for 192.168.1.45:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
如果网络不通,将得到如下结果:
Pinging 192.168.1.45 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 192.168.1.45:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
14、uClinux ping不通?
如果ping不通,请检查pc端ip地址是否为192.168.1.xxx网段,并且不能为192.168.1.45。以及是否使用的是直连网线。
15、怎样连接网线?
可以有两种方式进行网络连接:
1) 将EB44B0的网卡使用普通网线接入主机所在的局域网中;
2) 将EB44B0的网卡使用直连网线直接与主机的网卡连接。
16、怎样修改IP地址?
在uClinux控制台下输入命令:
>ifconfig eth0 192.168.1.44
将修改IP地址为192.168.1.44
17、内核编译问题1?
问:
我按照实验书上面做,在make zImage时出现如下错误:
entry-armv.S: Assembler messages:
entry-armv.S:1239: Error: Internal_relocation (type 187) not fixed up (OFFSET_IMM)
entry-armv.S:1241: Error: Internal_relocation (type 185) not fixed up (IMMEDIATE)
entry-armv.S:1292: Error: Internal_relocation (type 187) not fixed up (OFFSET_IMM)
entry-armv.S:1293: Error: Internal_relocation (type 187) not fixed up (OFFSET_IMM)
entry-armv.S:1530: Error: Can not represent SWI relocation in this object file format (0)
到底是什么回事???
答:
出现此问题主要是安装问题,uClinux内核没有使用替换后的内核,请用户按照EB44B0光盘的用户手册进行安装,不要按照JX44B0教学系统uClinux安装,否则可能导致上述错误,如果按照EB44B0光盘提供的用户手册进行安装是不会出现此问题的。
18、内核编译问题2?
问:
我刚才是把串口项(serial device里的s3c44b0 sercial port support)去掉才编译成功的,一加上那项就不行了
错误如下:
--end-group \
-o linux
drivers/serial/serial.o: In function `uart_setup_port'':
/home/dk/uClinux-dist/linux-2.4.x/drivers/serial/serial_core.c:1857: undefined reference to `uart_type''
/home/dk/uClinux-dist/linux-2.4.x/drivers/serial/serial_core.c:1857: relocation
truncated to fit: R_ARM_PC24 uart_type
drivers/serial/serial.o: In function `uart_register_port'':
/home/dk/uClinux-dist/linux-2.4.x/drivers/serial/serial_core.c:1857: undefined reference to `uart_type''
/home/dk/uClinux-dist/linux-2.4.x/drivers/serial/serial_core.c:1857: relocation
truncated to fit: R_ARM_PC24 uart_type
make: *** [linux] Error 1
答:
需要定义proc file,在File System下的/Proc file system support.
加上它就可以
19、romfs问题?
问:
在做leddemo时,romfs.img在哪里?它..uclinux-dist/image/romfs.img找不到,没有此文件。
答:
关于romfs的问题,开发板没有使用romfs,而是采用ramdisk,你可以按照指导书上另外一种方法,将生成的leddemo通过ftp拿到板子上,然后运行,记得使用chmod该属性。
20、uClinux启动问题?
问:
prepare_namespace start
RAMDISK:Couldn''t find valid RAM disk image starting at 0.
Freeing initrd memory: 1024K
Kernel panic: VFS: Unable to mount root fs on 01:00
换了一个,启动变成这样子了。这又是什么回事???
答:
ramdisk被擦除掉了或者被写入了不合法的ramdisk文件,ramdisk文件必须为ram盘压缩后生成的文件,具体制作方法请参考第“9”项,其文件民通常为ramdisk_xxx.gz,请将ramdisk重新烧写到flash中,zImage加载的时候需要加载ramdisk。
此外应用程序不能直接烧写到ramdisk区域,必须加入到ram盘后重新制作ramdisk才能烧写到该区域,如果烧写到该区域后,掉电可以保存,否则如果使用ftp从服务器上下载时,掉电后必须重新下载。
完整的说明及相关图片请参考: