arm linux开机启动程序
2015-05-12 16:31:00 weixin_34007291 阅读数 23

微处理器:S5PV210
操作系统:linux3.0.8


前言:
    在产品中,基本上都要屏蔽arm开发板中linux系统的对外通信,只应该通过产品的相关APP做相关操作。
    因此需要把该APP添加到linux中,使之开机启动。

1,实现
    a,打开文件:/etc/init.d/rcS。
    b,在该文件末尾添加要执行的APP,或是相关的 *.sh 文件。

2,参考文件
    a,http://blog.csdn.net/w7849516230/article/details/6426350

2012-06-05 01:29:18 lilongherolilong 阅读数 1027
linux 裸机开发arm程序

@******************************************************************************
@ File:start.s
@ 功能:通过它转入C程序
@******************************************************************************       

.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            
            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
            bl      main                @ 调用C程序中的main函数
halt_loop:
            b       halt_loop


led.c文件

#define GPQCON (*(volatile unsigned long *) 0x7F008180)
#define GPQDAT (*(volatile unsigned long *) 0x7F008184)


void msDelay(int time)
{
    volatile unsigned int i,j;
    for(i = 0; i < 2000000; i++)
    for(j=0; j<time; j++);
}


int main(void)
{
    GPQCON &= ~( (0x3<<(2*2)) | (0x3<<(3*2)) | (0x3<<(4*2)) | (0x3<<(5*2)) | (0x3<<(6*2)) );
    GPQCON |= ( (0x1<<(2*2)) | (0x1<<(3*2)) | (0x1<<(4*2)) | (0x1<<(5*2)) | (0x1<<(6*2)) );
    while(1)
    {
        GPQDAT |= ( (1<<2) | (1<<3) | (1<<4) | (1<<5) | (1<<6) );
        msDelay(2);
        GPQDAT &= ~( (1<<2) | (1<<3) | (1<<4) | (1<<5) | (1<<6) );
        msDelay(2);
    }
    return 0;
}

leds.lds文件

SECTIONS {
    . = 0x00;
    .text                            :   { *(.text) }
    .rodata ALIGN(4)    : {*(.rodata)}
    .data ALIGN(4)        : { *(.data) }
    .bss ALIGN(4)            : { *(.bss)  *(COMMON) }
}

makefile文件

all: start.s leds.c
    arm-linux-gcc -o start.o start.s -c
    arm-linux-gcc -o leds.o leds.c -c
    arm-linux-ld -Tleds.lds start.o leds.o -o leds.elf
    arm-linux-objcopy -O binary -S leds.elf leds.bin
    arm-linux-objdump -D -m arm  leds.elf > leds.dis

clean:
    rm -f leds.dis leds.bin leds.elf *.o


CFLAGS     := -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding
all : crt0.S  leds.c
    arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
    arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c
    arm-linux-ld -Tleds.lds  crt0.o leds.o -o leds_elf
    arm-linux-objcopy -O binary -S leds_elf leds.bin
    arm-linux-objdump -D -m arm  leds_elf > leds.dis
clean:
    rm -f   leds.dis leds.bin leds_elf *.o


led.bin: start.o
    arm-linux-ld -Ttext 0 -o leds.elf start.o
    arm-linux-objcopy -O binary -S leds.elf leds.bin
    arm-linux-objdump -D -m arm  leds.elf > leds.dis

start.o: start.s
    arm-linux-gcc -o start.o start.s -c

clean:

    rm -f leds.dis leds.bin leds.elf *.o



2017-05-12 10:30:51 u010080339 阅读数 275
4.问:如何编译LED的程序呢?
            答:明确:势必不能用gcc编译(针对于X86架构)
                所以:务必先在上位机部署添加交叉编译器
                上位机添加ARM架构交叉编译器的流程:
                4.1.获取交叉编译器
                resource/编译器/arm-cortex_a9-eabi-4.7-eglibc-2.18.tar
                拷贝到linux和windows共享目录中
                cp arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz /opt/
                 
                4.2.上位机添加
                cd /opt/
                tar -xvf arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz
                得到新目录:arm-cortex_a9-eabi-4.7-eglibc-2.18
                mv arm-cortex_a9-eabi-4.7-eglibc-2.18 toolchains
                ls /opt/toolchains/bin/
                   arm-cortex_a9-linux-gnueabi-gcc //ARM架构的gcc编译器
                 
                sudo vim /etc/environment
                在PATH中添加/opt/toolchains/bin,例如:
                PATH=/opt/toolchains/bin:...
                保存退出
                 
                重启上位机linux系统
                 
                4.3.测试交叉编译器
                上位机执行:
                arm-cortex_a9-linux-gnueabi-gcc -v //查看交叉编译器的版本
                 
                4.4.交叉编译LED程序
                cd /opt/arm/day03/1.0
                arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c
                说明:
                -nostdlib:告诉编译器,此程序不使用标准C库
                -c:只编译不链接
                 
                arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib  
                                    -Ttext=0x48000000 -o led.elf led.o
                说明:
                arm...ld:链接器
                -nostartfiles:告诉链接器,此代码无需启动文件
                -Ttext=0x48000000:告诉链接器,代码段的起始地址为0x48000000(下位机的内存地址)
                                -o led.elf:链接生成ELF格式的可执行文件
                                切记:此时此刻led.elf不能在没有操作系统的环境中运行
                                
                                arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin
                                说明:利用arm...objcopy工具将ELF格式的可执行文件
                                      再次获取到其中的真正的二进制文件信息
                                      led.elf:橘子(带皮)
                                      led.bin:果肉
                                      objcopy:去皮工具
                                       
                                cp led.bin /tftpboot //拷贝到下载目录
                                
                                绝招:反汇编
                                arm-cortex_a9-linux-gnueabi-objdump -D led.elf > led.dis  
                                led.dis:反汇编文件
                                vim led.dis //只需关注一个内容即可
                                <0x48000000>:led_test  
                                如果看到以上信息说明:led_test函数的地址为0x48000000
                                说明程序的编译是对的!
                                
                         5.下位机测试
                           重启下位机,进入uboot命令行模式,执行:
                           ping 192.168.1.8
                           tftp 48000000 led.bin
                           go 48000000
                        
                         6.验证入口地址特性
                           cd /opt/arm/day03/1.0
                           vim led.c //将delay函数的定义放在led_test函数定义的前面
                           保存退出
                           arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c
                           arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib  
                                       -Ttext=0x48000000 -o led.elf led.o
                           arm-cortex_a9-linux-objcopy -O binary led.elf led.bin
                           arm-cortex_a9-linux-objdump -D led.elf > led.dis
                           vim led.dis  
                           查看0x48000000这个地址对应的函数是:led_test?delay?
                            
                           切记:编译器链接是从文件的头到尾进行链接(从上到下)
2013-02-25 20:38:32 linuxheik 阅读数 533

arm linux QT 程序开发流程

我们要开发一个简单的QT程序,然后下载到arm开发板上面。

 

这里需要介绍几个用到的软件:

x86-qtopia,这个是PC下的一个qtopia,他自带有个模拟器,可以模拟出arm开发板的样子出来。方便调试

arm-qtopia,这个主要是用来编译,因为要下载到开发板上,需要arm版的qtopia的库文件,编译后直接下载到开发板运行

以上两个qtopia都要事先编译好。

 

buildhost.sh,这个是在x86下对QT程序的编译脚本。

buildarm.sh,这个是在arm下的编译脚本

 

1、开发QT程序,直接用designer

/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/bin/designer main_form_base.ui

用x86下的designer来设计图形界面,命名为main_form_base.ui

在此先省略QT编程过程。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2、编程完毕后,执行buildhost.sh脚本,编译它,会产生可执行文件。

脚本内容:

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

#!/bin/sh 
 
source /opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv 
qmake -o Makefile.host -spec qws/linux-generic-g++ *.pro 
make -f Makefile.host clean 
make -f Makefile.host

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

3、再到x86-qtopia目录下,运行模拟器。会出现一个qtopia界面

4、然后再运行编译生成的可执行文件(这里需要一个相应的run_x86_mycalc脚本)。若在模拟器中出现我们编写的软件界面,运行正常,说明没问题。可以直接进行下一步

run_x86_mycalc脚本:

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

# cd /opt/FriendlyArm/mini2440/x86-qtopia/mycalc        (mycalc的程序目录)
# export QTDIR=/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/image/opt/Qtopia/ 
# export QPEDIR=/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/image/opt/Qtopia/ 
# export HOME=$QPEDIR/root/ 
# export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBARAY_PATH 
# ./mycalc

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

5、再执行buildarm.sh脚本,编译它,会产生arm版本的可执行文件。

脚本内容:

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

#!/bin/sh 
 
source /opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv 
qmake -o Makefile.arm -spec qws/linux-generic-g++ *.pro 
make -f Makefile.arm clean 
make -f Makefile.arm

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

6、把这个可执行文件复制到arm开发板上面的/opt/Qtopia/bin目录下(通过超级终端串口传输)

7、编写run_mycalc执行脚本,这样才能直接运行,(这里的run_mycalc名字可以自己改的)

在arm开发板上面的/bin目录下,vi run_mycalc

内容:

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

#!/bin/sh 
export TSLIB_TSDEVICE=/dev/touchscreen-1wire 
export TSLIB_CONFFILE=/etc/ts.conf 
export TSLIB_PLUGINDIR=/usr/lib/ts 
export TSLIB_CALIBFILE=/etc/pointercal 
export QTDIR=/opt/Qtopia 
export QPEDIR=/opt/Qtopia 
export PATH=$QTDIR/bin:$PATH 
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH 
export QWS_MOUSE_PROTO="TPanel:/dev/input/mice" 
export QWS_KEYBOARD=TTY:/dev/tty1 
export HOME=/root 
exec $QPEDIR/bin/qpe   (qpe修改为存放在/opt/Qtopia/bin下面的可执行程序名称,这里就要修改为mycalc)

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

8、直接运行run_mycalc

2010-04-23 17:59:00 xuyinhu 阅读数 303

使用DDD+GDB开发ARM Linux程序
今天又取得了一些进展,赶快写下来以免自己忘记。
自从Linux在我的板子上跑起来之后,我一直在想一个问题,怎么调试将来写的程序。其实我在Linux开发方面真得很外行,到了今天才知道GDB到底是 干什么用的,呵呵。我相信很多人从Bootloader调试开始一直都使用LED啊,printf这样的方法来调试。我做毕设时,就是在MTDBLOCK 里面划出一个USER分区,然后把编译好的程序放入文件系统映像,通过Bootloader用串口下到NAND里,然后mount上调试,实在很花时间。 今天,白痴的我终于找到了一条捷径,已经不咳嗽了!
先介绍下DDD和GDB,GDB是一种用于调试Linux下程序的工具,它不仅能调试C/C++,还可以调试Pascal等很多其他语言。我们看个例子: 假设有一个程序叫做test.c,要用GDB调试它,首先,编译的时候需要加上产生debug信息选项“-g”,如#arm-linux-gcc test.c -o test -g;然后,由于我们并不是开发本机程序,在目标机(arm)上需要用一个server启动这个含有调试信息的程序,当然,本机和目标机之间得有一定的数 据共享方式(如nfs)和一定的通信方式(如以太网或串口);最后,在本机上启动一个GDB客户端,就可以登陆到目标机的server上调试程序了。 GDB的原理网上也有很多文章说,可以搜索下,但是我是初学者,就不去看那些内容了。为了让大家更加明确GDB和DDD的区别,我们先看一个GDB的调试 过程:

我通过以太网调试,本机IP地址192.168.2.31,目标机(arm开发板IP地址192.168.2.223),本机通过nfs共享开发目录lgraphics。
首先本机上编译:
lxz@lxzlinux:~/lgraphics> arm-linux-gcc lgraphics.c -o lg -g

切换到目标机:
[root@(none) lgraphics]# gdbserver 192.168.2.31:2345 lg
Process lg created; pid = 402
Listening on port 2345

切换到本机:
lxz@lxzlinux:~/lgraphics> arm-linux-gdb lg
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux"...
(gdb) target remote 192.168.2.223:2345 lg
Remote debugging using 192.168.2.223:2345 lg
0x40001290 in _start () from /lib/ld-linux.so.2
此时,目标机上也会出现:
Remote debugging from host 192.168.2.31

在本机上输入:
(gdb) b main                                          (设置断点到main函数)
Breakpoint 1 at 0x9c00: file lgraphics.c, line 442.
(gdb) cont                                              (开始执行)
Continuing.
Breakpoint 1, main () at lgraphics.c:442   (遇到断点,并显示断点程序行)
442             int i, j, b = 0;
(gdb) step                                              (单步执行)
445             linitgraph("/dev/fb0");           (显示目前程序行)

好了,看到这里,差不多就明白GDB是干什么的、怎么用了吧。我相信你会和我一样对GDB界面的不友好表示愤慨,想想Windows下的开发工具,哪一种 调试的时候还是文本界面的。幸运的是,有一些勤快的人,帮我们写了很多GDB的图形化前端,我们更本不用像上面这样使用GDB。

开始说DDD。DDD是一种GDB的图形化前端,就是一种用图形界面帮你输入繁琐的GDB调试指令工具。当然,也有很多文章说DDD多么不足,用Insight来取代它之类的。我的Suse里恰好就有DDD,我也不管那么多了,先用了。看看用DDD的时候怎么调试:

一样本机上编译:
lxz@lxzlinux:~/lgraphics> arm-linux-gcc lgraphics.c -o lg -g

切换到目标机:
[root@(none) lgraphics]# gdbserver 192.168.2.31:2345 lg
Process lg created; pid = 402
Listening on port 2345

切换到本机:
lxz@lxzlinux:~/lgraphics> ddd -debugger arm-linux-gdb lg

然后就会启动DDD的图形界面,在窗口下方有一个文本输入框,这里就是ddd的基础gdb的所在,在这里输入target remote 192.168.2.223:2345 lg,提示信息和我们用GDB时候是一样的。不同的是,除了这句连接目标机的指令,其他指令都不用输入了,可以在图形化界面里找到,这我就不说了。另外, 连接目标机的指令也可以用在DDD中设置,不用输入,可以查找其他介绍DDD使用的文章。下面是DDD的图形界面,工具栏下面的是watch,代码可以设 置断点(红色点),可以看到单步位置(绿色箭头),右边是执行控制工具条,最下面是GDB的输入和输出显示。


看到这里,想我一样的菜鸟们一定发现了,原来Linux程序可以这么好调啊,简直和CE没有什么差别了,呵呵。下面介绍为了使用GDB+DDD所要做的东 西。我不是从零开始建立的,具体的包依存关系我也不明白,只好假设你在安装Linux的时候已经安装了像GCC,DDD之类的工具。GDB的源代码包 gdb-6.6.tar.bz2可以从ftp://gcc.gnu.org上下载到,还有一个要求是你已经安装了交叉编译器arm-linux-gcc。

下载下来后:
# tar xvjf gdb-6.6.tar.bz2
# mkdir gdbbuild
# cd gdbbuild
# ../gdb-6.6/configure --target=arm-linux   --prefix=/home/lxz/lxzgdb

这里,--prefix参数是需要安装的目录,然后
# make
# make install
这样,arm-linux-gdb这个工具就在/home/lxz/lxzgdb/bin里头了,你可以把这个路径添加到PATH里面去

接下来建立gdbserver,在gdbbuild的上一级目录下
# mkdir gdbserverbuild
# cd gdbserverbuild
# CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure --host=arm-linux --prefix=/home/lxz/lxzgdbserver

一样,--prefix参数是需要安装的目录,然后
# make
# make install

有的文章里说,要去除arm-linux-strip的调试信息
# cd /home/lxz/lxzgdbserver/bin
# arm-linux-strip gdbserver

把这个gdbserver复制到你的开发板上,就OK了。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/andydung/archive/2010/04/23/5521187.aspx

没有更多推荐了,返回首页