# HG changeset patch # User Florian Pose # Date 1354627441 -3600 # Node ID 71d38ff288b3ccd79840a83c0b7c2e3f53a55417 # Parent 5fc035788a3a3d50819e8bc0dbfd12567958b16b Improved preprocessor macro usage reg. redundancy. diff -r 5fc035788a3a -r 71d38ff288b3 master/domain.c --- a/master/domain.c Tue Dec 04 14:09:49 2012 +0100 +++ b/master/domain.c Tue Dec 04 14:24:01 2012 +0100 @@ -452,106 +452,101 @@ void ecrt_domain_process(ec_domain_t *domain) { uint16_t wc_sum[EC_MAX_NUM_DEVICES] = {}, redundant_wc, wc_total; - ec_datagram_pair_t *pair; - ec_datagram_t *main_datagram; - uint32_t logical_datagram_address; - size_t datagram_size; - uint16_t datagram_pair_wc; unsigned int dev_idx, wc_change; -#if EC_MAX_NUM_DEVICES > 1 - ec_fmmu_config_t *fmmu = - list_first_entry(&domain->fmmu_configs, ec_fmmu_config_t, list); -#endif unsigned int redundancy; #if DEBUG_REDUNDANCY EC_MASTER_DBG(domain->master, 1, "domain %u process\n", domain->index); #endif - list_for_each_entry(pair, &domain->datagram_pairs, list) { - - main_datagram = &pair->datagrams[EC_DEVICE_MAIN]; - logical_datagram_address = EC_READ_U32(main_datagram->address); - datagram_size = main_datagram->data_size; +#if EC_MAX_NUM_DEVICES > 1 + if (ec_master_num_devices(domain->master) > 1) { + ec_datagram_pair_t *pair; + ec_fmmu_config_t *fmmu = + list_first_entry(&domain->fmmu_configs, ec_fmmu_config_t, list); + + list_for_each_entry(pair, &domain->datagram_pairs, list) { + ec_datagram_t *main_datagram = &pair->datagrams[EC_DEVICE_MAIN]; + uint32_t logical_datagram_address = + EC_READ_U32(main_datagram->address); + size_t datagram_size = main_datagram->data_size; + uint16_t datagram_pair_wc; #if DEBUG_REDUNDANCY - EC_MASTER_DBG(domain->master, 1, "dgram %s log=%u\n", - main_datagram->name, logical_datagram_address); -#endif - - datagram_pair_wc = ec_datagram_pair_process(pair, wc_sum); - -#if EC_MAX_NUM_DEVICES > 1 - if (ec_master_num_devices(domain->master) < 2) { - continue; - } - - /* Redundancy: Go through all FMMU configs to detect data changes. */ - list_for_each_entry_from(fmmu, &domain->fmmu_configs, list) { - unsigned int datagram_offset; - ec_datagram_t *backup_datagram = - &pair->datagrams[EC_DEVICE_BACKUP]; - - if (fmmu->dir != EC_DIR_INPUT) { - continue; - } - - if (fmmu->logical_start_address >= - logical_datagram_address + datagram_size) { - // fmmu data contained in next datagram pair - break; - } - - datagram_offset = - fmmu->logical_start_address - logical_datagram_address; - -#if DEBUG_REDUNDANCY - EC_MASTER_DBG(domain->master, 1, - "input fmmu log=%u size=%u offset=%u\n", - fmmu->logical_start_address, fmmu->data_size, - datagram_offset); - if (domain->master->debug_level > 0) { - ec_print_data(pair->send_buffer + datagram_offset, - fmmu->data_size); - ec_print_data(main_datagram->data + datagram_offset, - fmmu->data_size); - ec_print_data(backup_datagram->data + datagram_offset, - fmmu->data_size); - } -#endif - - if (data_changed(pair->send_buffer, main_datagram, - datagram_offset, fmmu->data_size)) { - /* data changed on main link: no copying necessary. */ -#if DEBUG_REDUNDANCY - EC_MASTER_DBG(domain->master, 1, "main changed\n"); -#endif - } else if (data_changed(pair->send_buffer, backup_datagram, - datagram_offset, fmmu->data_size)) { - /* data changed on backup link: copy to main memory. */ -#if DEBUG_REDUNDANCY - EC_MASTER_DBG(domain->master, 1, "backup changed\n"); -#endif - memcpy(main_datagram->data + datagram_offset, - backup_datagram->data + datagram_offset, - fmmu->data_size); - } else if (datagram_pair_wc == pair->expected_working_counter) { - /* no change, but WC complete: use main data. */ -#if DEBUG_REDUNDANCY - EC_MASTER_DBG(domain->master, 1, "no change but complete\n"); -#endif - } else { - /* no change and WC incomplete: mark WC as zero to avoid - * data.dependent WC flickering. */ - datagram_pair_wc = 0; + EC_MASTER_DBG(domain->master, 1, "dgram %s log=%u\n", + main_datagram->name, logical_datagram_address); +#endif + + /* Redundancy: Go through FMMU configs to detect data changes. */ + list_for_each_entry_from(fmmu, &domain->fmmu_configs, list) { + unsigned int datagram_offset; + ec_datagram_t *backup_datagram = + &pair->datagrams[EC_DEVICE_BACKUP]; + + if (fmmu->dir != EC_DIR_INPUT) { + continue; + } + + if (fmmu->logical_start_address >= + logical_datagram_address + datagram_size) { + // fmmu data contained in next datagram pair + break; + } + + datagram_offset = + fmmu->logical_start_address - logical_datagram_address; + #if DEBUG_REDUNDANCY EC_MASTER_DBG(domain->master, 1, - "no change and incomplete\n"); -#endif + "input fmmu log=%u size=%u offset=%u\n", + fmmu->logical_start_address, fmmu->data_size, + datagram_offset); + if (domain->master->debug_level > 0) { + ec_print_data(pair->send_buffer + datagram_offset, + fmmu->data_size); + ec_print_data(main_datagram->data + datagram_offset, + fmmu->data_size); + ec_print_data(backup_datagram->data + datagram_offset, + fmmu->data_size); + } +#endif + datagram_pair_wc = ec_datagram_pair_process(pair, wc_sum); + + if (data_changed(pair->send_buffer, main_datagram, + datagram_offset, fmmu->data_size)) { + /* data changed on main link: no copying necessary. */ +#if DEBUG_REDUNDANCY + EC_MASTER_DBG(domain->master, 1, "main changed\n"); +#endif + } else if (data_changed(pair->send_buffer, backup_datagram, + datagram_offset, fmmu->data_size)) { + /* data changed on backup link: copy to main memory. */ +#if DEBUG_REDUNDANCY + EC_MASTER_DBG(domain->master, 1, "backup changed\n"); +#endif + memcpy(main_datagram->data + datagram_offset, + backup_datagram->data + datagram_offset, + fmmu->data_size); + } else if (datagram_pair_wc == + pair->expected_working_counter) { + /* no change, but WC complete: use main data. */ +#if DEBUG_REDUNDANCY + EC_MASTER_DBG(domain->master, 1, + "no change but complete\n"); +#endif + } else { + /* no change and WC incomplete: mark WC as zero to avoid + * data.dependent WC flickering. */ + datagram_pair_wc = 0; +#if DEBUG_REDUNDANCY + EC_MASTER_DBG(domain->master, 1, + "no change and incomplete\n"); +#endif + } } } + } #endif // EC_MAX_NUM_DEVICES > 1 - } redundant_wc = 0; for (dev_idx = EC_DEVICE_BACKUP;