xingxing52401 发表于 2010-4-26 17:27:02

rtems-i386环境建立

一、        需要软件
1、        cygwin1.5.1
下载地址:ftp://202.195.167.5/_incoming/sofeware/cygwin 1.5.1.rar
2、        交叉编译环境
rtems-4.6-autoconf-rtems-2.59-0.tar.bz2
rtems-4.6-automake-rtems-1.7.2-2.tar.bz2
rtems-4.6-i386-rtems-binutils-2.13.2.1-2.tar.bz2
rtems-4.6-i386-rtems-gcc-gcc3.2.3newlib1.11.0-4.tar.bz2
rtems-4.6-i386-rtems-gdb-5.2-1.tar.bz2
下载地址:http://www.rtems.com/ftp/pub/rtems/cygwin/rtems-4.6
3、        rtems4.6.6
rtems-4.6.6.tar.bz2
下载地址:http://www.rtems.com/ftp/pub/rtems/4.6.6/
二、        安装步骤
1、        安装cygwin1.5.1
选择从本地完全安装
2、        安装交叉编译环境
将交叉编译环境的5个文件复制到“/usr/src”目录下,输入以下命令
tar xjf rtems-4.6-autoconf-rtems-2.59-0.tar.bz2
tar xjf rtems-4.6-automake-rtems-1.7.2-2.tar.bz2
tar xjf rtems-4.6-i386-rtems-binutils-2.13.2.1-2.tar.bz2
tar xjf rtems-4.6-i386-rtems-gcc-gcc3.2.3newlib1.11.0-4.tar.bz2
tar xjf rtems-4.6-i386-rtems-gdb-5.2-1.tar.bz2
修改环境变量
vim /etc/profile

PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH"修改为
PATH="/opt/rtems-4.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH        "
使用“i386-rtems-gcc –version”查看是否安装成功,若显示gcc版本则成功安装
3、        解压rtems-4.6.6
        将rtems-4.6.6.tar.bz2拷贝到/usr/src目录下,利用如下命令对文件进行解压
        tar xjf rtems-4.6.6.tar.bz2
三、        编译步骤
        进入/usr/src目录下,输入以下命令,对rtems进行配置
        mkdir i386-build
        cd i386-build
        ../rtems-4.6.6/configure –target=i386-rtems \
        --disable-posix --disable-networking --disable-cxx \
        --enable-rtemsbsp=pc686 --prefix=/usr/src/i386-build
        配置完毕后,输入make命令进行编译连接,最后在
        /usr/src/i386-build/i386-rtems\pc386\tests目录下会生成7个.exe文件
四、        测试生成内核文件
1、安装grub(具体请参考网络资料)
2、拷贝/usr/src/i386-build/i386-rtems\pc386\tests目录下的exe文件到系统根目录(通常c盘符)
3、重启系统进入grub选项,输入命令
root (hd0,0)
kernel /hello.exe
对内核文件进行测试
五、        注意事项
        1、在编译rtems内核时,可能会发生cannot fork: permission denied的错误,这是由于        windows系统中某些软件与cygwin冲突所造成的,3721,上网助手等软件会造成这个                错误,另外其它软件尚不明确。这就要求在做开发时,最好能使用虚拟机安装一个纯净        的windows系统,然后在虚拟机下进行开发。
        2、测试内核。测试内核,不建议使用虚拟机,笔者在虚拟机下测试内核fileio.exe时发        生错误,而在实际的机器中则不会。
        3、编译命令简释
        ../rtems-4.6.4/configure –target=i386-rtems利用rtems的configure文件进行编译配置,                生成的目标内核文件为i386体系架构的文件
        –enable-rtemsbsp=pc686 –prefix=/usr/src/i386-build在/usr/src/i386-build目录下生成pc686        的编译配置文件
4、        fileio.exe内核文件能够实现简单的shell,然而在i386平台编译时不对fileio编译文
件进行修改运行时会出错。
通过分析fileio的源码,可以发现,执行shell操作是调用shell_init函数来完成的
void fileio_start_shell(void)
{
printf(" =========================\n");
printf(" starting shell\n");
printf(" =========================\n");
shell_init("SHLL",0,100,"/dev/console",
             B9600 | CS8,
             0);
rtems_task_suspend(RTEMS_SELF);
}
函数的原型为(\usr\src\rtems-4.6.6\cpukit\libmisc\shell目录下)
rtems_status_code   shell_init (char * task_name,
                                rtems_unsigned32    task_stacksize,
                                rtems_task_priority task_priority,
                                char * devname,
                                tcflag_t tcflag,
                                int forever) {
rtems_id task_id;
rtems_status_code sc;
shell_env_t * shell_env;
sc=rtems_task_create(new_rtems_name(task_name),
                     task_priority,
                     task_stacksize?task_stacksize:RTEMS_MINIMUM_STACK_SIZE,
                     RTEMS_DEFAULT_MODES,
                     RTEMS_LOCAL | RTEMS_FLOATING_POINT,
                     &task_id);
if (sc!=RTEMS_SUCCESSFUL) {
rtems_error(sc,"creating task %s in shell_init()",task_name);       
return sc;
};
shell_env=malloc(sizeof(shell_env_t));
if (!shell_env) {
rtems_task_delete(task_id);
sc=RTEMS_NO_MEMORY;       
rtems_error(sc,"allocating shell_env %s in shell_init()",task_name);       
return sc;
};
if (global_shell_env.magic!=new_rtems_name("SENV")) {
global_shell_env.magic   =new_rtems_name("SENV");
global_shell_env.devname   ="/dev/console";
global_shell_env.taskname="GLOBAL";
global_shell_env.tcflag    =0;
global_shell_env.exit_shell=0;
global_shell_env.forever   =TRUE;
};
shell_env->magic   =global_shell_env.magic;
shell_env->devname   =devname;
shell_env->taskname=task_name;
shell_env->tcflag    =tcflag;
shell_env->exit_shell=FALSE;
shell_env->forever   =forever;
return rtems_task_start(task_id,shell_shell,(rtems_task_argument) shell_env);
}
通过源码得知当函数第二个参数为0时,shell会设置任务堆栈大小为RTEMS_MINIMUM_STACK_SIZE
task_stacksize?task_stacksize:RTEMS_MINIMUM_STACK_SIZE
该值大小为1024,更改此值,使得shell能够正常工作
修改
shell_init("SHLL",0,100,"/dev/console",
             B9600 | CS8,
             0);

shell_init("SHLL",5120,100,"/dev/console",
             B9600 | CS8,
             0);
修改system.h
#define CONFIGURE_EXTRA_TASK_STACKS         (3 * RTEMS_MINIMUM_STACK_SIZE)

#define CONFIGURE_EXTRA_TASK_STACKS         (5 * RTEMS_MINIMUM_STACK_SIZE)
进入/usr/src/i386-build目录重新make即可



                                     作者:xingxing52401
                                                                        qq:52401982

moyuker 发表于 2011-1-5 19:11:05

Mark。
关注RTEMS
页: [1]
查看完整版本: rtems-i386环境建立