ARM Linux SocketCAN驱动编译记录
最近调试时使用了相关工具,参考了相关博客终于编译通过。特此汇总各博客内容进行整理
1.编译环境所需工具:
交叉编译工具链根据每个开发板所提供的类型进行设置,我的工具链名称为
1 | arm-fsl-linux-gnueabi-gcc |
后面实际配置时请注意
2.参考博客
https://www.cnblogs.com/eaggle/p/7641526.html
https://blog.csdn.net/sinat_35706094/article/details/79537749
https://blog.csdn.net/sno_guo/article/details/17029295
3.具体配置
第一步:配置交叉编译工具链
配置好交叉编译工具链为全局环境,也就是将其添加到环境变量中,具体因人而异。在这不具体说明,请自行查找资料
1 | export ARCH=arm |
第二步 交叉编译libsocketcan
1 | cd libsocketcan-0.0.10 //进入目录 |
此时生成文件会出现在out/lib
文件夹下,将这些生成的库复制到开发板的文件系统内,可以放在lib目录下,也可以放在usr/lib
里面
(每篇博客的设置都不同,该步的生成文件我没有拷贝到开发板。以防后面配置出现问题,可以设置上)
第三步 编译安装canutils-4.0.6.tar.bz2
先将 libsocketcan 里面的头文件 libsocketcan.h
, can_netlink.h
复制到 canutils 的 include
里面。这些文件在out/include
目录下
1 | cd canutils-4.0.6/ |
最后在 out/sbin
下能见到 canconfig
命令,在out/bin
下面 candump/canecho/cansend/cansequence
将这些文件拷贝到开发板/usr
目录下即可。
具体请看参考博客
4.高级设置
关键词:Linux SocketCAN工具can-utils
中多线程设置
实际使用时,将接收到的CAN数据发送到远程,同时远程服务器会再发送数据过来,所以需要多线程的需求。写好编译时,会出现这样的报错
1 | undefined reference to `pthread_create' |
很明显是由于设置多进程导致的,添加相应库后无效。经搜索发现需要在编译时进行相应设置,问题如下:
问题: pthread
库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a
,所以在使用pthread_create()
创建线程,以及调用 pthread_atfork()
函数建立fork处理程序时,需要链接该库。
**解决:**在编译中要加 -lpthread
参数(最好加在最后面,我到貌似就是这样才行)
1 | gcc thread.c -o thread -lpthread |
thread.c
为你些的源文件,不要忘了加上头文件#include<pthread.h>
但由于can-utils
是通过Makefile管理,因此需要找到相关的编译设置。摸索一小时终于找到~
在工具链\src\GNUmakefile
中,第96行添加-lpthread
,效果如下
1 | CFLAGS = -Wall -g -lpthread -O2 |
同时在第365行添加-lpthread
,效果如下:
1 | .c.o: |
之后执行make
,make install
编译即可。