Ethercat解析(十三)之fsm_master状态机
程序员文章站
2024-03-19 18:22:52
...
1. fsm_master结构体
struct ec_fsm_master {
ec_master_t *master; /**< master the FSM runs on */
ec_datagram_t *datagram; /**< datagram used in the state machine */
unsigned int retries; /**< retries on datagram timeout. */
void (*state)(ec_fsm_master_t *); /**< master state function */
ec_device_index_t dev_idx; /**< Current device index (for scanning etc.).
*/
int idle; /**< state machine is in idle phase */
unsigned long scan_jiffies; /**< beginning of slave scanning */
uint8_t link_state[EC_MAX_NUM_DEVICES]; /**< Last link state for every
device. */
unsigned int slaves_responding[EC_MAX_NUM_DEVICES]; /**< Number of
responding slaves
for every device. */
unsigned int rescan_required; /**< A bus rescan is required. */
ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]; /**< AL states of
responding slaves for
every device. */
ec_slave_t *slave; /**< current slave */
ec_sii_write_request_t *sii_request; /**< SII write request */
off_t sii_index; /**< index to SII write request data */
ec_sdo_request_t *sdo_request; /**< SDO request to process. */
ec_fsm_coe_t fsm_coe; /**< CoE state machine */
ec_fsm_soe_t fsm_soe; /**< SoE state machine */
ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */
ec_fsm_change_t fsm_change; /**< State change state machine */
ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */
ec_fsm_slave_scan_t fsm_slave_scan; /**< slave state machine */
ec_fsm_sii_t fsm_sii; /**< SII state machine */
};
2.函数调用关系
以IDLE为例,状态机周期调用关系如下图所示:
其中ec_master_idle_thread()的调用周期与系统滴答时间有关:
//send interval in IDLE phase
ec_master_set_send_interval(master, 1000000/HZ);