您的位置:首页 > 其它

RTEMS-BBB(四):rki镜像

2015-08-05 15:15 225 查看
下边就需要用到一个rki(Rtems Kernel Image)

在github上git到

阅读README和Makefile

在RKI的Makefile中更改

RTEMS_TOOL_BASE = /home/lenovo/development/rtems/4.11/bin/

RTEMS_BSP_BASE = /home/lenovo/development/rtems/image

BSP = beagleboneblack

ARCH = arm-rtems4.11

然后echo $PATH确认export后,make报错

/home/lenovo/development/rtems/4.11/lib/gcc/arm-rtems4.11/4.9.2/../../../../arm-rtems4.11/bin/ld: error: legacy-build/arm-rtems4.11-beagleboneblack/rki.elf uses VFP register arguments, /home/lenovo/development/rtems/image/arm-rtems4.11/beagleboneblack/lib/librtemscpu.a(libposix_a-pthreadself.o)
does not

/home/lenovo/development/rtems/4.11/lib/gcc/arm-rtems4.11/4.9.2/../../../../arm-rtems4.11/bin/ld: failed to merge target specific data of file /home/lenovo/development/rtems/image/arm-rtems4.11/beagleboneblack/lib/librtemscpu.a(libposix_a-pthreadself.o)

collect2: error: ld returned 1 exit status

make: *** [rki.elf] 错误 1

rki编译的错误提示是这样:
rki.elf uses VFP register arguments,  BUT librtemscpu.a(libposix_a-pthreadself.o) does not (use VFP)
修改的方法之一是把 rki 目录下面的 Makefile 里 LDFLAGS(可能还包括 ARCH_OPTS)选项中  -mfloat-abi=hard 去掉
然后生成rki.elf和rki.bin
其实这是一个RTEMS的shell应用
##
## Objects to build
##
OBJS = init.o rtems_net.o rtems_net_svc.o local_shell_cmds.o filesys.o
##
## Optional objects in src directory
##
OBJS += ramdisk.o
OBJS += nvramdisk.o
##
## RTEMS examples / demos
##
OBJS += task_cmd.o
OBJS += hello_cmd.o
OBJS += led_cmd.o
OBJS += dhrystone_cmd.o
OBJS += whetstone_cmd.o
OBJS += benchmarks.o
进入后可以在shell中运行一些demo
查看local_shell_cmds.c
/*
** RTEMS Kernel Image shell command setup
**
*/
#include "rki_config.h"

#include <stdio.h>
#include <stdlib.h>
#include <bsp.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>

#include <rtems/shell.h>
#include <rtems/bdbuf.h>
#include <rtems/error.h>

/*
** External functions
*/

int rtems_init_network(char *EthernetAddress,
char *IPAddress,
char *HostName,
char *NetMask,
char *GateWay,
char *NameServer );

void rtems_start_network_services(void);
int hello_command( int argc, char *argv[]);
int led_command( int argc, char *argv[]);
int task_command( int argc, char *argv[]);
int dhrystone_command( int argc, char *argv[]);
int whetstone_command( int argc, char *argv[]);

/*
** Net Setup Command
*/
int net_setup_command( int argc, char *argv[])
{
/*
** Check args
**   Ethernet address
**   IP Address
**   Netmask
*/
if (argc != 7)
{
printf("Command Usage: netsetup <EthernetAddr> <IPaddress> <Hostname> <Netmask> <Gateway> <Nameserver>\n");
return(-1);
}
else
{
printf ("Ethernet Address =  %s\n", argv[1]);
printf ("IP Address =  %s\n", argv[2]);
printf ("Host Name =  %s\n", argv[3]);
printf ("Netmask =  %s\n", argv[4]);
printf ("Gateway =  %s\n", argv[5]);
printf ("Nameserver =  %s\n", argv[6]);

rtems_init_network( argv[1], argv[2], argv[3], argv[4], argv[5], argv[6] );

#ifdef RKI_INCLUDE_NETWORK_SERVICES
/*
** Start network services
*/
rtems_start_network_services();
#endif
}
return(0);
}

/*
**
** Start the RTEMS Shell.
*/
void shell_start ( void )
{

rtems_status_code sc;

printf ("Starting shell....\n\n");

sc = rtems_shell_init ("shell0", 20 * 1024, 100, "/dev/console", 0, 1,NULL);
if (sc != RTEMS_SUCCESSFUL)
{
printf ("error: starting shell: %s (%d)\n", rtems_status_text(sc), sc);
}
}

/*
**
** Run the /shell-init script.
*/
void shell_init_script (void)
{
rtems_status_code sc;
printf ("Running /shell-init.\n\n");
sc = rtems_shell_script ("initscr",
60 * 1024,    /* Stack size */
20,           /* Priority */
RKI_SHELL_INIT, /* the Script file to run */
"stdout",      /* Where to redirect the output */
0,            /* Run once and exit */
1,            /* Wait ? */
1);           /* Verbose/echo */

if (sc != RTEMS_SUCCESSFUL)
printf ("error: running shell script: %s (%d)\n", rtems_status_text (sc), sc);
}

/*
** function to start the shell and add new commands.
*/
int rtems_add_local_cmds(void)
{
/*
** Add commands
*/
rtems_shell_add_cmd("netsetup","misc","setup and start networking",net_setup_command);

rtems_shell_add_cmd("hello","misc","Say hello RTEMS!",hello_command);

rtems_shell_add_cmd("led","misc","LED working",led_command);

rtems_shell_add_cmd("taskdemo","misc","run a set of tasks",task_command);

rtems_shell_add_cmd("dhrystone","misc","Run the Dhrystone Benchmark",dhrystone_command);

rtems_shell_add_cmd("whetstone","misc","Run the Whetstone Benchmark",whetstone_command);

shell_init_script();

/*
** Setup the shell
*/
shell_start ();

return(0);

}
可以运行add的cmd例如netsetup,hello等,led是我自己加的,后续再聊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: