热门关键字:  ubuntu  分区  函数  Fedora  linux系统进程

华恒ColdFire系列嵌入式Linux开发板常见问题解答

来源: 作者: 时间:2007-08-06 Tag: 点击:


32、从SDRAM中划出一块不让Linux访问,供自己使用,可作共享内存用
对于2.4内核修改uClinux/linux-2.4.x/arch/m68knommu/platform/5272/HHTECH/crt0_ram.S(对于2.0ROM版,为uClinux/linux/arch/m68knommu/platform/5272/MOTOROLA/crt0_rom.S),只要修改一处:即文件最前面定义的MEM_SIZE宏,华恒提供的为0x01000000,即16M。用户若想划出8M为自己管理使用,只要将这个值改为0x00800000即可。这样作就是不让LINUX知道还有这8M地址,这样OS在分配内存的时候就不会用到这些地址空间,相当于从OS那里偷内存给自己使用。例如可用于内核驱动和应用程序的通信用共享内存等。

33、关于通过NFS mount宿主机硬盘调试应用程序的问题
嵌入式LINUX调试应用程序最主要的方式就是通过NFS mount宿主机硬盘上的应用程序来执行,通过观察其在串口终端打印的信息来达到调试的目的。
在这个过程中,存在一个权限的问题,即板子mount宿主机硬盘后,这个NFS mount的操作默认的不是以root的权限执行的,因此一般的板子没有权限执行宿主机硬盘上的程序,这时就要在宿主机上执行chmod 777 app,其中app为应用程序可执行文件的名字。其实这种现象还是比较容易为开发人员解决的,因为当执行应用时,minicom就会报错,permision denied,或者unknown error 4。但对于有的情况就不一定这么容易看出是权限的问题:
例如:调试WEB管理软件cgi代码时,我们把宿主机上/cgi-bin/通过NFS mount到板子的CGI工作目录/home/httpd/cgi-bin/上,这时通过浏览器IE执行CGI操作时,就会报错403,这里也是一个权限的问题,即CGI要求其工作目录可写,这时就必须在宿主机上执行:chmod 777 /cgi-bin,这时浏览器里立刻就可以工作了。

34、关于uClinux下线程的使用
使用线程是要求uClibc里加入pThread库编译。
这样就要求make menuconfig时选择uClibc,而不是华恒默认选择的uC-libc。
在uClibc中选择pThread库,可以按照以下操作:
1.cd uClibc
2.make menuconfig CROSS=m68k-elf-
3.选上posix thread support选项
4.cd ..
5.make clean
6.make
库选择好之后,先不必自己编制应用程序,uClinux提供了完备的测试程序:即uClinux/user/threaddemos
你make menuconfig在应用程序中选择这个程序加入编译,看是否可以编译通过,通过后执行是否正确即可。
若编译有错误,可以直接到user/threaddemos目录下,执行:
m68k-elf-gcc -m5307 -msep-data -Wl,-elf2flt -o bcdm bcdm.c -lpthread -lc
可直接生成可执行文件bcdm,可直接mount到板子上执行。
【注意】
这里要求使用20030314的elf-tools 。
华恒客户可发信到support@hhcn.com索取相关测试代码。

35、关于支持模块动态加载(Loadable Module)的问题
在make menuconfig中配置内核时选择:Loadable module support --->
[*] Enable loadable module support
[] Set version information on all module symbols (NEW)
[*] Kernel module loader (NEW)
并在应用程序配置中选择busybox下的insmod/rmmod/lsmod,
并选中: [*] Post 2.1 kernel modules。
关于驱动模块的.c(例如mydriver.c)可这样编译,不需要单独写Makefile,就直接放到uClinux/linux2.4.x里面参与内核编译即可:
cp mydriver.c uClinux-dist/linux-2.4.x/drivers/char
然后修改uClinux-dist/linux-2.4.x/drivers/char/Makefile,
obj-y += mem.o tty_io.o n_tty.o tty_ioctl.o raw.o pty.o misc.o random.o mydriver.o
在最后加入mydriver.o
这样内核就会用正确的参数编译出mydriver.o。
然后把这个mydriver.o单独复制出来到uClinux-dist/romfs/usr下面,然后再把uClinux-dist/linux-2.4.x/drivers/char/Makefile恢复回去,然后再重编内核,烧写,启动后执行insmod /usr/mydriver.o即可成功。再lsmod看看。

36、关于支持应用程序动态链接uClibc的问题
早期的uClinux下的应用程序都是采用静态链接的方式链接uClibc/uC-libc,现在uClinux早就已经可以支持动态链接uClibc库了。动态链接的好处是可以实现多个应用程序实现代码共享,从而可以节省内存消耗,就相当于WINDOWS下的DLL所引入的共享优势。
动态链接在NOMMU处理器上的实现采用了XIP(execute in place)代码。
详细分析参见:
http://mailman.uclinux.org/pipermail/uclinux-dev/2002-April/007786.html

37、关于最新的20030314 elf toolschain
参见:http://www.uclinux.org/pub/uClinux/m68k-elf-tools/
下载m68k-elf-tools-20030314.sh到LINUX PC机上,chmod 777 m68k-elf-tools-20030314.sh,然后./m68k-elf-tools-20030314.sh则直接将最新的m68k-elf-xxx工具集合安装到/usr/local/下面,可以直接使用。

38、执行我的应用程序时报错:BINFMT_FLAT: bad magic/rev (0x1010100, need 0x4)
例如:mount宿主机上的nmbd,在minicom下执行/mnt/nmbd&,出现如下错误:
BINFMT_FLAT: bad magic/rev (0x1010100, need 0x4)
BINFMT_FLAT: bad magic/rev (0x1010100, need 0x4)
/mnt/nmbd: Exec format error
这是因为这个应用程序没有使用交叉编译工具编译,而是用了PC Linux下的gcc编译出来的。造成这种问题的经常是由于客户不是在uClinux目录下执行make统一进行编译,而是直接到该应用程序目录下执行make所致。这是由于uClinux/user/下每个应用程序的Makefile中使用了许多宏,列入CC等,这些宏都是统一在uClinux下的一个目录下的文件中定义的,若用户直接到user/下的应用程序目录下执行make,则这些宏就无法获取uClinux为其设定的值,而是自动采用PC Linux系统默认的,例如CC若用户不指定,默认的就是gcc,所以应用程序就没有用m68k-elf-gcc编译,而是用PC Linux下的gcc编译的,这样编出来的可执行文件在板子上当然是无法执行的了。

39、关于关闭shell,使能串口通信
鉴于我们提供的版本不断的升级,所以针对不同版本的方法略有区别,下面一共提供两种方法:
方法一
1.修改uClinux/linux-2.4.x/init/main.c
- if (open("/dev/ttyS0", O_RDWR, 0) < 0)
+ if (open("/dev/null", O_RDWR, 0) < 0)
修改以后启动过程中printk内容仍会打印,printf内容如rc内步骤不会打印。
2.同时最好在user/init/simpleinit.c中不要启动/bin/sh,具体操作是:
/* Fake an inittab entry if boot console defined */
#ifdef CONFIG_USER_INIT_CONSOLE_SH
#if LINUX_VERSION_CODE < 0x020100
if (console_device && strcmp(console_device, "/dev/null"))
#else
if (have_console)
#endif
/*{ 【就是注释掉这一段代码!!!!】
struct initline *p;
p = inittab + numcmd++;
init_itab(p);
strcpy(p->fullline, "console");
strcpy(p->tty, "console");
strcpy(p->termcap, "linux");
p->toks[0] = "/bin/sh";
} */
#endif
**************************************************************************************
方法二
【这是最新的测试结果】
通常不能使用COM1进行串口通信的原因是它已被重定向为标准输入输出,系统的shell进程将对其监视并处理从此处发送进来的数据,而不能被用户程序所得到。
解决办法我认为有两种,一是不把Com1口重定向为标准输入输出,二是在标准输入输出上不启动shell。第一种没有试过,第二种可以按下面方法修改。
ü uC的版本很多,好像有一种是在uClinux/linux-2.4.x/init/main.c中启动shell,该代码在do_shell函数中,检查main.c文件,如果有该函数,把
if(open("/dev/ttyS0",O_RDWR,0)<0)
改为
if(open("/dev/null",O_RDWR,0)<0)
没有就算了。
在uClinux/user/init/simpleinit.c中注掉read_inittab函数中下面HHTECH部分的内容:
void read_inittab(void)
{
numcmd = 0;
/* Fake an inittab entry if boot console defined */
#ifdef CONFIG_USER_INIT_CONSOLE_SH
#if LINUX_VERSION_CODE < 0x020100
if (console_device && strcmp(console_device, "/dev/null"))
#else
if (have_console)
#endif
/*HHTECH
{
struct initline *p;
p = inittab + numcmd++;
init_itab(p);
strcpy(p->fullline, "console");
strcpy(p->tty, "console");
strcpy(p->termcap, "linux");
strcpy(p->termcap, "linux");
p->toks[0] = "/bin/sh";
}
*/
#endif
read_initfile(_PATH_INITTAB);
#ifdef CONFIG_USER_FLATFSD_FLATFSD
read_initfile(_PATH_CONFIGTAB);
#endif
if (numcmd == 0)
_exit(1);
}
注意:
这样并不是说就永远不会启动shell了,只是在标准输出上不启动shell,但若用户telnet板子还是仍然会在p0口上启动shell的,否则用户就永远无法向板子发布command命令了。
方法三
make menuconfig
Kernel hacking --->
[*] Compiled-in Kernel Boot Parameter
Kernel Boot Parameter: "CONSOLE=/dev/null"
这样选择最彻底,minicom里面没有任何内核启动的信息,但可以telnet板子操作。

40、关于malloc使用问题
在HHCF5272-R2的uClinux下测试, malloc最大空间约为2,048,000
设为2,100,000时,出现:
kernel panic : BUG!
另:realloc结果同malloc一样,大小上没有区别;在内核中使用kmalloc,大小亦相同。

41、MFC5272-16com 开发板串口波特率设置?
#define SETBAUDRATE 0xe021
#define SETBUFFER 0xe022
#define SETFORMAT 0xe023
对串口波特率修改为
ioctl(spfd,SETBAUDRATE,4);
波特率表
char hh_mcf5272_baud_table[10][2] = {
{ 0x80, 0x01 }, /* 1200 300 *///0
{ 0xc0, 0x00 }, /* 2400 600 *///1
{ 0x60, 0x00 }, /* 4800 1200 *///2
{ 0x30, 0x00 }, /* 9600 2400 *///3
{ 0x18, 0x00 }, /* 19.2K 4800 *///4
{ 0x0c, 0x00 }, /* 38.4K 9600 *///5
{ 0x06, 0x00 }, /* 76.8K 19K *///6
{ 0x03, 0x00 }, /* 153.6K 38k *///7
{ 0x02, 0x00 }, /* 230.4K 56k *///8
{ 0x01, 0x00 } /* 460.8K 115k *///9
};
4就对应上表的19200,默认串口波特率为19200
对串口传输格式修改
ioctl(spfd,SETFORMAT,"8n1");
默认为8n1

42、关于CGI
CGI是一种WEB SERVER端扩展代码。例如IIS端的ISAPI等开发的DLL代码都是WINDOWS上的WEB SERVER端的扩展,用于处理用户通过WEB浏览器的表单输入等静态页面以外的智能输入处理。
CGI可用于WINDOWS和LINUX上的WEB SERVER端扩展,可用各种脚本如PHP等实现,最原始的就是用C代码实现的,具体用什么代码要看你的WEB SERVER是否支持。对于嵌入式LINUX采用的boa这个WEB SERVER而言,就不支持任何的脚本,只支持C代码的CGI程序,每连接一个客户端浏览器连接就在SERVER端(板子上)启动一个CGI进程的COPY。

43、在REDHAT 9.0环境下使用BDM时,提示“DEVICE BUSY”,是并口被占用?
请在您的REDHAT9机器上执行如下命令
rmmod lp
rmmod parport_pc
rmmod parport
这时您再执行./chk就没有问题了。

44、xxx函数或者结构体是在哪里定义的等类似的问题。
在LINUX这种开源的环境下工作,最重要的不是你己经掌握了多少知识,而是要掌握获取信息的手段,源代码都有,所有的知识都在那个uClinux的目录下,不需要任何的书籍,只有有搜索和查找的工具就可以获取任何需要的知识,搞开发就像学语言,模仿是非常有效的手段,看系统中运行的代码是怎么写的,仿照着做就是了。
搜索和查找的手段就两个:
一个是在所有文件中搜索字符串:
grep xxx * -r
另一个是搜索文件:
find -name xxx.c
还有,可在uClinux目录下(其实任何目录都可以,只是作用范围小些)用:
ctags -R .
这样在vi中阅读代码时可用ctrl+]跳转到想要查询的函数/结构定义处;用ctrl+T返回。
最新评论共有 4 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册