嵌入式主板上更新xenomai +can通信测试--WT

本文详细介绍了在嵌入式主板pc104上更新xenomai 3.0.5并解决can通信问题的过程,包括内核配置、驱动冲突、环境变量设置、权限问题、xeno-config版本差异以及程序依赖库的处理。实验中使用了peak_can卡进行通信,并通过can分析仪验证了数据收发的正确性。
摘要由CSDN通过智能技术生成

一、更新安装的xenomai:

本文硬件基于嵌入式主板pc104+peak can通信卡
系统基于linux-4.9.38+xenoma3.0.5
就遇到的几个问题进行总结:
在给Linux内核打上补丁构建出xenomai内核后,另外需要xenomai提供的一些实用程序与库,编译安装xenomai2.5.5后系统正常运行,且实时xenomai运行正常.但是现在需要xenomai为xenomai3.0.5,就需要更新库以提供使用。
更新xenomai必然更新对应的打补丁的Linux内核,在打补丁的内核中配置好xenomai后,将其替换到主机中,且运行正常。
1、编译选项
这里遇到一个问题,我用的是xenomai下的can部分,在Linux+xenomai上配置sja1000下相应的can卡具体的硬件驱动型号时应注意Linux内核下有同样一套检查硬件的驱动程序,要是用xenomai下的驱动去探测硬件时,应在配置内核时将普通Linux内核下相关can的选项去掉,否者将会产生冲突,无法注册实时can的接口。
如果发现驱动配置正常,但是没有成功在注册can 的接口,就是在/proc/rtcan文件夹下不存在can口,另外注意是在没有加载虚拟can 驱动的情况下。可利用lsmod 查看此时主板上加载的驱动:
在这里插入图片描述

如果发现存在两个关于硬件can卡的驱动,我这里那么可以断定是发生了驱动加载冲突而导致的问题。我当时就是存在一个peak_can_pci 和 一个xeno_can_peak_pci的两个peak的驱动,就导致在xenomai中无法注册can 的接口。如果在编译时将这两个驱动都编译进内核了,那就需要重新编译内核,在编译内核的时候将普通linux内核的相关驱动关闭,我的硬件是peak can 卡,所有只需将linux下的以下选项关闭:
这个位置的选项即可
在这里插入图片描述
如果你是动态编译的驱动,则可在目录

/lib/modules/”选择自己运行的内核“/kernel/drivers/net/can/sja1000

下将关于peak相关驱动删除,重启即可。

2、需要添加3.0.5的库以及配置相关的环境变量。
当使用xenomai下的一些命令时,发现找不到命令,

--bash:xeno:command not found

这是由于系统 PATH 设置问题,PATH没有设置正确,系统就无法找到精确命令了。

首先在xenomai3.0.5正常编译安装xenomai3.0.5.然后如下添加环境变量

echo '
###Xenomai
export XENOMAI_ROOT_DIR=/usr/xenomai
export XENOMAI_PATH=/usr/xenomai
export PATH=$PATH:$XENOMAI_PATH/bin:$XENOMAI_PATH/sbin
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$XENOMAI_PATH/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$XENOMAI_PATH/lib
export OROCOS_TARGET=xenomai
' >> ~/.xenomai_rc

echo 'source ~/.xenomai_rc' >> ~/.bashrc
source ~/.bashrc

3、权限问题
一些就绪后,此时xenomai自带的小程序便可以运行,但是这些程序应当给与sudo 权限运行,在运行过程中利用chmod 777 *** 改变权限后同样需要sudo权限,这个暂时不明白,但是暂时不影响程序的运行。
在这里插入图片描述
但是当我们需要用到自己写的程序时我们注意到两处错误
4、xeno-config
xeno-config在xenomai中是利用xeno-config链接到各个皮肤以编译xenomai的程序。但是在以前可能存在旧版本的xeno-config(2.5.5),与新的xeno-config运行的效果是不同的,若是是运行时出现xeno-config使用不当的问题,那么就应当找到旧版本的xeno-config替换为新的xeno-config。
以下是两个版本的差异;
xeno-config 2
在这里插入图片描述
xenomai3
在这里插入图片描述
5、编译通过后,运行程序遇到了依赖库的问题

error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file

这是由于已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件. 因为我们的共享库是安装在usr/lib下的,因此我们需要运行ldconfig。
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
参考:https://blog.csdn.net/sahusoft/article/details/7388617

一切问题解决后便可以编译自己的程序进行实验了。

二、pc104+peak_can卡通信实验:

利用周立功can分析仪,连接CAN卡通信口与PC机的USB,可在PC 机观察该can口的数据发送情况。利用can分析仪,从上位机发送1帧数据,当can卡接收到数据后,从同一can卡连续发出5帧数据出去:
1、编写收发程序,使can口在接收到1帧数据后从同一CAN口发送5帧数据出去:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <getopt.h>

#include <alchemy/task.h>
#include <alchemy/timer.h>

#include <rtdm/can.h>

static void print_usage(char *prg)
{
   
    fprintf(stderr,
	    "Usage: %s [<can-interface>] [Options]\n"
	    "Options:\n"
	    " -f  --filter=id:mask[:id:mask]... apply filter\n"
	    " -e  --error=mask      receive error messages\n"
	    " -t, --timeout=MS      timeout in ms\n"
	    " -T, --timestamp       with absolute timestamp\n"
	    " -R, --timestamp-rel   with relative timestamp\n"
	    " -v, --verbose         be verbose\n"
	    " -p, --print=MODULO    print every MODULO message\n"
	    " -h, --help            this help\n",
	    prg);
}


extern int optind, opterr, optopt;

static int s = -1, verbose = 0, print = 1,dlc=0;
static nanosecs_rel_t timeout = 0, with_timestamp = 0, timestamp_rel = 0;

RT_TASK rt_task_desc;

#define BUF_SIZ	255
#define MAX_FILTER 16
static struct can_frame fram;
struct sockaddr_can recv_addr;
struct can_filter recv_filter[MAX_FILTER];
static int filter_count = 0;

static int add_filter(u_int32_t id, u_int32_t mask)
{
   
    if (filter_count >= MAX_FILTER)
	return -1;
    recv_filter[filter_count].can_id = id;
    recv_filter[filter_count].can_mask = mask;
    printf("Filter #%d: id=0x%08x mask=0x%08x\n", filter_count, id, mask);
    filter_count++;
    return 0;
}

static void cleanup(void)
{
   
    int ret;

    if (verbose)
	printf("Cleaning up...\n");

    if (s >= 0) {
   
	ret 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值