(System) Hook per le librerie incorporate

3

Con l'impossibilità di entrare in molti dettagli, immagina la seguente situazione:

Stai sviluppando una libreria che deve essere eseguita su varie piattaforme incorporate (AVR, ARM, ecc.). Alcune funzionalità di detta libreria richiedono una sorta di mantenimento del tempo (non un tempo effettivo ma sulla falsariga di "ora è x (mili) secondi dopo l'ultima volta che siamo stati chiamati).

Quando non è disponibile alcun sistema operativo, non è garantito che qualsiasi funzione che può fornire questa funzionalità sia implementata (non con un nome universale, almeno). Quale sarebbe la migliore pratica per fornire questa funzionalità?

  • Devo implementare solo l'intestazione della funzione e richiedere l'applicazione utilizzando la libreria per implementarla?
  • Creo una routine init a cui viene passato un puntatore a funzione?
  • Qualcos'altro?

Grazie in anticipo.

    
posta Michel Megens 15.12.2017 - 14:17
fonte

2 risposte

2

Ho usato entrambi i tuoi approcci suggeriti nel percorso. Per la tua funzione di cronometraggio, di solito la documenterei in questo modo nel file di intestazione pubblico:

/*!
 * Platform-specific time-keeping support for mylib.
 *
 * This is used internally by mylib for reasons X, Y, and Z.
 *
 * @return  The number of milliseconds since this function was last called.
 *          -1 will be returned on the first call.
 *
 * @note    The hosting application must implement this function and is
 *          responsible for ensuring any necessary platform-specific
 *          initialization has taken place.
 */
int32_t mylib_get_elapsed_time(void);

Una cosa da considerare su questo approccio è che può introdurre alcune dipendenze compilate e / o link-time. Se si desidera distribuire questa libreria in forma di oggetto, ciò potrebbe non essere desiderabile. L'approccio di utilizzare una funzione init e richiedere al client di passare un puntatore alla sua versione di mylib_get_elapsed_time durante l'inizializzazione può ridurre o eliminare tali problemi. Potrebbe anche essere più semplice garantire che l'inizializzazione specifica della piattaforma venga eseguita prima che la libreria venga utilizzata.

Potresti anche prendere in considerazione la creazione / il raggruppamento di versioni di questa funzione per le piattaforme principali / comuni a cui ti rivolgi, con la possibilità per gli altri di contribuire. Ad esempio, potresti avere una directory platforms nell'albero dei sorgenti che può contenere implementazioni testate di questa funzione (e altre simili che hanno implementazioni specifiche della piattaforma).

    
risposta data 16.12.2017 - 20:31
fonte
0

È chiaro che alcuni aspetti della libreria devono essere dinamici, il che significa che il suo comportamento dipende da alcuni aspetti esterni, indipendentemente dal nome di una libreria da aggiungere o dal nome di una classe da istanziare.

È davvero solo una questione di quale aspetto del tuo sarà dinamico.

Ho incontrato questo tipo di problema prima di utilizzare Java, e dal momento che Java non è specifico per la piattaforma, è possibile eseguirlo potenzialmente su qualsiasi sistema operativo che supporti Java. Ovviamente non tutte le funzionalità sono disponibili in tutti i sistemi operativi, quindi è necessario essere in grado di adattare il programma in modo intelligente in base al sistema operativo.

L'approccio che ho preso è stato quello di usare classpath come fattore esterno dinamico. Secondo il sistema operativo presente, includerebbe la libreria principale (jar) e una libreria aggiuntiva scritta appositamente per quel particolare sistema operativo in cui è stata installata (il file batch che avvia il programma è quasi certamente specifico per piattaforma, quindi quale posto migliore per posizionare questo particolare cambiamento specifico della piattaforma?). Java ha in pratica un utile ServiceLoader progettato per consentire ad altre librerie di implementare interfacce nel tuo barattolo principale .

La tua libreria principale può chiamarli come interfaccia senza sapere chi o come è implementata, e la tua libreria aggiuntiva può eseguire meccanismi di temporizzazione, se disponibili. Se non è disponibile alcuna implementazione dell'interfaccia, disporre di un meccanismo di fallback per quando i meccanismi di temporizzazione non sono possibili.

Potresti non utilizzare Java, ma questa idea è relativamente facile da estendere ad altre lingue con un po 'di riflessione. Utilizzare un parametro passato al programma come nome della classe di implementazione per il meccanismo di temporizzazione. Se un parametro viene passato, prova ad istanziare una nuova istanza di esso dinamicamente e sei pronto per partire. Assicurati di includere un riferimento alla tua libreria esterna quando avvii il tuo programma.

Certamente vorrete separare la funzionalità principale dal plugin, ma se fatto in questo modo, potreste facilmente aggiornare / estendere il plugin senza dover mai toccare il programma principale.

    
risposta data 15.12.2017 - 15:05
fonte