瑞芯微RK3506开发板Ethercat主站适配开发详细攻略,实测微秒级抖动延迟!
EtherCAT IgH软件环境
EtherCAT整体介绍
EtherCAT整体分为四个部分,包含:实时Linux内核、用户态、驱动以及EtherCAT应用。触觉智能RK3506开发板提供EtherCAT预编译的bin文件:
实时Linux内核
EtherCAT IgH需要保证高实时性,Preempt-RT是一种针对实时性能进行了优化的Linux内核。与普通的 Linux内核相比,Preempt-RT具有以下优势:
1. 实时性能: Preempt-RT提供了更可靠和更精确的实时性能。它采用了一些实时调度策略和机制,使得任务能够按照严格的时间要求执行,从而适用于需要高度可预测性和低延迟的应用场景,如工业自动化、机器人控制等。
2. 硬实时能力:Preempt-RT具有硬实时能力,即能够确保任务在规定的时间内完成,而不会受到其 他任务或中断的干扰。这对于需要严格的时间限制的应用非常重要,如航空航天、医疗设备等领域。
3. 任务调度:Preempt-RT使用了更加高效和优化的任务调度算法,如基于优先级的实时调度算法, 以确保高优先级任务能够及时响应并完成,而低优先级任务不会影响到实时任务的执行。
4. 中断处理:Preempt-RT针对中断处理进行了优化,使得中断的响应时间更短,能够更快地响应外部事件。
5. 内核定时器:Preempt-RT提供了更精确和可配置的内核定时器,使得可以实现微秒级的定时精 度,适用于对时间要求极高的应用场景。
6. 实时扩展:Preempt-RT提供了一些实时扩展机制,使得用户能够方便地对内核进行定制和扩展,以满足特定应用的需求。
总的来说,Preempt-RT在实时性能、可靠性和精度方面比普通的Linux内核更加优秀,因此在对实时性能 要求较高的应用场景中被广泛使用。瑞芯微提供配套SDK的Preempt-RT补丁。
用户态
用户态中主要是两个文件,ethercat和libethercat.so,一个是EtherCAT IgH的调试工具,一个是EtherCAT。
IgH的动态库,用来提供用户层接口。用户态部分访问以下链接:
https://gitlab.com/etherlab.org/ethercat/-/tree/master?r ef_type=heads下载IgH的源代码,编译后会生成ethercat二进制文件,libethercat.so和一些example等等。用户态部分也可以使用预编译好的EtherCAT IgH二进制文件和libethercat.so,如下所示:
驱动
驱动部分主要是ec_master.ko和一些瑞芯微RK优化后的ko文件。
EtherCAT IgH应用部分
EtherCAT IgH应用部分需要根据实际使用的伺服驱动器来实现,该部分无法通用的, 触觉智能提供如下测试组件:
EtherCAT IgH软件编译和部署
以下将根据实时Linux内核、用户态、驱动以及EtherCAT应用四个部分进行讲解。
编译内核
步骤一:打上Preempt-RT补丁,内核方案选择Preempt-RT内核方案,参考文档打上补丁:SDK/docs/Patches/Real-Time-Performance/README.md
要特别注意的是:发布的驱动部分SDK/external/rk_ethercat_release和内核头文件强相关,请确认内核的 commit
要和SDK/external/rk_ethercat_release/driver/redmine中描述的一样,再打入Preempt-RT补丁。
步聚二:修改RK3506 Linux 6.1内核
diff --git a/arch/arm/configs/rk3506_defconfig b/arch/arm/configs/rk3506_defconfig
index e6d3ba608a77..3029973ade8c 100644
--- a/arch/arm/configs/rk3506_defconfig
+++ b/arch/arm/configs/rk3506_defconfig
@@ -2,6 +2,7 @@
CONFIG_KERNEL_XZ=y
CONFIG_DEFAULT_HOSTNAME="localhost" CONFIG_SYSVIPC=y
+CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_PREEMPT=y
@@ -119,12 +120,13 @@ CONFIG_NETDEVICES=y
# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set
# CONFIG_NET_VENDOR_SOCIONEXT is not set
-CONFIG_STMMAC_ETH=y
+CONFIG_STMMAC_ETH=m
# CONFIG_DWMAC_GENERIC is not set
# CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
# CONFIG_NET_VENDOR_XILINX is not set
+CONFIG_PHYLIB=y
CONFIG_MOTORCOMM_PHY=y
CONFIG_PPP=y
# CONFIG_WLAN is not set
步骤三:编译出实时内核
最后根据rt-linux README.md,生成实时性内核。
用户态与驱动部分
这部分可以直接在SDK中获取(参考第二章),或者源码编译,源码linux环境下编译的方法如下:
#进入源码目录
cd source
#指定编译链路径(编译链在SDK中有提供)
export PATH=SDK/prebuilts/gcc/linux-x86/ (arch)/gcc-arm-10.3-2021.07-x86_64- (arch)-none-linux-gnu/bin:$PATH
#配置,指定内核目录,选择SDK下的kernel-6.1或者kernel-5.10,这里使用kernel-6.1。
./bootstrap
./configure --prefix=(编译后你需要存放的目录) --host= (arch)-none-linux-gnu --with- linux-dir=SDK/kernel-6.1 --enable-8139too=no --enable-stmmac=yes --enable-
generic=no --enable-wildcards=yes
#编译
make -j8
make install systemdsystemunitdir=(编译后你需要存放的目录,和configure命令上的prefix下 跟的参数需要一直)
#部署,从你指定的输出目录中拷贝文件到开发板上
cp libethercat.so* /usr/lib/ (开发板上)
cp ethercat /usr/bin/ (开发板上)
cp phylink.ko /userdata/ (开发板上) 内核编译
cp pcs-xpcs.ko /userdata/ (开发板上) 内核编译 cp ec_master.ko /userdata/ (开发板上)
cp ec_stmmac.ko /userdata/ (开发板上)
#加载驱动
insmod /userdata/phylink.ko
insmod /userdata/pcs-xpcs.ko
insmod /userdata/ec_master.ko main_devices=62:36:B8:01:5B:59(这个是你的网口的物理地 址,可以通过ifconfig命令查看)
insmod /userdata/ethercat_out/ec_stmmac.ko
#调整soc为性能模式
echo performance | tee $ (find /sys/ -name *governor)
EtherCAT IgH应用部分
EtherCAT IgH应用部分需要根据具体的伺服器来编写,需要使用上面用户态编译出来的EtherCAT IgH工具获取一些伺服驱动器的配置信息,然后完成应用代码的开发。具体可添加触觉智能客服微信13423856106,获取EtherCAT IgH应用部分开发指导。
EtherCAT IgH工具介绍
使用ethercat --help命令可以查看EtherCAT IgH工具,这些工具可以查看与主站连接的从站的各种信息, 可以有助于主站应用程序的编写,下面介绍几种常用的命令和参数的使用,其中[]中为必选参数, <>为 可选参数。
以c语言的形式输出pdo信息(ethercat cstruct)
/* Master 0, Slave 0
* Vendor ID: 0x00000a79
* Product code: 0x00002000
* Revision number: 0x00000001
*/
ec_pdo_entry_info_t slave_0_pdo_entries[] = {
{0x603f, 0x00, 16}, /* ErrorCode */
{0x6041, 0x00, 16}, /* StatusWord */
{0x6064, 0x00, 32}, /* Position actual value */
{0x60fd, 0x00, 32}, /* Digital inputs */
{0x6061, 0x00, 8}, /* Modes of operation display */
{0x6040, 0x00, 16}, /* ControlWord */
{0x6060, 0x00, 8}, /* Modes of operation */
{0x607a, 0x00, 32}, /* Target position */
{0x6081, 0x00, 32}, /* Profile velocity */
{0x6099, 0x01, 32}, /* Search Switch */
{0x6099, 0x02, 32}, /* Search Zero */
{0x6040, 0x00, 16},
{0x607a, 0x00, 32},
{0x60ff, 0x00, 32},
{0x6060, 0x00, 8},
{0x0000, 0x00, 8}, /* Gap */
{0x6041, 0x00, 16},
{0x6064, 0x00, 32},
{0x606c, 0x00, 32},
{0x6061, 0x00, 8},
{0x0000, 0x00, 8}, /* Gap */
};
ec_pdo_info_t slave_0_pdos[] = {
{0x1a01, 5, slave_0_pdo_entries + 0}, /* TxPDO 2 */
{0x1601, 6, slave_0_pdo_entries + 5}, /* RxPDO 2 */
{0x1600, 5, slave_0_pdo_entries + 11},
{0x1a00, 5, slave_0_pdo_entries + 16},
};
ec_sync_info_t slave_0_syncs[] = {
{0, EC_DIR_OUTPUT, 2, slave_0_pdos + 0, EC_WD_DISABLE},
{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
{2, EC_DIR_OUTPUT, 1, slave_0_pdos + 2, EC_WD_ENABLE},
{3, EC_DIR_INPUT, 1, slave_0_pdos + 3, EC_WD_DISABLE},
{0xff}
};
0 0:0 PREOP + 0x000001dd:0x10305070
输出pdo信息(ethercat pdos)
SM0: PhysAddr 0x1000, DefaultSize 128, ControlRegister 0x26, Enable 1
RxPDO 0x1a01 "TxPDO 2"
PDO entry 0x603f:00, 16 bit, "ErrorCode"
PDO entry 0x6041:00, 16 bit, "StatusWord"
PDO entry 0x6064:00, 32 bit, "Position actual value"
PDO entry 0x60fd:00, 32 bit, "Digital inputs"
PDO entry 0x6061:00, 8 bit, "Modes of operation display"
RxPDO 0x1601 "RxPDO 2"
PDO entry 0x6040:00, 16 bit, "ControlWord"
PDO entry 0x6060:00, 8 bit, "Modes of operation"
PDO entry 0x607a:00, 32 bit, "Target position"
PDO entry 0x6081:00, 32 bit, "Profile velocity"
PDO entry 0x6099:01, 32 bit, "Search Switch"
PDO entry 0x6099:02, 32 bit, "Search Zero"
SM1: PhysAddr 0x1100, DefaultSize 128, ControlRegister 0x22, Enable 1
SM2: PhysAddr 0x1200, DefaultSize 12, ControlRegister 0x64, Enable 1
RxPDO 0x1600 ""
PDO entry 0x6040:00, 16 bit, ""
PDO entry 0x607a:00, 32 bit, ""
PDO entry 0x60ff:00, 32 bit, ""
PDO entry 0x6060:00, 8 bit, ""
PDO entry 0x0000:00, 8 bit, "Gap"
SM3: PhysAddr 0x1300, DefaultSize 19, ControlRegister 0x20, Enable 1
TxPDO 0x1a00 ""
PDO entry 0x6041:00, 16 bit, ""
PDO entry 0x6064:00, 32 bit, ""
PDO entry 0x606c:00, 32 bit, ""
PDO entry 0x6061:00, 8 bit, ""
PDO entry 0x0000:00, 8 bit, "Gap"
#设置别名地址(下面的例子代表设置位置0的别名修改为1)
ethercat alias -p 0 0
#设置别名地址(下面的例子代表别名0的别名修改为1)
ethercat alias -a 0 1
Ethercat IgH主站性能测试结论
触觉智能RK3506开发板1ms控制周期内,性能数据如下:
触觉智能RK3506星闪开发板,如需选购,马云家 搜索 触觉智能官方企业店
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。