Jeg leter etter (rimelig enkel å bruke og godt testet) alternativer til Wire
bibliotek. Wire
fungerer veldig bra, men: Jeg trenger bare Arduino for å fungere som I2C-mester, og Wire
biblioteket ser ut til å være et virkelig sløsing med ressurser:
Mitt mål er å sende ut data en bloc (f.eks. 32 eller 64 byte). Disse dataene sitter allerede i en matrise i SRAM. Nå når du bruker Wire
-biblioteket, kaller du TwoWire::write
-funksjonen som kopierer dataene dine til en andre buffer. Etterpå bruker Wire
TWI
biblioteket der twi_writeTo
kopierer dataene igjen til en 3. buffer. At «litt klumpete, ikke sant?
Jeg har sett DSSCircuits / I2C-Master-Library , men jeg er ikke sikker hvor modent det er fordi det ikke har vært noen forpliktelse etter den første forpliktelsen som er 3 år nå.
Kommentarer
- Har du faktisk problemer med rambruk? Optimalisering av noe før det blir et problem er ofte en bortkastet innsats.
- Alt kommer ned på spørsmålet om å ønske å få det til å fungere snart og / eller bærbart mot å ønske å få det til å fungere optimalt . Du er selvfølgelig fri til å få ATmega-programmereren ' s manual og skrive til periferien registrerer deg selv.
- dsscircuits ' Arduino I2C masterbibliotek nettside viser fem revisjoner av I2C biblioteket som github-lenken din er til. Det er sannsynligvis et ok utgangspunkt for revisjonene du har i tankene. Hvis Wire har hatt rettelser siden januar 2012, kan det hende du trenger å legge dem til I2C.
- > Alternativer til Wire-biblioteket for I2C skriv ditt eget. i2c er en av de enklere protokollene å skrive fra bunnen av.
Svar
Jeg ser ikke noe innvending til å bruke DSS Circuits I2C Master Library .
Det har kanskje ikke blitt oppdatert på et par år, men hvis det fungerer fungerer det ikke » t trenger å være. Det er ikke som om biblioteker for mikrokontroller må støtte nye skriverdrivere, videodrivere osv.
Hvis det fungerer, fungerer det.
Brikken har ikke endret seg. , og den eneste virkelige årsaken til oppdateringer i disse dager, er hvis IDE endres (eller kompilatoren endres) på en slik måte at den introduserer kompileringsfeil. Slike ting har skjedd ganske nylig med for eksempel at PROGMEM har strammere regler.
Kommentarer
- Dette biblioteket så veldig lovende ut, men merk det gjør støtter bare AVR-mål. Siden Arduino-kjerner er utviklet for en rekke arkitekturer, vil ikke dette biblioteket " bare fungere " for noe Arduino-kompatibelt kort. For eksempel er den ikke kompatibel med Adafruit ' s STM32F405-basert fjær
Svar
Også Procyon AVR-bibliotek er verdt å sjekke. Den er litt gammel nå, men veldig profesjonell og ganske minimalistisk. Ikke mye avhengighet, det skal være greit å bare bruke I2C-modulen. Det er knapt noe nytt i AVR I2C-delen siden.
Svar
Cosa TWI -klassen er en helt annen tilnærming til I2C-enhetsdriverstøtte. Det bruker ikke noe ekstra SRAM for buffere i det hele tatt. Hvis en enhetsdriver ikke blokkerer, må den håndtere den nødvendige buffringen. Cosa TWI-klassen støtter også typisk interaksjon med I2C-enheter som master / slave, «skriv registerleste data» -mønstre og transaksjoner når du bruker multi-threading.
En programvare og maskinvare Arduino-TWI bibliotek er tilgjengelig. Den bruker Arduino-GPIO-biblioteket og kan brukes på AVR- og SAM-baserte kort.
Noen eksempler: TWI Scanner , DS3231 sanntidsklokke / kalender , I2C LCD-adapter med PCF8574 .
Svar
Jeg laget 2 libs selv for enklere bruk og konsekvente samtaler:
en for AVR-mål:
cI2C
en annen som bruker de samme funksjonene for alle andre mål (som i utgangspunktet er en innpakning for Wire-biblioteket):
WireWrapper
Begge er tilgjengelige i IDE-biblioteksjefen.
De jobber begge som master uten å bruke avbrudd og blir testet på forskjellige mål med forskjellige slaver:
– UNO, Nano for cI2C
– Zero, Due & ESP8266 for WireWrapper
Svar
Du kan bruke en helt annen tilnærming til toppspørsmålet.Be om alternativer du har gitt grunn til dette: bli kvitt ubrukt kode i binærfilen. Du kan oppnå fjerning av ubrukt kode uten å bruke alternativt bibliotek. Vær oppmerksom på at du kan instruere kompilatoren og linkeren om å ekskludere ubrukt kode fra den kompilerte binæren. Bare bruk kompilasjonsflagg:
CFLAGS += -Wl,-static CFLAGS += -ffunction-sections CFLAGS += -Wl,--gc-sections
Rach-funksjonen vil være i sin egen seksjon.
LDFLAGS += -Wl,-gc-sections
Dette ber GCC sende flagget -gc-seksjoner til linkeren som vil fjerne ubrukte seksjoner. Og voilla! Ubrukte seksjoner fjernes.