Arduino UNO R4 - FreeRTOS Time Slicing

Dato che le due piccole funzioni che ho scritto, nell'uso del I2C vengono chiamate praticamente in continuazione, ho cercato di ridurre ancora il numero di cicli macchina necessari eliminando la chiamata ad una funzione di FreeRTOS™ (quella che verifica se lo scheduler e sospeso), sostituendola con un semplice test di una flag, così da risparmiare quel po' di cicli macchina che occorrono per entrare ed uscire da una funzione.

Sempre per ragioni di velocità, ho sprecato, per una flag, un uint32_t dato che, sull'architettura Cortex M4, è il tipo dato che per la sua manipolazione richiede il minor numero di cicli macchina fondamentalmente per tre motivi:

  1. Allineamento all'architettura
  2. Accesso alla memoria ottimizzato
  3. Efficienza nelle operazioni matematiche

Per cui, la parte relativa alle due piccole funzioni da me scritte, diventa:

/* -------------------------------------------------------------------- gpb01 */

static uint32_t schedulerIsSupended = 0;          /* Most efficient data type */

static inline void disableScheduler (void) {
#if defined (INC_ARDUINO_FREERTOS_H) || defined (INC_FREERTOS_H)
  if ( xTaskGetSchedulerState( ) == taskSCHEDULER_RUNNING ) {
    schedulerIsSupended = 0xffffffff;
    vTaskSuspendAll();
    return;
  } else return;
#else
  return;
#endif
}

static inline void resumeScheduler (void) {
#if defined (INC_ARDUINO_FREERTOS_H) || defined (INC_FREERTOS_H)
  if ( schedulerIsSupended != 0 ) {
    schedulerIsSupended = 0;
    if( !xTaskResumeAll() ) {
      taskYIELD ();
    }
    return;
  } else return;
#else
  return;
#endif
}

/* -------------------------------------------------------------------- gpb01 */

Ovviamente il risparmio è di pochi cicli macchina, ma, dato che queste due piccole funzioni sono richiamate in continuazione quando si utilizza la libreria, alla fine comunque il tempo risparmiato non è trascurabile :wink:

Allego la versione modificata della libreria: R4_Wire.zip (8.4 KB) .

Come sempre, se riscontrate problemi, o se avete una soluzione migliore, fatemelo sapere.

Guglielmo

1 Like