mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-08 12:51:52 +08:00
Avoided casting-away constness in expected working counter calculation.
This commit is contained in:
@@ -96,8 +96,9 @@ void ec_domain_clear_data(
|
||||
ec_domain_t *domain /**< EtherCAT domain. */
|
||||
)
|
||||
{
|
||||
if (domain->data_origin == EC_ORIG_INTERNAL && domain->data)
|
||||
if (domain->data_origin == EC_ORIG_INTERNAL && domain->data) {
|
||||
kfree(domain->data);
|
||||
}
|
||||
domain->data = NULL;
|
||||
domain->data_origin = EC_ORIG_INTERNAL;
|
||||
}
|
||||
@@ -137,7 +138,7 @@ int ec_domain_add_datagram(
|
||||
uint32_t logical_offset, /**< Logical offset. */
|
||||
size_t data_size, /**< Size of the data. */
|
||||
uint8_t *data, /**< Process data. */
|
||||
const unsigned int used[] /**< Used by inputs/outputs. */
|
||||
const unsigned int used[] /**< Slave config counter for in/out. */
|
||||
)
|
||||
{
|
||||
ec_datagram_t *datagram;
|
||||
@@ -187,6 +188,35 @@ int ec_domain_add_datagram(
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Domain finish helper function.
|
||||
*
|
||||
* Detects, if a slave configuration has already been taken into account for
|
||||
* a datagram's expected working counter calculation.
|
||||
*
|
||||
* Walks through the list of all FMMU configurations for the current datagram
|
||||
* and ends before the current datagram.
|
||||
*/
|
||||
int shall_count(
|
||||
const ec_fmmu_config_t *cur_fmmu, /**< Current FMMU with direction to
|
||||
search for. */
|
||||
const ec_fmmu_config_t *first_fmmu /**< Datagram's first FMMU. */
|
||||
)
|
||||
{
|
||||
for (; first_fmmu != cur_fmmu;
|
||||
first_fmmu = list_entry(first_fmmu->list.next,
|
||||
ec_fmmu_config_t, list)) {
|
||||
|
||||
if (first_fmmu->sc == cur_fmmu->sc
|
||||
&& first_fmmu->dir == cur_fmmu->dir) {
|
||||
return 0; // was already counted
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Finishes a domain.
|
||||
*
|
||||
* This allocates the necessary datagrams and writes the correct logical
|
||||
@@ -207,7 +237,7 @@ int ec_domain_finish(
|
||||
unsigned int datagram_count;
|
||||
unsigned int datagram_used[EC_DIR_COUNT];
|
||||
ec_fmmu_config_t *fmmu;
|
||||
ec_fmmu_config_t *fmmu_temp;
|
||||
const ec_fmmu_config_t *datagram_first_fmmu = NULL;
|
||||
const ec_datagram_t *datagram;
|
||||
int ret;
|
||||
|
||||
@@ -223,32 +253,31 @@ int ec_domain_finish(
|
||||
}
|
||||
}
|
||||
|
||||
// Cycle through all domain FMMUS and
|
||||
// Cycle through all domain FMMUs and
|
||||
// - correct the logical base addresses
|
||||
// - set up the datagrams to carry the process data
|
||||
// - calculate the datagrams' expected working counters
|
||||
datagram_offset = 0;
|
||||
datagram_size = 0;
|
||||
datagram_count = 0;
|
||||
datagram_used[EC_DIR_OUTPUT] = 0;
|
||||
datagram_used[EC_DIR_INPUT] = 0;
|
||||
|
||||
list_for_each_entry(fmmu_temp, &domain->fmmu_configs, list) {
|
||||
// we have to remove the constness, sorry FIXME
|
||||
ec_slave_config_t *sc = (ec_slave_config_t *) fmmu_temp->sc;
|
||||
sc->used_for_fmmu_datagram[fmmu_temp->dir] = 0;
|
||||
if (!list_empty(&domain->fmmu_configs)) {
|
||||
datagram_first_fmmu =
|
||||
list_entry(domain->fmmu_configs.next, ec_fmmu_config_t, list);
|
||||
}
|
||||
|
||||
list_for_each_entry(fmmu, &domain->fmmu_configs, list) {
|
||||
|
||||
// Correct logical FMMU address
|
||||
fmmu->logical_start_address += base_address;
|
||||
fmmu->domain_address += base_address;
|
||||
|
||||
// Increment Input/Output counter to determine datagram types
|
||||
// Increment input/output counter to determine datagram types
|
||||
// and calculate expected working counters
|
||||
if (fmmu->sc->used_for_fmmu_datagram[fmmu->dir] == 0) {
|
||||
ec_slave_config_t *sc = (ec_slave_config_t *)fmmu->sc;
|
||||
if (shall_count(fmmu, datagram_first_fmmu)) {
|
||||
datagram_used[fmmu->dir]++;
|
||||
sc->used_for_fmmu_datagram[fmmu->dir] = 1;
|
||||
}
|
||||
|
||||
// If the current FMMU's data do not fit in the current datagram,
|
||||
@@ -260,15 +289,13 @@ int ec_domain_finish(
|
||||
datagram_used);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
datagram_offset += datagram_size;
|
||||
datagram_size = 0;
|
||||
datagram_count++;
|
||||
datagram_used[EC_DIR_OUTPUT] = 0;
|
||||
datagram_used[EC_DIR_INPUT] = 0;
|
||||
list_for_each_entry(fmmu_temp, &domain->fmmu_configs, list) {
|
||||
ec_slave_config_t *sc = (ec_slave_config_t *)fmmu_temp->sc;
|
||||
sc->used_for_fmmu_datagram[fmmu_temp->dir] = 0;
|
||||
}
|
||||
datagram_first_fmmu = fmmu;
|
||||
}
|
||||
|
||||
datagram_size += fmmu->tx_size;
|
||||
@@ -337,7 +364,7 @@ const ec_fmmu_config_t *ec_domain_find_fmmu(
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Realtime interface
|
||||
* Application interface
|
||||
*****************************************************************************/
|
||||
|
||||
int ecrt_domain_reg_pdo_entry_list(ec_domain_t *domain,
|
||||
|
||||
@@ -77,8 +77,6 @@ void ec_slave_config_init(
|
||||
ec_sync_config_init(&sc->sync_configs[i]);
|
||||
|
||||
sc->used_fmmus = 0;
|
||||
sc->used_for_fmmu_datagram[EC_DIR_INPUT] = 0;
|
||||
sc->used_for_fmmu_datagram[EC_DIR_OUTPUT] = 0;
|
||||
sc->dc_assign_activate = 0x0000;
|
||||
sc->dc_sync[0].cycle_time = 0x00000000;
|
||||
sc->dc_sync[1].cycle_time = 0x00000000;
|
||||
|
||||
@@ -135,9 +135,6 @@ struct ec_slave_config {
|
||||
configurations. */
|
||||
ec_fmmu_config_t fmmu_configs[EC_MAX_FMMUS]; /**< FMMU configurations. */
|
||||
uint8_t used_fmmus; /**< Number of FMMUs used. */
|
||||
unsigned int used_for_fmmu_datagram[EC_DIR_COUNT]; /**< Number of FMMUs
|
||||
used for process data
|
||||
exchange datagrams. */
|
||||
uint16_t dc_assign_activate; /**< Vendor-specific AssignActivate word. */
|
||||
ec_sync_signal_t dc_sync[EC_SYNC_SIGNAL_COUNT]; /**< DC sync signals. */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user