【入门】ARM开发板上的Hello World

hy8457   2007-5-29 18:53 楼主




搞了三天,终于出来了。虽然狂简单,但是这是我的一大步。发个帖子纪念一下。如果这些东西对你有用,请你留言让我知道。哪怕就是一个“顶”字,也是对我的鼓励。
谢谢。

说明:
硬件是一块以前的人开发后遗留下来的ARM开发板,芯片内部的rom支持xmodem协议,即:可以通过串口下载程序并执行。这个串口就是代码中用来打出Hello World的串口0,波特率为38400。

Start.s文件内容
-------------------------------------------------------------
/*
        引导程序
        通常引导程序需要初始化硬件等等。
        但是当前的测试程序只需要输出Hello World,完全在内存里面运行,因此不需要初
        始化硬件。唯一需要用到的外设UART0已经被芯片内部的程序初始化过了
        amain和bmain都可以作为主入口(当然,输出的内容会不一样)
*/
.global _start
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.section ".text"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

_start:
                                        b  ResetHandler
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

   
ResetHandler:
    @bl to c function
        ldr pc,=amain
-------------------------------------------------------------

HelloWorld.c文件内容
-------------------------------------------------------------
/*
        0x20060000是UART0的地址
        bmain函数中的asm内容和写在start.s中是同一个效果       
*/
void uart_write_chr(unsigned char chr)
{
        (*((volatile unsigned char *)(0x20060000))) = chr;
}

void bmain(void)
{
        int i = 0;
        int        j;
       
        asm("ldr  r0,=0x0D");
        asm("ldr  r1,=0x20060000");
        asm("str  r0,[r1]");
       
        asm("ldr  r0,=0x0A");
        asm("ldr  r1,=0x20060000");
        asm("str  r0,[r1]");
       
        for(i = 0;i < 100;i++)
        {
                for(j = 0;j < 500;j++)
                ;
                asm("ldr  r0,=0x48");
                asm("ldr  r1,=0x20060000");
                asm("str  r0,[r1]");
        }
}

int amain(int argc,char* argv[])
{
    char*   str = "\nHello World!\n";
    char*        pStr = str;
       
    pStr = str;
        
    bmain();
    while(*pStr != '\0')
    {
            uart_write_chr(*pStr);
            pStr++;
    }   
        return 0;
}

-------------------------------------------------------------

MakeFile文件内容
-------------------------------------------------------------
#ram.ld是一个非常关键的文件,它制定了链接器的工作方式
#ram.ld的注释部分需要仔细阅读

CROSS         = arm-elf-

AS                 = $(CROSS)as
LD                 = $(CROSS)ld
CC                 = $(CROSS)gcc
OBJCOPY = $(CROSS)objcopy

LDFLAGS        = -T ram.ld

LIBS        = /tools/H-i686-pc-cygwin/lib/gcc-lib/arm-elf/3.0/libgcc.a \
                 /tools/H-i686-pc-cygwin/arm-elf/lib/libc.a

all: start.bin

start.bin:        start.o HelloWorld.o
        $(LD) $(LDFLAGS) -o start.elf start.o HelloWorld.o $(LIBS)
        $(OBJCOPY) -O binary \
                --only-section=.rodata \
                --only-section=.data \
                --only-section=.bss start.elf start.data
        $(OBJCOPY) -O binary --only-section=.text start.elf start.text
        cat start.text start.data >  start.bin
        rm -f *.o
        rm -f *.elf
        rm -f *.data
        rm -f *.text
start.o:        Start.s
        $(CC) -o start.o -c Start.s
HelloWorld.o:        HelloWorld.c
        $(CC) -fno-builtin -o HelloWorld.o -c HelloWorld.c
clean:
        rm -f *.o
        rm -f *.elf
        rm -f *.data
        rm -f *.text
        rm -f *.bin       
-------------------------------------------------------------

ram.ld文件内容
-------------------------------------------------------------
/*控制链接器的行为,程序的起始地址为0x30005000,因此,编译好
的程序通过xmodem下载到内存中时必须以0x30005000为起点,否则
执行会出错*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
        .text 0x30005000: { /* Real text segment                */
                _text = .;                /* Text and read-only data        */
                *(.text)
                . = ALIGN(4);
                _etext = .;                /* End of text section                */
        }

        .rodata : {
                __rodata_start = .;
                *(.rodata)
                . = ALIGN(4);
                _erodata = .;
                }

        .data : {
                __data_start = .;
                *(.data)
                . = ALIGN(4);
                _edata = .;
        }

        .bss : {
                __bss_start = .;        /* BSS*/
                *(.bss)
                . = ALIGN(4);
                _end = .;
        }

}
-------------------------------------------------------------









回复评论 (15)






编译环境为 cygwin+ARM 的交叉编译器。这是在windows下面完成的。linux还没有试过。暂时也不打算试。
ram.ld中的内容我自己也还没有完全搞懂,有懂的人不妨贴出心得来。




点赞  2007-5-29 18:56
呵呵,我也是新手,刚考上研,以后搞嵌入式这方面,什么都还不懂呢
点赞  2007-5-29 19:23
up,潜入式了解不多,支持一下!
点赞  2007-5-29 20:14
点赞  2007-5-30 14:48
uart_write_chr(*pStr);
莫非是用UART与PC通信,然后显示字符串?

呵呵。我以前在ARC DSP上也做过。是ARC设备端与PC通过UART和COM进行通信。
我当时在PC端用得是MFC,将设备端传过来的字符串显示在指定控件上,如文本框,列表框等,并且保存到日志文件中。日志文件中还有两者进行通信的协议信息。
这个功能就像是PC上对设备端的Debug Monitor,这也是我进公司第一个所完成的比较完整的作品。
点赞  2007-5-30 20:31
强顶
点赞  2007-6-1 10:05




arm-elf-gcc系列工具网上可以找到现成的安装包,给linux用的,一步到位解决问题,地址在:
http://www.uclinux.org/pub/uClinux/arm-elf-tools/arm-elf-tools-20030314.sh
也可以用arm-linux-gcc工具集,下载地址在
ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/cross-3.2.tar.gz
这个需要手动设置路径的

曾尝试自己编译arm-linux-gcc工具集,悲惨地失败鸟……GNU的东西真是博大精深




点赞  2007-6-1 10:50
狂顶  非常不错哈
点赞  2007-6-1 11:17
我支持楼主
点赞  2007-6-1 15:52
汇编啊,强啊...
点赞  2007-6-1 18:46
MB2410嵌入式开发模板
     为了方便科研部门、公司学习和开发嵌入式系统产品。我们在成功推出DM2410B+ 实验/开发系统基础上,隆重推出DM2410/P 总线开发板,该产品与DM2410B+ 实验/开发系统100%兼容,可以将DM2410B+ 实验/开发系统完成的任何项目固化在该板上运行,而且其总线结构非常方便用户按照自己的开发项目要求,个性化连接项目所需要的键盘/按键,显示器,USB接口,红外,SD卡等各种接口,是教学和科研的必备工具,该板采用工业级设计,已被多家生产厂家列为配套产品,具有丰富的供货资源。

                                                  联系人:高先生/0571-87176506
                                                  E-Mail:gaoguolin@126.com
点赞  2007-6-2 08:47
厉害!强鼎!!!
点赞  2007-6-5 20:53
顶!!!
点赞  2010-4-18 00:23

本科生学这些的越来越多了

成信院的孩子

点赞  2012-4-26 13:47
哈哈,关心一下下一代,记忆中的hello world,帮助着每一代的软件的同胞们成长啊。鼓励一下!加油的必须的。
无线网络摄像机 ,高清网络摄像机,网络视频监控
点赞  2012-4-26 22:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复