pixhawk入门 -- 编译环境问题解决过程

pixhawk 编译的基本操作步骤:
1)下载固件仓
git clone https://github.com/PX4/Firmware.git
2)更新固件代码
cd Firmware
git submodule update –init –recursive
3)编译V2固件代码
make px4fmu-v2_default
4)烧录固件
make px4fmu-v2_default upload

每个人使用的编译环境不同,踩的坑也不尽相同。我这列举我遇到的坑和解决过程&方法。

编译环境:Fedora 25 (我个人比较喜欢fedora,可能从大学就开始用,习惯了。)

1.出现import serial错误
pixhawk入门 -- 编译环境问题解决过程_第1张图片
从编译错误信息看,是python脚步无法导入serial这个模块。
所以使用root账号安装对应的python模块:dnf install pyserial

2.提示需要删除ModemManager,避免冲突
这里写图片描述
dnf remove ModemManager删除,完事。

3.make px4fmu-v2_default upload 命令后一直卡在插拔USB的提示页面
pixhawk入门 -- 编译环境问题解决过程_第2张图片
首先怀疑USB没有上报设备,进入/dev/看,发现有serial设备上报。插拔USB口,serial设备消失并重新挂载。cat /dev/serial/by-id下的设备节点,发现没有权限。所以登陆root账号,再次使用命令 make px4fmu-v2_default upload,结果OK了。
pixhawk入门 -- 编译环境问题解决过程_第3张图片

事实证明懒,迟早要还的。果不其然,固件烧录后,使用Minicom打开串口,死活没有nsh的提示符出来,串口也没有响应。
先补充一下串口的配置:
1)先安装minicom
2)再使用minicom -s命令配置串口属性为57600 8N1 ,串口为/dev/ttyACM0 (如果不清楚是那个设备,可通过插拔USB 看看是哪个设备)
串口没有反应,第一直觉就是romfs是不是有问题:1.启动失败 2.没有编译进固件
使用make distclean后,再次编译固件,结果一直提示
Firmware/cmake/nuttx/bin_to_obj.py 65行AttributeError错误,NoneType object has no attribute ‘group’

打开 bin_to_obj.py

 # get size of image
 stdout = run_cmd("{nm:s} -p --radix=x {obj:s}.bin.o", locals())
 re_string = r"^([0-9A-Fa-f]+) .*{sym:s}_size".format(**locals())
 re_size = re.compile(re_string, re.MULTILINE)
 size_match = re.search(re_size, stdout.decode())

 try:
     size = size_match.group(1)
 except AttributeError as e:
     raise RuntimeError("{:s}\nre:{:s}\n{:s}".format(                        
         e, re_string, stdout))
 except IndexError as e:
     group0 = size_match.group(0)
     raise RuntimeError("{:s}\ngroup 0:{:s}\n{:s}".format(
         e, group0, stdout)) # get size of image
 stdout = run_cmd("{nm:s} -p --radix=x {obj:s}.bin.o", locals())
 re_string = r"^([0-9A-Fa-f]+) .*{sym:s}_size".format(**locals())
 re_size = re.compile(re_string, re.MULTILINE)
 size_match = re.search(re_size, stdout.decode())

 try:
     size = size_match.group(1)
 except AttributeError as e:
     raise RuntimeError("{:s}\nre:{:s}\n{:s}".format(                        
         e, re_string, stdout))
 except IndexError as e:
     group0 = size_match.group(0)
     raise RuntimeError("{:s}\ngroup 0:{:s}\n{:s}".format(
         e, group0, stdout))

可以看到size = size_match.group(1)抛出异常,提示没有 group属性,但是group是python内置模块,不可能没有。只有一种可能,就是 size_match为空。再看看代码,只能是arm-none-eabi-nm命令结果有问题。

尝试在run_cmd函数中把编译命令打印出来,看看整个流程。
原来第一步就是用arm-none-eabi-gcc arm-none-eabi-ld arm-none-eabi-nm来计算romfs.bin的大小:
1)/usr/bin/arm-none-eabi-gcc -I/home/pixhawk/Firmware/src/include -g -std=gnu99 -fno-common -Wall -Werror -Wextra -Wno-sign-compare -Wshadow -Wfloat-equal -Wpointer-arith -Wmissing-declarations -Wno-unused-parameter -Werror=format-security -Werror=array-bounds -Wfatal-errors -Werror=unused-variable -Werror=reorder -Werror=uninitialized -Werror=init-self -Werror=unused-but-set-variable -Wformat=1 -Wdouble-promotion -Werror=double-promotion -Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -fvisibility=hidden -include visibility.h -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard -nodefaultlibs -nostdlib -Os -fno-strict-aliasing -fomit-frame-pointer -funsafe-math-optimizations -ffunction-sections -fdata-sections -fno-strength-reduce -fno-builtin-printf -c romfs.o.c -o romfs.o.c.o

2)/usr/bin/arm-none-eabi-ld -r -o romfs.o.bin.o romfs.o.c.o -b binary romfs.bin
3)/usr/bin/arm-none-eabi-nm -p –radix=x romfs.o.bin.o
最后一步期望stdout输出romfs.bin的大小。实际却是在这里出错。
尝试手动把脚步的步骤执行一遍:
1)创建一个空的 romfs.o.c文件,对应脚步如下

2)调用以上命令
结果在执行arm-none-eabi-ld命令时出现Segmentation fault (核心已转储)错误!,查了一下 arm-none-eabi-gcc版本是6.2.0,比较新的阿!

接着使用PC的gcc ld nm命令替代 arm-none-eabi的,在PC上对比测试,发现没有问题。NND,不用想了,就是 arm-none-eabi编译器问题。上 arm-none-eabi官网下载最新的编译器(https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads),解压文件放到/usr/bin目录下,并把最新的 arm-none-eabi的命令路径放入PATH变量中(例如:PATH=$PATH:/usr/bin/gcc-arm-none-eabi-6-2017-q1-update/bin )

重新编译,解决OK了!
接着改变当前用户的权限:
sudo usermod -a -G dialout $USER

把固件再烧录一次,这次串口有输出了!但是乱码。。。。

修改rcS启动文件
Firmware/ROMFS/px4fmu_common/init.d/rcS

     else
         # Start MAVLink
         #mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
         # Start USB shell if no microSD present, MAVLink else
         if [ $LOG_FILE == /dev/null ]
         then
             # Try to get an USB console
             nshterm /dev/ttyACM0 &
         else
             mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
         fi
     fi

再编译烧录,这次nsh提示符出现,输入ls命令响应正常。完美!

你可能感兴趣的:(pixhawk)