Igh related:Small Bug And Notes Record.

文章描述了作者在电脑上遇到的typing软件问题,涉及undefinedsymbol错误,解决方案是添加预处理器宏_GNU_SOURCE。还提到在EtherCATCANOpen中对SM2和SM3相关索引进行设置的操作,以及一些具体的SDO传输和子索引值的调整。

Write at the top

My computer got some silly problem with the typing software that my Chinese IM does’t work again. So I’ll try to record the things happened in English.
If any error,DM me plz.

BUGs

BUG1

Undefined symbol Identifier “CLOCK_MONOTONIC”
Undefined symbol Identifier “TIMER_ABSTIME”

Solution

In your main cpp file, add this in the first line:
#define _GNU_SOURCE

Notes

Command Line Notes

  1. 0x1c12(SM2)
    0x1c12 is SM2 Related Index , Specially used in EtherCAT over the CANOpen.
    Aimed to set the RPDO settings.

sudo ethercat upload -t int8 -p 3 -a 0 0x1c12 00

0x01 1

sudo ethercat upload -t int16 -p 3 -a 0 0x1c12 01

0x1600 5632

sudo ethercat upload -t int16 -p 3 -a 0 0x1c12 31
SDO transfer aborted with code 0x06090011: Subindex does not exist
sudo ethercat upload -t int16 -p 3 -a 0 0x1c12 30
0x1621 5665

IndexSubIndexSizeDefault Value
0x1c1200int80x01
0x1c1201int160x1600(5632)
0x1c1202int160x1601(5634)
0x1c1229int160x1620(5664)
0x1c1230int160x1621(5665)
IndexSubIndexSizeDefault Value
0x160000int80x03
0x160001int320x607a0020(1618608160)
0x160002int320x60fe0120(1627259168)
0x160003int320x60400010(1614807056)

2.0x1c13(SM3)

IndexSubIndexSizeDefault Value
0x1c1300int80x01
0x1c1301int160x1a00(6656)
0x1c1302int160x1a01(6657)
0x1c1333int160x1a24(6692)
0x1c1334int160x1a26(6694)
0x1c1335int160x0000(0)

Set 0x1c12 0 to 0
Then set it to the true number
Set 0x1600 0 to 0
Then set it to the true number 1
Set 0x1601 0 to 0
Then set it to the true number 1

root@AM64x-Tronlong:~# ./igh_ethercat_dc_motor -d 0 --> main: Request master success. --> main: Create domain succe[ 217.664211] EtherCAT: Requesting master 0... ss. --> main: Get slave configuration success. --> main: Confi[ 217.664242] EtherCAT: Successfully requested master 0. guration PDO success. --> main: success to register bunch of PD[ 217.664598] EtherCAT 0: Domain0: Lo. O entries for domain. --> main: Activate master success. --> m[ 217.664608] EtherCAT 0: Datagram domain0-0-main: Logical offset 0x000. ain: Get pointer to the process data memory success. --> main: [ 217.664689] EtherCAT 0: Master thread exited. Enter cycle task now... --> check_master_state: 1 slave(s). --[ 217.664700] EtherCAT 0: Stopping EoE thread. > check_master_state: AL states: 0x02. --> check_master_state: [ 217.664781] EtherCAT 0: EoE thread exited. Link is up. --> check_slave_config_state: slave[0]: State 0x02.[ 217.664786] EtherCAT 0: S. --> check_slave_config_state: slave[0]: online. --> check_sla[ 217.664989] EtherCAT 0: Starting EtherCAT-OP thread. ve_config_state: slave[0]: State 0x01. --> check_slave_config_state: slave[0]: State 0x02. --> check_domain_state: Domain: WC 3. --> check_domain_state: D[ 217.953212] EtherCAT 0: Domain 0: Working counter c3 omain: State 2. --> check_slave_config_state: slave[0]: State 0[ 217.953235] . x04. [ 217.972256] EtherCAT ERROR 0-0: Failed to set OP state, slave refused state . [ 217.977301] EtherCAT ERROR 0-0: AL status message 0x0027: "Freerun not suppo. --> check_master_state: AL states: 0x04. [ 217.981523] EtherCAT 0-0: Acknowledged state SAFEOP. [ 217.993912] EtherCAT 0: Slave states on main device: SAFEOP
03-11
#!/usr/bin/env perl # # Copyright (C) 2006 OpenWrt.org # Copyright (C) 2016 LEDE project # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # use strict; use warnings; use File::Basename; use File::Copy; use Text::ParseWords; @ARGV > 2 or die "Syntax: $0 <target dir> <filename> <hash> <url filename> [<mirror> ...]\n"; my $url_filename; my $target = glob(shift @ARGV); my $filename = shift @ARGV; my $file_hash = shift @ARGV; $url_filename = shift @ARGV unless $ARGV[0] =~ /:\/\//; my $scriptdir = dirname($0); my @mirrors; my $ok; my $check_certificate = $ENV{DOWNLOAD_CHECK_CERTIFICATE} eq "y"; $url_filename or $url_filename = $filename; sub localmirrors { my @mlist; open LM, "$scriptdir/localmirrors" and do { while (<LM>) { chomp $_; push @mlist, $_ if $_; } close LM; }; open CONFIG, "<".$ENV{'TOPDIR'}."/.config" and do { while (<CONFIG>) { /^CONFIG_LOCALMIRROR="(.+)"/ and do { chomp; my @local_mirrors = split(/;/, $1); push @mlist, @local_mirrors; }; } close CONFIG; }; my $mirror = $ENV{'DOWNLOAD_MIRROR'}; $mirror and push @mlist, split(/;/, $mirror); return @mlist; } sub which($) { my $prog = shift; my $res = `command -v $prog`; $res or return undef; return $res; } sub hash_cmd() { my $len = length($file_hash); my $cmd; $len == 64 and return "$ENV{'MKHASH'} sha256"; $len == 32 and return "$ENV{'MKHASH'} md5"; return undef; } sub download_cmd($) { my $url = shift; my $have_curl = 0; if (open CURL, "curl --version 2>/dev/null |") { if (defined(my $line = readline CURL)) { $have_curl = 1 if $line =~ /^curl /; } close CURL; } return $have_curl ? (qw(curl -k -f --connect-timeout 20 --retry 5 --location), $check_certificate ? () : '--insecure', shellwords($ENV{CURL_OPTIONS} || ''), $url) : (qw(wget --tries=5 --timeout=20 --output-document=-), $check_certificate ? () : '--no-check-certificate', shellwords($ENV{WGET_OPTIONS} || ''), $url) ; } my $hash_cmd = hash_cmd(); $hash_cmd or ($file_hash eq "skip") or die "Cannot find appropriate hash command, ensure the provided hash is either a MD5 or SHA256 checksum.\n"; sub download { my $mirror = shift; my $download_filename = shift; $mirror =~ s!/$!!; if ($mirror =~ s!^file://!!) { if (! -d "$mirror") { print STDERR "Wrong local cache directory -$mirror-.\n"; cleanup(); return; } if (! -d "$target") { system("mkdir", "-p", "$target/"); } if (! open TMPDLS, "find $mirror -follow -name $filename 2>/dev/null |") { print("Failed to search for $filename in $mirror\n"); return; } my $link; while (defined(my $line = readline TMPDLS)) { chomp ($link = $line); if ($. > 1) { print("$. or more instances of $filename in $mirror found . Only one instance allowed.\n"); return; } } close TMPDLS; if (! $link) { print("No instances of $filename found in $mirror.\n"); return; } print("Copying $filename from $link\n"); copy($link, "$target/$filename.dl"); $hash_cmd and do { if (system("cat '$target/$filename.dl' | $hash_cmd > '$target/$filename.hash'")) { print("Failed to generate hash for $filename\n"); return; } }; } else { my @cmd = download_cmd("$mirror/$download_filename"); print STDERR "+ ".join(" ",@cmd)."\n"; open(FETCH_FD, '-|', @cmd) or die "Cannot launch curl or wget.\n"; $hash_cmd and do { open MD5SUM, "| $hash_cmd > '$target/$filename.hash'" or die "Cannot launch $hash_cmd.\n"; }; open OUTPUT, "> $target/$filename.dl" or die "Cannot create file $target/$filename.dl: $!\n"; my $buffer; while (read FETCH_FD, $buffer, 1048576) { $hash_cmd and print MD5SUM $buffer; print OUTPUT $buffer; } $hash_cmd and close MD5SUM; close FETCH_FD; close OUTPUT; if ($? >> 8) { print STDERR "Download failed.\n"; cleanup(); return; } } $hash_cmd and do { my $sum = `cat "$target/$filename.hash"`; $sum =~ /^(\w+)\s*/ or die "Could not generate file hash\n"; $sum = $1; if ($sum ne $file_hash) { print STDERR "Hash of the downloaded file does not match (file: $sum, requested: $file_hash) - deleting download.\n"; cleanup(); return; } }; unlink "$target/$filename"; system("mv", "$target/$filename.dl", "$target/$filename"); cleanup(); } sub cleanup { unlink "$target/$filename.dl"; unlink "$target/$filename.hash"; } @mirrors = localmirrors(); foreach my $mirror (@ARGV) { if ($mirror =~ /^\@SF\/(.+)$/) { # give sourceforge a few more tries, because it redirects to different mirrors for (1 .. 5) { push @mirrors, "https://downloads.sourceforge.net/$1"; } } elsif ($mirror =~ /^\@OPENWRT$/) { # use OpenWrt source server directly } elsif ($mirror =~ /^\@DEBIAN\/(.+)$/) { push @mirrors, "https://ftp.debian.org/debian/$1"; push @mirrors, "https://mirror.leaseweb.com/debian/$1"; push @mirrors, "https://mirror.netcologne.de/debian/$1"; } elsif ($mirror =~ /^\@APACHE\/(.+)$/) { push @mirrors, "https://mirror.netcologne.de/apache.org/$1"; push @mirrors, "https://mirror.aarnet.edu.au/pub/apache/$1"; push @mirrors, "https://mirror.csclub.uwaterloo.ca/apache/$1"; push @mirrors, "https://archive.apache.org/dist/$1"; push @mirrors, "http://mirror.cogentco.com/pub/apache/$1"; push @mirrors, "http://mirror.navercorp.com/apache/$1"; push @mirrors, "http://ftp.jaist.ac.jp/pub/apache/$1"; push @mirrors, "ftp://apache.cs.utah.edu/apache.org/$1"; push @mirrors, "ftp://apache.mirrors.ovh.net/ftp.apache.org/dist/$1"; } elsif ($mirror =~ /^\@GITHUB\/(.+)$/) { # give github a few more tries (different mirrors) for (1 .. 5) { push @mirrors, "https://raw.githubusercontent.com/$1"; } } elsif ($mirror =~ /^\@GNU\/(.+)$/) { push @mirrors, "https://mirror.csclub.uwaterloo.ca/gnu/$1"; push @mirrors, "https://mirror.netcologne.de/gnu/$1"; push @mirrors, "http://ftp.kddilabs.jp/GNU/gnu/$1"; push @mirrors, "http://www.nic.funet.fi/pub/gnu/gnu/$1"; push @mirrors, "http://mirror.internode.on.net/pub/gnu/$1"; push @mirrors, "http://mirror.navercorp.com/gnu/$1"; push @mirrors, "ftp://mirrors.rit.edu/gnu/$1"; push @mirrors, "ftp://download.xs4all.nl/pub/gnu/$1"; push @mirrors, "https://ftp.gnu.org/gnu/$1"; } elsif ($mirror =~ /^\@SAVANNAH\/(.+)$/) { push @mirrors, "https://mirror.netcologne.de/savannah/$1"; push @mirrors, "https://mirror.csclub.uwaterloo.ca/nongnu/$1"; push @mirrors, "http://ftp.acc.umu.se/mirror/gnu.org/savannah/$1"; push @mirrors, "http://nongnu.uib.no/$1"; push @mirrors, "http://ftp.igh.cnrs.fr/pub/nongnu/$1"; push @mirrors, "ftp://cdimage.debian.org/mirror/gnu.org/savannah/$1"; push @mirrors, "ftp://ftp.acc.umu.se/mirror/gnu.org/savannah/$1"; } elsif ($mirror =~ /^\@KERNEL\/(.+)$/) { my @extra = ( $1 ); if ($filename =~ /linux-\d+\.\d+(?:\.\d+)?-rc/) { push @extra, "$extra[0]/testing"; } elsif ($filename =~ /linux-(\d+\.\d+(?:\.\d+)?)/) { push @extra, "$extra[0]/longterm/v$1"; } foreach my $dir (@extra) { push @mirrors, "https://cdn.kernel.org/pub/$dir"; push @mirrors, "https://download.xs4all.nl/ftp.kernel.org/pub/$dir"; push @mirrors, "https://mirrors.mit.edu/kernel/$dir"; push @mirrors, "http://ftp.nara.wide.ad.jp/pub/kernel.org/$dir"; push @mirrors, "http://www.ring.gr.jp/archives/linux/kernel.org/$dir"; push @mirrors, "ftp://ftp.riken.jp/Linux/kernel.org/$dir"; push @mirrors, "ftp://www.mirrorservice.org/sites/ftp.kernel.org/pub/$dir"; } } elsif ($mirror =~ /^\@GNOME\/(.+)$/) { push @mirrors, "https://download.gnome.org/sources/$1"; push @mirrors, "https://mirror.csclub.uwaterloo.ca/gnome/sources/$1"; push @mirrors, "http://ftp.acc.umu.se/pub/GNOME/sources/$1"; push @mirrors, "http://ftp.kaist.ac.kr/gnome/sources/$1"; push @mirrors, "http://www.mirrorservice.org/sites/ftp.gnome.org/pub/GNOME/sources/$1"; push @mirrors, "http://mirror.internode.on.net/pub/gnome/sources/$1"; push @mirrors, "http://ftp.belnet.be/ftp.gnome.org/sources/$1"; push @mirrors, "ftp://ftp.cse.buffalo.edu/pub/Gnome/sources/$1"; push @mirrors, "ftp://ftp.nara.wide.ad.jp/pub/X11/GNOME/sources/$1"; } else { push @mirrors, $mirror; } } push @mirrors, 'https://sources.cdn.openwrt.org'; push @mirrors, 'https://sources.openwrt.org'; push @mirrors, 'https://mirror2.openwrt.org/sources'; if (-f "$target/$filename") { $hash_cmd and do { if (system("cat '$target/$filename' | $hash_cmd > '$target/$filename.hash'")) { die "Failed to generate hash for $filename\n"; } my $sum = `cat "$target/$filename.hash"`; $sum =~ /^(\w+)\s*/ or die "Could not generate file hash\n"; $sum = $1; cleanup(); exit 0 if $sum eq $file_hash; die "Hash of the local file $filename does not match (file: $sum, requested: $file_hash) - deleting download.\n"; unlink "$target/$filename"; }; } while (!-f "$target/$filename") { my $mirror = shift @mirrors; $mirror or die "No more mirrors to try - giving up.\n"; download($mirror, $url_filename); if (!-f "$target/$filename" && $url_filename ne $filename) { download($mirror, $filename); } } $SIG{INT} = \&cleanup; 每一句都要注释,将注释和原代码一起给出
最新发布
07-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值