在进行嵌入式Linux的学习笔记的学习过程中,开发过程也遇到很多Ubuntu系统,编译,Makefile语法,设备树,网络以及线程,进程等细节知识,这部分知识十分零散,却是应用开发的基础,如果将其放在学习笔记系列中,又干扰整个开发的节奏,所以就在上个系列的基础上,新增加关于嵌入式Linux问题的总结,这里面记录的可能是常用命令,编译报错的解决方法,特殊的bash语法知识等,如果后面再遇到问题,解决后,也会持续维护更新这篇文章,算是个小的问题资料库了。
1.常用资料网络路径
gcc下载官方路径: http://ftp.gnu.org/gnu/gcc
gcc下载镜像路径: http://mirror.hust.edu.cn/gnu/
淘宝源的git文件: https://npm.taobao.org/mirrors/git-for-windows/
综合的开源QT基础DEMO: https://github.com/feiyangqingyun/QWidgetDemo
在线工具,资料: http://tool.oschina.net/
算法学习: https://leetcode-cn.com/
windows国内备份站点: https://msdn.itellyou.cn/
清华Ubuntu镜像站路径: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
代码编译结果直接查看: https://godbolt.org/
2.常用Ubuntu指令汇总
sudo su 获取root权限 clear 清除当前界面 ifconfig 网络相关执行
ifconfig eth0 up 启动网口0
top 查看当前系统的各程序的占有率 mkdir -p filepath 创建路径,可递归创建 apt-get install filename 安装指定文件 alias ll='ls -alF' 列出当前文件夹内状态 ls /dev/ 查询当前的设备 ls /dev/sd* 查询当前的是的sd卡设备 ps -a | grep sshd 查询当前执行的sshd后台应用
ps -ef 查询当前执行的所有后台应用 kill -9 xxx 关闭指定ID的后台应用 tar -xvf xxx 解压到当前文件夹,后面可指定目录 cat /proc/devices 查询当前的设备总线 scp -r file_name system_usr@ip_addr:/filepath 例如: scp -r uart_proto root@192.168.1.251:/usr/app 通过ssh快速上传文件到指定地址 insmod/rmmod/modprobe/lsmod 加载/删除/带关联加载/显示内核模块 modinfo xx.ko 列出模块的信息 tar -vcjf xxx.tar.bz2 * 将当前路径下的文件打包 mknode /dev/... c main_id slave_id
例如: mknod /dev/led c 1 0 根据主从设备号创建设备节点 ls /proc/slabinfo 查看内存占用情况
3. Linux下挂载SD卡方法
使用指令ls /dev/mmc* 查看当前的sd卡分区,如我的sd卡为/dev/mmblk0p1~4
使用指令
mount -t vfat /dev/mmcblk0p1 /mnt/sdb1 将SD卡挂载到指定路径下,并可以通过指令
umount /mnt/sdb1 取消u盘的挂载
错误问题解决:
mount: mounting /dev/mmcblk0p1 on /mnt/sdb2 failed: No such file or directory
此时如果mnt路径下没有该目录,会挂载失败
mount -n -o remount,rw / 解锁只读权限,
mkdir /mnt/sdb1 创建挂载路径
此后可通过
ls /mnt/sdb1 查看挂载的U盘的数据
4. 编译和命令行错误问题解决
1) 嵌入式平台断电或者硬件复位保存文件会无效
原因: 这是因为嵌入式文件的保存分为程序读写---->缓冲区----->内核------>磁盘,直接硬件重启可能会导致来不及写入。
解决指令: 使用reboot指令进行复位,尽量不要使用硬件复位。
2)Makefile编译出错
内核编译报如下显示找不到Makefile
make[2]: *** No rule to make target `/usr/kernel/hello/Makefile'. Stop.
make[1]: *** [_module_/usr/kernel/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-23-generic'
解决办法:Makefile必须大写,否则找不到文件
/bin/sh: 1: lzop: not found问题
解决方案是:
安装lzop,执行下面语句
sudo apt-get install lzop
Makefile:5: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.
解决办法:make命令需要以Tab对齐,直接复制可能是空格对齐,使用vim指令修改带make行的语句,用tab对齐。
curses.h: No such file or directory
解决办法:sudo apt-get install libncurses5-dev
bc:command no found
解决办法:sudo apt-get install bc
3)普通模式和root模式命令状态执行不一致
原因:管理员模式和普通模式对应的PATH不一致,在普通模式下能找到指令,管理员模式下无法找到。
解决办法:
在普通模式下PATH对应路径为/etc/profile中的export PATH="xxx:添加路径",
在管理员模式下PATH对应路径为/etc/environment中的PATH="xxx:添加路径"
修改后可用source /etc/environment来更新PATH,有问题可及时修改。
另外,可通过echo $PATH查看当前的全局路径。
4)内核模块加载错误
insmod: error inserting 'memdev.ko': -1 Device or resource busy
原因:驱动的设备号已经被占用
解决办法:如果占用设备号的设备同样为独立于内核的模块,可用rmmod删除后,在添加,如果为内核集成的模块,则需要重新编译内核模块或Linux模块,避免被占用。
5)使用SSH指令传输数据出错
如scp -r uart_proto root@192.168.1.251:/usr/app报如下错误
no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
原因:ssh客户端使用的配置为ssh_config, ssh服务器端使用配置为sshd_config
vim /etc/ssh/ssh_config(路径可能根据实际情况改变,我的系统是该路径)
将ssh服务器下sshd_config中的KexAlgorithms, Ciphers, MACs添加到该文件末尾即可。
6)编译node显示
'print' no acceptable C compiler found
如果gcc, g++在全局下都能正常使用,那么原因是默认系统python的版本使用的是python3,而不是python2,可通过
cd /usr/bin
rm -rf python
ln -s /usr/bin/python2.7 /usr/bin/python