9:mini2440平台挂载NFS文件系统后,在开发板上没有权限进行创建文件等等一些事情,提示没有权限。

mkdir xxx

mkdir: cannot create directory `xxx: Read-only file

system

奇怪的问题,明明我查看系统上各个文件或文件夹的权限都是777,而且宿主机上的nfs服务器的说明如下【咋看是没有问题,其实是有问题的】

【貌似没有问题的NFS配置说明,如下】

vi

/etc/exports--->/home/NfsRoot

192.168.1.*空格(rw,sync,no_root_squash)

上面的中文空格表示在该处加一个空格键

【改正】 其实就是上面的空格造成的错误:将上面的“空格”所在处的空格删除,就解决问题了。

8:mini2440平台,做GPIO触发中断,点亮相应的LED灯的实验,写成olatform平台机制

在每次下载模块时都提示中断方面的警告。后来改了地方就没有警告了,但是我自己还不清楚其中具体的原因,只是该好了而已。

过程:

【通过 cat

/proc/interrupts查看系统中的中断使用情况:中断号 等信息】

写成平台驱动:

mini2440_gpio_app

mini2440_gpio_platform_device.ko

mini2440_gpio_platform_driver.ko

1:GPIO的中断注册在

驱动的xxx_open函数中实现,中断注销在xxx_close函数中实现,每次加载模块后,必须通过系统调用open(xxx)打开设备文件来注册中断,然后后面必须调用close函数注销中断。

但是这样很容易提示警告,

WARNING: at kernel/irq/manage.c:858

__free_irq+0xa0/0x1b0() Trying to free

already-free IRQ 52

Modules linked in: mini2440_gpio_platform_device

mini2440_gpio_platform_driver(-) [last unloaded:

mini2440_gpio_platform_driver]

在这种写法下,其实cat

/proc/interrupts查看中断的使用信息,发现中断注册与注销有问题,有个别按键的中断其实都没有注册进去,后面在调用释放自然有警告;或者是有时个别中断注销不成功,这样再次注册就会有问题,这个具体的原因我不是很清楚,估计是经常打开关闭有些操作不当造成的。

2:

将中断注册放到mini2440_gpio_probe函数中,将注销函数放到mini2440_gpio_remove函数中,问题就解决了,而且查看中断的注册信息或注销后的信息都是没有异常,没有问题的。

我想以后再没有完全搞清楚其中的原因前,某个模块需要用中断时,中断的注册于注销还是放到xxx_probe与xxx_remove函数中,xxx_probe实现platform驱动机制中完成字符设备的注册等过程。而xxx_remove

实现platform驱动机制中完成字符设备的注销

7:mini2440平台,linux内核用的是友善官网下载的源代码编译的,内核启动挂载文件系统后,

板载的LED自动点亮,影响LED实验,怎么让系统启动时不自动加载LED程序??让LED不自动流水点亮?

分析:查看在串口终端上打印的启动信息,发现下面的句子:

Try to bring eth0 interface

up......NFS root

.../etc/init.d/ifconfig-eth0:

然后去文件系统的/etc/init.d/目录下发现两个文件:ifconfig-eth0

rcS

其中一个就是刚才启动的/etc/init.d/ifconfig-eth0,估计另一个rcS没有打印信息;

用vi 查看之:

里面很多的内容

syslogd

/etc/rc.d/init.d/netd start

echo "  " >

/dev/tty1

echo "Starting networking..."

> /dev/tty1

sleep 1

/etc/rc.d/init.d/httpd start

echo "  " > /dev/tty1

echo "Starting web server..."

> /dev/tty1

sleep 1

/etc/rc.d/init.d/leds start

echo "  " > /dev/tty1

echo "Starting leds service..."

> /dev/tty1

echo "

通过网络查资料: /etc/init.d 目录包含许多系统各种服务的启动和停止脚本,比如这里的ifconfig-eth0

rcS,其中rcS里面启动/etc/rc.d/init.d/leds,去/etc/rc.d/init.d/可查看到对应文件。

etc/init.d/rcS

【系统随机启动项可在里面设置,设置好之后随系统启动,如上面vi查看到的代码所示】完成各个文件系统的

mount,再执行/usr/etc/rc.local;通过rcS 可以调用 dhcp 程序配置网络。rcS 执行完了以后,init 就会在一个 console 上,按照 inittab 的指示开一个 shell,或者是开

getty + login,这样用户就会看到提示输入用户名的提示符。

rc.local

/usr/etc/

#!/bin/sh

. /usr/etc/profile

echo "HELLO! Embest"

echo "ifconfig eth0 192.168.0.10"

ifconfig eth0 192.168.0.10 #可自行配置开发板IP

/usr/etc/rc.local 这是被init.d/rcS 文件调用执行的特殊文件,与Linux 系统硬件平台相关,如安装核心模块、进行网络配置、运行应用程序、启动图形界面等。

rcS

/mnt/etc/init.

d/

#!/bin/sh

/bin/mount -a

exec /usr/etc/rc.local

/usr/etc/profile 执行该文件配置需要的环境变量等。

Profile

/usr/etc/

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin ?? 设置命令工具所在位置

解决:将/etc/init.d/rcS中的/etc/rc.d/init.d/leds

start屏蔽即可

6:mini2440平台,在编写platform机制的led驱动时,通过模块的方式加载设备mini2440_led_platform_device.ko,但是卸载时却有问题。

错误提示:

WARNING:

at drivers/base/core.c:143 device_release+0x70/0x84()

Device 'at91_adc' does not have a release() function, it is broken

and must be fixed.

分析: 从错误提示看,应该是没实现release函数造成的,那么就去代码里面去实习之。

解决:

在设备模块中国,实现release函数。

static

void mini2440_led_platform_device_release(struct

device * dev)

{

return ;

}

static struct platform_device mini2440_platform_device_led =

{

.name  =

"mini2440_led_platform_device_driver",

.id  = -1,

.num_resources  =

ARRAY_SIZE(mini2440_led_resource),

.resource  = mini2440_led_resource,

.dev  = {

.release  = mini2440_led_platform_device_release,

},

};

5:mini2440平台,通过cat

/var/log/messages查看内核打印函数printk的打印记录时,发现没有记录。

原因与解决方法:要在/var/log/messages看到输出,需要klogd

和 syslogd都启动,通过ps命令查看系统的进程信息,发现只有syslogd(启动方法:/etc/rc.d/init.d/netd

start)启动了,那么接下来试着去启动klogd(启动方法:直接在命令行中敲入klogd命令来启动),再通过ps查看系统进程发现klogd启动了,再查看日志,信息出现了。

4:mini2440平台,环境变量PATH的修改

env查看所有的环境变量,修改PATH变量;

在宿主机或者平台上 vi /etc/profile

PATH=$PATH:路径1:路径2:...:路径n

平台重启后,即可看到新设的变量

3:编写mini2440需要的Makefile文件时。报错makefile:5:

*** 遗漏分隔符停止

原因是在编写makefile文件时:

3 : 3.c

gcc -o 3 3.c

gcc前的是tab分隔符,不能用空格,否则会出现“makefile:2: *** 遗漏分隔符 。

停止。”提示。。。

make中规定每一Shell命令之前的开头必须使用字符。

也就是每个 “gcc

-”前一定要加字符。

2:mini2440平台,LED驱动模块,成功加载,rmmod可以卸载,但是总是报错

rmmod: module 'mini2440 led' not

found

错误提示:

insmod mini2440_led.ko;-->加载成功

rmmod

mini2440_led;--->卸载成功,但立即会提示下面信息

rmmod: module 'mini2440 led' not found

分析:

暂可以通过下面的方法解决,可能在 busybox方面出现一些问题,具体的还不是很清楚;

解决:

(mini2440平台上用uname -r :获取运行的内核版本信息是 2.6.32.2-FriendlyARM ,

同时在lib/modules目录下同时存在名字与之对应的文件夹)

1:将 mini2440_led.ko模块放在lib/modules/2.6.32.2-FriendlyARM目录下,卸载时就不会出现问题;

放在其他的目录下,卸载时就会出现错误提示的现象

2:参考网络的一个办法(不过我没有试过),也就是通过一段代码重新生成rmmod命令;

查看 libstdc++.so.6,他是链接到 /usr/lib/libstdc++.so.6.0.8;

1:安装了mini2440网站提供的交叉工具链后,在红帽企业版5里编译内核和其他程序时,出错:

错误提示:

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not

found(required by

/opt/FriendlyARM/toolschain/4.4.3/lib/libppl.so.7)

分析:

通过 strings /usr/lib/libstdc++.so.6 | grep GLIB

查看他内部所有的可打印的信息,发现他的版本过旧,没有 GLIBCXX_3.4.9;版本过旧造成的,需安装新版本

解决:

查看 libstdc++.so.6,他是链接到 /usr/lib/libstdc++.so.6.0.8;

我们可以下载/usr/lib/libstdc++.so.6.0.10,因为他已经包含了

GLIBCXX_3.4.9,网上下载;

步骤:

1.下载后请先验证strings /tmp/libstdc++.so.6|grep GLIBCXX是否有

GLIBCXX_3.4.9

GLIBCXX_3.4.10

如果结果不对, 请不要继续以下的步骤, 因为可能导致无法进入图形界面.

2.之后删除 符号链接:rm /usr/lib/libstdc++.so.6

3.复制文件cp /tmp/libstdc++.so.6.0.10 /usr/lib/

4.再建立符号链接ln -s /usr/lib/libstdc++.so.6.0.10

/usr/lib/libstdc++.so.6

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐