IgH EtherCAT Master 学习笔记
架构:内核模块 + 用户态库的双层架构:内核态部分:以内核模块形式运行,直接接管一块以太网网卡,在内核空间完成帧的实时收发、EtherCAT 状态机(Init/Pre-Op/Safe-Op/Op)维护,以及周期性的过程数据(PDO)刷新。之所以放进内核,是因为只有这样才能绕开 Linux 网络协议栈的调度延迟和不确定性,配合实时内核(如 PREEMPT_RT)才能实现微秒级的稳定周期。
用户态部分:应用程序不会直接操作网卡或内核模块,而是通过一套用户态 API 来请求主站句柄、配置每个从站要用到的 PDO 映射,创建“域(Domain)”——一块与内核共享的进程数据内存,每个控制周期调用一次读写函数,收发这块内存里的数据。
笔记:网卡 → Linux → IgH 的软件层次:Ethernet硬件->st_gmac->eth0->ec_generic->ec_master->Slave
配置:主站生命周期与配置流程:请求主站(Request Master),获取从站配置(Slave Configuration),注册 PDO 映射到域(Domain Registration),激活主站(Activate Master),进入周期性循环。
单周期内:实时循环的时序模型:周期驱动方式:IgH 本身不负责“帮你定时”,应用程序必须自己起一个高精度定时循环。每周期的标准动作序列,且顺序不能颠倒:ecrt_master_receive(),ecrt_domain_process(),应用业务逻辑,ecrt_domain_queue(),ecrt_master_send()。
实时:实时任务的调度策略与隔离:必须用 sched_setscheduler() 把控制循环所在的线程设置为 SCHED_FIFO(先入先出的实时调度类),并给一个较高的优先级(比如 80-99),这样只要这个线程处于可运行状态,调度器就会立刻抢占普通进程去运行它;用 taskset 或 sched_setaffinity() 把实时循环绑定到一个专用的 CPU 核心上,并且在内核启动参数里用 isolcpus= 把这个核心从通用调度池里隔离出去,不让其他普通进程和中断处理程序跑上去抢占;mlockall(MCL_CURRENT | MCL_FUTURE),把进程当前和未来分配的所有内存都锁在物理内存里,杜绝换页延迟。
多轴:多从站配置与差异化 PDO 管理:从站的两种定位方式:Position(位置)与 Alias(别名);异构从站的差异化配置:如果总线上挂的是不同厂家、不同型号的从站,怎么对每一个从站分别调用 ecrt_master_slave_config() 拿到独立的配置句柄,分别为每个句柄配置各自的 PDO 映射(ecrt_slave_config_pdos()),最后统一注册进同一个(或按需拆分成多个)域。
