|
一、 需要软件
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, 杜汶泽)
|