Domanda

Abbiamo un'architettura semplice:

  1. Chip principale (basato su arm9)
  2. Controller PIC

Il PIC comunica con ARM tramite un protocollo di comunicazione I2C basato su interrupt per il trasferimento di dati. All'interno dell'interrupt segnaliamo un'attività che legge i dati dal livello I2C (bus).

Nel caso in cui i dati siano limitati, di solito non avremo molti problemi a leggere i dati e inviarli al livello superiore. Nel caso in cui questi dati siano molto grandi, l'interrupt verrà legato per lungo tempo.

La prima domanda è:

  1. Ho ragione?

  2. Nel caso avessi ragione, come evitare lo stesso? ... o possiamo una soluzione diversa?

È stato utile?

Soluzione

Avere una sorta di 'thread di lavoro', a volte chiamato thread del kernel, il cui compito è estrarre i dati dall'interfaccia I2C e bufferizzarli, distribuirli ad altre parti del sistema, ecc. Utilizzare la routine di interrupt solo per sbloccare il thread del kernel. In questo modo, se ci sono altri compiti che il sistema deve svolgere, il gestore di interruzione non gli impedisce di farlo e si ottiene comunque i dati dal dispositivo in modo tempestivo.

Altri suggerimenti

Non dovresti leggere un pacchetto completo in un'unica esecuzione della routine di interrupt. A seconda del supporto hardware, è necessario gestire un campione / bit / byte, archiviare i dati in un buffer e segnalare l'attività solo quando il pacchetto è completo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top