Increment injection_seq on slave state changes

This commit is contained in:
Martin Troxler 2010-12-14 14:00:19 +01:00
parent 51a014f6f9
commit 53056753da
3 changed files with 16 additions and 22 deletions

View File

@ -94,19 +94,21 @@ void ec_fsm_slave_clear(
*
* If the state machine's datagram is not sent or received yet, the execution
* of the state machine is delayed to the next cycle.
*
* \return true, if the state machine was executed
*/
void ec_fsm_slave_exec(
int ec_fsm_slave_exec(
ec_fsm_slave_t *fsm /**< Slave state machine. */
)
{
if (fsm->datagram->state == EC_DATAGRAM_SENT
|| fsm->datagram->state == EC_DATAGRAM_QUEUED) {
// datagram was not sent or received yet.
return;
return 0;
}
fsm->state(fsm);
return;
return 1;
}
/*****************************************************************************/

View File

@ -67,7 +67,7 @@ struct ec_fsm_slave {
void ec_fsm_slave_init(ec_fsm_slave_t *, ec_slave_t *, ec_datagram_t *);
void ec_fsm_slave_clear(ec_fsm_slave_t *);
void ec_fsm_slave_exec(ec_fsm_slave_t *);
int ec_fsm_slave_exec(ec_fsm_slave_t *);
void ec_fsm_slave_ready(ec_fsm_slave_t *);
/*****************************************************************************/

View File

@ -1256,7 +1256,6 @@ static int ec_master_idle_thread(void *priv_data)
{
ec_master_t *master = (ec_master_t *) priv_data;
ec_slave_t *slave = NULL;
int fsm_exec;
size_t sent_bytes;
// send interval in IDLE phase
@ -1275,24 +1274,21 @@ static int ec_master_idle_thread(void *priv_data)
up(&master->io_sem);
if (master->injection_seq_rt == master->injection_seq_fsm) {
fsm_exec = 0;
// execute master & slave state machines
if (down_interruptible(&master->master_sem))
break;
fsm_exec = ec_fsm_master_exec(&master->fsm);
if (ec_fsm_master_exec(&master->fsm))
master->injection_seq_fsm++;
for (slave = master->slaves;
slave < master->slaves + master->slave_count;
slave++) {
ec_fsm_slave_exec(&slave->fsm);
if (ec_fsm_slave_exec(&slave->fsm))
master->injection_seq_fsm++;
}
up(&master->master_sem);
// queue and send
down(&master->io_sem);
if (fsm_exec) {
master->injection_seq_rt++;
}
}
// queue and send
down(&master->io_sem);
ecrt_master_send(master);
sent_bytes = master->main_device.tx_skb[
master->main_device.tx_ring_index]->len;
@ -1327,7 +1323,6 @@ static int ec_master_operation_thread(void *priv_data)
{
ec_master_t *master = (ec_master_t *) priv_data;
ec_slave_t *slave = NULL;
int fsm_exec;
EC_MASTER_DBG(master, 1, "Operation thread running"
" with fsm interval = %u us, max data size=%zu\n",
@ -1340,21 +1335,18 @@ static int ec_master_operation_thread(void *priv_data)
// output statistics
ec_master_output_stats(master);
fsm_exec = 0;
// execute master & slave state machines
if (down_interruptible(&master->master_sem))
break;
fsm_exec = ec_fsm_master_exec(&master->fsm);
if (ec_fsm_master_exec(&master->fsm))
master->injection_seq_fsm++;
for (slave = master->slaves;
slave < master->slaves + master->slave_count;
slave++) {
ec_fsm_slave_exec(&slave->fsm);
if (ec_fsm_slave_exec(&slave->fsm))
master->injection_seq_fsm++;
}
up(&master->master_sem);
// inject datagrams (let the rt thread queue them, see ecrt_master_send)
if (fsm_exec)
master->injection_seq_fsm++;
}
#ifdef EC_USE_HRTIMER