嵌入式Linux问题总结(一) Ubuntu常用命令和编译问题解决方法

  在进行嵌入式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

 

posted @ 2020-05-28 19:13  心的起始  阅读(2388)  评论(0编辑  收藏  举报