【原创】IgH EtherCAT主站详解(十一)--主站启动配置流程
启动配置流程
4.1 — 从 insmod 加载到所有从站进入 OP 的完整流程
概览
EtherCAT 主站启动全景
EtherCAT 主站的启动过程可以概括为 5 个阶段:从内核模块加载开始,经过设备绑定、总线扫描、从站配置,最终进入实时运行阶段。整个过程由内核线程和状态机自动驱动,应用程序只需在适当的时机调用 ecrt API 接管控制权。
五阶段启动流程
阶段 1: 内核模块加载 (
insmod) → 分配主站实例
阶段 2: 网卡设备绑定 → ORPHANED → IDLE
阶段 3: 总线扫描 + 从站识别 → EEPROM + PDO
阶段 4: 从站配置 → Init → Pre-Op → Safe-Op → Op
阶段 5: 应用激活 → IDLE → OPERATION (实时通信)
启动流程总图
技术详情
阶段 1: 内核模块加载
通过 insmod ec_master.ko main_devices=XX:XX:XX:XX:XX:XX 加载主站模块。
ec_init_module()执行流程:
- 注册字符设备区域 (
alloc_chrdev_region)- 创建设备类
/sys/class/EtherCAT/- 解析 MAC 地址参数(主网卡 + 备用网卡)
- 为每个主站调用
ec_master_init():初始化锁、设备、FSM、链表、字符设备- 主站进入 ORPHANED 阶段,等待网卡设备绑定
阶段 2: 网卡设备绑定
当网卡驱动的 probe 函数被调用时,IgH 适配代码调用 ecdev_offer() 将网卡设备与主站绑定:
阶段 3: 总线扫描
IDLE 线程启动后,Master FSM 自动开始总线监控。当检测到从站响应数量变化时,触发完整的拓扑扫描流程:
- BRD 广播: 读取寄存器 0x0130 获取在线从站数量
- 地址分配: 使用 APWR 为每个从站分配递增的站地址
- DC 延迟测量: 测量每个从站的传播延迟
- 从站扫描: Slave Scan FSM 逐个扫描从站(读 EEPROM、构建 PDO 映射)
详见 4.2 拓扑扫描流程
阶段 4: 从站配置
扫描完成后,Master FSM 自动触发从站配置流程,将每个从站从 Init 状态推进到目标状态。
并行配置: 每个从站有独立的 Slave FSM,从站之间无耦合关系。所有从站的
Init → Pre-Op → Safe-Op → Op过程各自独立执行,互不阻塞。
阶段 5: 应用激活与实时运行
应用程序通过 ecrt API 激活主站:
| 步骤 | API 调用 | 作用 |
|---|---|---|
| 1 | ecrt_master_create() |
打开主站字符设备 |
| 2 | ecrt_master_create_domain() |
创建过程数据域 |
| 3 | ecrt_master_slave_config() |
获取从站配置句柄 |
| 4 | ecrt_slave_config_pdos() |
注册 PDO 映射 |
| 5 | ecrt_domain_reg_pdo_entry() |
注册 PDO 入口,获取偏移 |
| 6 | ecrt_master_activate() |
激活主站 → IDLE→OPERATION |
| 7 | ecrt_domain_data() |
获取过程数据内存指针 |
| 8 | ecrt_master_send/receive() |
周期性收发过程数据 |
IDLE 线程 vs OPERATION 线程
| 特性 | IDLE 线程 | OPERATION 线程 |
|---|---|---|
| 函数 | ec_master_idle_thread() |
ec_master_operation_thread() |
| 运行阶段 | IDLE | OPERATION |
| 收发控制 | 线程自行收发 | 由应用程序回调控制 |
| 调度优先级 | 普通 (SCHED_OTHER) | 实时 (SCHED_FIFO/RT) |
| 主要工作 | 扫描从站 + 配置从站 | 执行 FSM + 统计输出 |
| 收发回调 | ec_master_internal_send/receive_cb |
app_send/receive_cb |
深入源码
ec_init_module() — 模块加载入口
位置: master/module.c:112–187
核心流程:
alloc_chrdev_region()注册字符设备号class_create("EtherCAT")创建 sysfs 设备类- 解析
main_devices[]和backup_devices[]MAC 地址参数- 为每个主站调用
ec_master_init(&masters;[i], i, main_mac, backup_mac, ...)- 所有主站初始状态为
EC_ORPHANED
ec_master_init() — 主站初始化
位置: master/master.c:140–411
初始化所有互斥锁 (master_sem, device_sem, io_sem)、设备、FSM、外部数据报环形缓冲、字符设备、链表头等。
ec_master_enter_idle_phase() — 进入 IDLE 阶段
位置: master/master.c:771–820
关键步骤:
- 安装内部收发回调 (
ec_master_internal_send/receive_cb)- 设置
master->phase = EC_IDLE- 重置
slaves_responding[]以触发首次扫描- 创建 EoE 接口(如果配置了
eoe_interfaces)- 启动
EtherCAT-IDLE内核线程
ec_master_idle_thread() — IDLE 线程主循环
位置: master/master.c:1926–1987
ec_master_enter_operation_phase() — 进入 OPERATION 阶段
位置: master/master.c:852–917
关键步骤:
- 等待从站配置完成 (
config_busy清零)- 等待扫描完成 (
scan_busy清零)- 禁止新的扫描 (
allow_scan = 0)- 将所有在线从站请求设置为
PREOP- 设置
master->phase = EC_OPERATION- 清空应用回调指针(由
ecrt_master_activate()设置)
ecrt_master_activate() — 应用激活
位置: master/master.c:2880–3060
由用户空间库 lib/master.c:ecrt_master_activate() 通过 ioctl 调用。
- 冻结从站配置(不允许新的配置请求)
- 为每个 Domain 分配 FMMU、计算逻辑地址偏移
- 为每个 Domain 分配过程数据内存
- 调用
ec_master_enter_operation_phase()切换到 OPERATION - 启动 EoE 线程(如有)
- 启动
EtherCAT-OP内核线程
ec_master_operation_thread() — OPERATION 线程
位置: master/master.c:1993–2064
与 IDLE 线程的关键区别:不自行收发数据(由应用程序回调控制),使用 hrtimer 高精度定时,Slave FSM 由应用层或内核线程调度(取决于 rt_slave_requests)。

浙公网安备 33010602011771号