在Fedora 12下编译和调试RTThread

摘要:
后来发现是qemu是按u-boot加载的RT-Thread,RT-Thread加载的地址与u-boot是不同的,所以根本没有执行到RT-Thread的代码。

在Fedora 12下编译和调试RT-Thraed

1.安装编译工具

yum install scons
yum install python

安装工具arm-2010q1-202-arm-none-linux-gnueabi.bin,我是安装在/home/lixianjing/CodeSourcery目录下的,后面会引用这个路径。 2.下载RT-Thread

[lixianjing@vm os]$ wget http://rt-thread.googlecode.com/files/rt-thread-0.4.0%20beta1.zip
[lixianjing@vm os]$ unzip rt-thread-0.4.0/ beta1.zip
[lixianjing@vm os]$ cd rt-thread-0.4.0/ beta1/bsp/mini2440/

3.修改rtconfig.h

//#define RT_USING_NEWLIB
//#define RT_USING_PTHREADS

使用NEWLIB和PTHREADS,在我这里有些问题,编译时会说头文件有冲突。加上-nostdinc选项之后又说有些头文件找不到了。估计newlib还不太成熟,所以我暂时没有用NEWLIB。 4.修改rtconfig.py

    #EXEC_PATH  = 'E:/Program Files/CodeSourcery/Sourcery G++ Lite/bin'
    EXEC_PATH = '/home/lixianjing/CodeSourcery/Sourcery_G++_Lite/bin'

    #PREFIX = 'arm-none-eabi-'
    PREFIX = 'arm-none-linux-gnueabi-'

    LFLAGS += ' -nostdlib'
    CFLAGS += ' -nostdinc -nostdlib'

如果不加nostd,就会出现头文件冲突的情况,通常编译内核都是要加这个选项的,但是不清楚为什么在Windows下没有问题。 5.修改SConstruct

# build program
env.Program(TARGET, objs, LIBS=['libgcc.a'], LIBPATH='/home/lixianjing/CodeSourcery/Sourcery_G++_Lite/lib/gcc/arm-none-linux-gnueabi/4.4.1/armv4t/')

因为arm没有除法指令,所以除法是用函数实现的,这些函数在libgcc.a里。因为前面加了nostdlib选项,所以这里要链接一下libgcc.a。 6.加上一个raise函数 raise.c:

void raise(void)
{
    return;
}

这个函数可能是libgcc.a里某处引了它,应该相当于abort之类的功能吧,这里实现一个空函数即可。 7.修改SConscript

src_bsp = ['application.c', 'startup.c', 'board.c', 'raise.c']

这里只是把raise.c加入编译。 8.编译RT-Thread

[lixianjing@vm mini2440]$ scons

如果出现下列信息,那就是编译成功了:

arm-none-linux-gnueabi-objcopy -O binary rtthread-mini2440.axf rtthread.bin
arm-none-linux-gnueabi-size rtthread-mini2440.axf
  text       data        bss        dec        hex    filename
363064       1516      14740     379320      5c9b8    rtthread-mini2440.axf
scons: done building targets.

注意:以上工作都是在bsp/mini2440/目录下完成的。 9.编译qemu 直接用yum安装qemu是不行的,因为里面没有mini2440的配置,要下载qemu for mini2440的源代码才行:

[lixianjing@vm os]$ git clone git://repo.or.cz/qemu/mini2440.git
[lixianjing@vm os]$ cd mini2440

10.修改hw/mini2440.c

static void mini2440_reset(void *opaque)
{
    struct mini2440_board_s *s = (struct mini2440_board_s *) opaque;
    uint32_t image_size;

    if (s->kernel) {
       image_size = load_image(s->kernel, qemu_get_ram_ptr(0));
       if (image_size > 0) {
           if (image_size & (512 -1))  
               image_size = (image_size + 512) & ~(512-1);            s->cpu->env->regs[15] = S3C_RAM_BASE ;
           mini2440_printf("loaded kernel %s at %p/n", s->kernel, s->cpu->env->regs[15]);
       }

       return;
    }
...
}

开始我直接编译了qemu,运行时总出现无效地址问题。后来发现是qemu是按u-boot加载的RT-Thread,RT-Thread加载的地址与u-boot是不同的,所以根本没有执行到RT-Thread的代码。 11.编译qemu

[lixianjing@vm mini2440]$ ./configure --target-list=arm-softmmu --disable-linux-user;make
[lixianjing@vm mini2440]$ su
[root@vm mini2440]# make install

12.调试运行RT-Thread 开两个终端,都进入bsp/mini2440目录。 终端1:

[lixianjing@vm mini2440]$ qemu-system-arm -S -s -M mini2440 -kernel rtthread.bin -serial stdio
S3C: CLK=240 HCLK=240 PCLK=240 UCLK=57
QEMU: ee24c08_init
DM9000: INIT QEMU MAC : 52:54:00:12:34:56
QEMU mini2440_reset: loaded kernel rtthread.bin at 0x30000000

加 -S -s 选项表示qemu等待调试器连接。 终端2:

[lixianjing@vm mini2440]$ arm-none-linux-gnueabi-gdb rtthread-mini2440.axf
(gdb) target remote :1234
Remote debugging using :1234
_start () at /home/lixianjing/lab/os/rt-thread-0.4.0 beta1/libcpu/arm/s3c24x0/start_gcc.S:91
91        b        reset
(gdb) b rt_init_thread_entry
Breakpoint 1 at 0x30000350: file application.c, line 64.
(gdb) c
Continuing.

Breakpoint 1, rt_init_thread_entry (parameter=0x0) at application.c:64
64            dfs_init();
(gdb)

1234是qemu等待调试器的缺省端口号。 然后就可以用gdb研究RT-Thread了。 这里说明一下,我的工作目录是/home/lixianjing/lab/os,针对mini2440定制的qemu在mini2440下,rt-thread源代码在rt-thread-0.4.0 beta1下。

免责声明:文章转载自《在Fedora 12下编译和调试RTThread》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Node.js & Kubernetes Graceful Shutdown零基础入门深度学习(5)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[大数据学习研究]1.在Mac上利用VirtualBox搭建本地虚拟机环境

  1. 大数据和Hadoop 研究学习大数据,自然要从Hadoop开始。 Hadoop不是一个简单的软件,而是有一些列软件形成的生态,其核心思想来自Google当初发布的三篇论文,后来做了开源的实现, 谷歌的实现和Hadoop的实现大致可以做这样的对应: Google Map/Reduce <---> Hadoop MapReduceGoog...

《Linux内核Makefile分析》之 auto.conf, auto.conf.cmd, autoconf.h【转】

转自:http://blog.sina.com.cn/s/blog_87c063060101l25y.html 转载:http://blog.csdn.net/lcw_202/article/details/6661364 在编译构建性目标时(如 make vmlinux),顶层 Makefile 的 $(dot-config) 变量值为 1 。 在顶层...

docker占满linux磁盘根目录的解决办法

一、磁盘根目录被占满 [test@localhost docker]$ df -lh Filesystem Size Used Avail Use%Mounted on /dev/mapper/centos-root 50G 50G 0G 100% / devtmpfs 7.7...

Linux下的主要的C语言编译器

1.GCC大名鼎鼎的GNU的C/C++/Obj-C编译器,当前版本是2.8.1,但据说与2.7.*有兼容性问题. 而使用较广的是gcc2.7.2系列,如RedHat5中带的就是gcc2.7.2.3有时候在Cyrix上用gcc会有些问题,因此有一套针对Cyrix特点的gcc2.7.2.3我这里有RedHat5的rpm ftp://166.111.68.98/...

迷你MVVM框架 avalonjs 入门教程

新官网请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-controller, ms-important) 忽略扫描绑定(ms-skip) 模板绑定(ms-include) 数据填充(ms-text, ms-htm...

Linux菜鸟入门级命令大全

1. man 对你熟悉或不熟悉的命令提供帮助解释eg:man ls 就可以查看ls相关的用法注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行。2. ls 查看目录或者文件的属*,列举出任一目录下面的文件eg: ls /usr/manls -la.d表示目录(directory),如果是一个"-"表示是文件,如果是l则表示是...