搜索
bottom↓
回复: 1

rtems-i386环境建立

[复制链接]

出0入0汤圆

发表于 2010-4-26 17:27:02 | 显示全部楼层 |阅读模式
一、        需要软件
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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-1-5 19:11:05 | 显示全部楼层
Mark。
关注RTEMS
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 15:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表