zynq+linux+ramdisk can调试
由于采用ramdisk文件系统,自带的ip工具版本太旧无法配置can,需要自行编译ip,具体参见参考文献2
1.vivado配置ps


2.设备树增加can0,一般开发板均已提供此配置
can@e0008000 {
compatible = "xlnx,zynq-can-1.0";
status = "okay";
clocks = <0x1 0x13 0x1 0x24>;
clock-names = "can_clk", "pclk";
reg = <0xe0008000 0x1000>;
interrupts = <0x0 0x1c 0x4>;
interrupt-parent = <0x3>;
tx-fifo-depth = <0x40>;
rx-fifo-depth = <0x40>;
};
3.kernel配置,一般已配好,具体参见参考文献1
4.测试
# ifconfig -a
can0 Link encap:UNSPEC HWaddr ---------------
NOARP MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
Interrupt: eth0 Link encap:Ethernet HWaddr :0A::::
inet addr:192.168.0.120 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (465.3 KiB) TX bytes: (18.1 KiB)
Interrupt: Base address:0xb000 lo Link encap:Local Loopback
LOOPBACK MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
设置can0的波特率,这里设置的是100k, ip程序一般需要自己编译生成,参见2
#./ip link set can0 up type can bitrate 100000
显示can0状态信息
#./ip -d -s link show can0
Z-turn# ./ip link set can0 type can bitrate
xilinx_can e0008000.can can0: bitrate error 0.0%
Z-turn#./ip link set can0 up
Z-turn#./ip -d -s link show can0
: can0: <NOARP,UP,LOWER_UP,ECHO> mtu qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen
link/can promiscuity
can state ERROR-ACTIVE (berr-counter tx rx ) restart-ms
bitrate sample-point 0.750
tq prop-seg phase-seg1 phase-seg2 sjw
xilinx_can: tseg1 .. tseg2 .. sjw .. brp .. brp-inc
clock
re-started bus-errors arbit-lost error-warn error-pass bus-off
numtxqueues numrxqueues
RX: bytes packets errors dropped overrun mcast TX: bytes packets errors dropped carrier collsns
5.下面程序为收发测试,也可参见参考文献3
/*****************************************************************************
* Copyright (c) 2014-2017 MYIR Tech Ltd.
* File: can-test.c
* Date: 2014/11/3
* Author: Kevin Su
* Description: A demo program to show how to transmit/receive data with
* socket can interface on CAN bus.
* Please note that, this demo needs two boards to run as
* transmitter and receiver.
* Before run "can-test", we need to config the bitrate with
* "ip" command:
* # ip link set can0 up type can bitrate 100000
*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h> #define DEBUG 1 #define ERR_MSG(fmt, args...) fprintf(stderr, fmt, ##args)
#ifdef DEBUG
#define DBG_MSG(fmt, args...) fprintf(stdout, fmt, ##args)
#else
#define DBG_MSG(fmt, args...)
#endif #ifndef PF_CAN
#define PF_CAN 29
#endif #ifndef AF_CAN
#define AF_CAN PF_CAN
#endif int main(int argc, char *argv[])
{
int fd, ret, flag, len;
char senddata[] = "test";
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
socklen_t socket_len = sizeof(struct sockaddr_can); /* Create a socket with PF_CAN family, SOCK_RAW and CAN_RAW protocol */
fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (fd < ) {
ERR_MSG("Open socket failed!\n");
return fd;
} /* Use can0 */
strcpy((char *)(ifr.ifr_name), "can0"); /* Get information */
ret = ioctl(fd, SIOCGIFINDEX, &ifr);
if (ret != ) {
ERR_MSG("SIOCGIFINDEX failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("can0 can_ifindex = %x\n",ifr.ifr_ifindex); /* Disable loopback */
flag = ;
ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &flag, sizeof(flag));
if (ret != ) {
ERR_MSG("Set loopback disable failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Set can0 loopback disable\n"); /* Disable receiving own message */
flag = ;
ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
&flag, sizeof(flag));
if (ret != ) {
ERR_MSG("Disable receiving own message failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Disable receiving own message\n"); /* Use AF_CAN protocol family */
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex; /* Binding socket */
ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if (ret != ) {
ERR_MSG("Bind socket failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Bind can0 socket\n"); frame.can_id = 0x123;
len = strlen(senddata); while () {
strncpy((char *)frame.data, senddata, len);
frame.can_dlc = len;
ret = sendto(fd, &frame, sizeof(struct can_frame), , (struct sockaddr*)&addr, sizeof(addr));
if (ret > ) {
DBG_MSG("Send success: [%s], ret=%d\n", senddata, ret);
ret = recvfrom(fd, &frame, sizeof(struct can_frame), , (struct sockaddr *)&addr, &socket_len);
if (ret > ) {
DBG_MSG("Recv message: [%s], ret=%d\n", frame.data, ret);
}
}
usleep();
} return ;
}
超时设置(参考文献4):
struct timeval timeout = {,}; //1.0s
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
对于offline节点处理:
如果该控制器没有连接到can网络上,调用send会返回成功,但只是发送至kernel的缓冲区,并非发送至can网络。kernel会一直尝试重发,即使关闭socket或结束进程都不会取消重 发操作,此时如果将控制器连接到can网络上则会一次性将缓冲区内所有内容发出,有时这并非所要结果。如果想要清空发送和接收缓冲区,只能重启can接口
ifconfig can0 down
ifconfig can0 up
在程序中可使用system调用。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。
参考文献:
1.http://xilinx.eetrend.com/blog/12062
2.http://www.cnblogs.com/hujianhua/p/8446291.html
3.https://wenku.baidu.com/view/65baea51bb68a98271fefaa7.html
4.https://blog.csdn.net/newger/article/details/2459113
zynq+linux+ramdisk can调试的更多相关文章
- Linux systemd 打开调试终端、添加开机自运行程序
/************************************************************************* * Linux systemd 打开调试终端.添加 ...
- linux + ffmpeg + eclipse 调试
使用linux + ffmpeg + eclipse调试步骤OS : ubuntu 12.04Eclipse : 3.7.2 为Eclipse安装cdt插件,使其支持c/c++ 导入ffmpeg项目 ...
- pycharm远程linux开发和调试代码
pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...
- zynq linux驱动之PL-PS中断【转】
转自:https://blog.csdn.net/h244259402/article/details/83993524 PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2 ...
- Linux驱动开发调试 -- 打开dev_dbg()【转】
本文转载自:https://blog.csdn.net/kunkliu/article/details/78048618 转载地址:http://blog.chinaunix.net/uid-2284 ...
- Linux 系统内核的调试
http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html 本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟 ...
- 嵌入式linux应用程序调试方法
嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...
- Linux Shell 程序调试
Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的“调试信息”.当然,用户也可以在she ...
- Linux知识(5)----LINUX下GDB调试
命令 解释 示例 file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r c Run的简 ...
随机推荐
- Android学习笔记之图像颜色处理(ColorMatrix)
对图像进行颜色方面的处理,通过使用颜色矩阵(ColorMatrix)来实现.从而可以达到很多特效如黑白老照片.泛黄旧照片等等. 1.颜色矩阵(ColorMatrix) 这里有详细的介绍:http:// ...
- javafx clipboard
public class EffectTest extends Application { public static void main(String[] args) { launch(args); ...
- js闭包注意事项
/关于闭包使用应该注意的 // 1 闭包在父函数每次调用都会产生不同的闭包 // 2 闭包中子函数使用父函数变量的变量不是复制 是引用 // 3 闭包在循环中使用
- deep-in-es6(二)
es6-生成器Generators: eg: function* quips(name) { yield "您好"+name+"!"; if(name.star ...
- sync---强制将被改变的内容立刻写入磁盘
sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率.sync命令则 ...
- 基于 Cookie 的 SSO 中间件 kisso
kisso = cookie sso 基于 Cookie 的 SSO 中间件,它是一把快速开发 java Web 登录系统(SSO)的瑞士军刀.欢迎大家使用 kisso !! kisso 帮助文档 ...
- (二十二)unity4.6学习Ugui中文文档-------交互-Eventsystem & Binding
大家好,我是孙广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unityma ...
- Eclipse&STS常用小技巧
开发是经常用到的代码可进行快捷提示,比如mian alt+/就提示出了main方法是不是很方便,为什么就能提示出来呢? 马上来了: 在你使用的java开发工具中点击Window--->Prefe ...
- weblogic安装(无界面静默安装)
一.环境准备 1. 用户准备 Generic通用版weblogic不能用ROOT用户安装,如无其他用户需先创建用户,创建用户步骤此处略过 2. 下载weblogic 在官网下载weblogic,将下载 ...
- javascript 幻灯片代码(含自动播放)
HTML <div class="slideshow-container"> <div class="mySlides fade"> & ...