Szukam (dość łatwych w użyciu i dobrze przetestowanych) alternatyw dla Wire
biblioteka. Wire
działa bardzo dobrze, ale: potrzebuję tylko Arduino do działania jako master I2C, a biblioteka Wire
wydaje się być prawdziwym marnotrawstwem zasoby:
Moim celem jest wysłanie danych en bloc (np. 32 lub 64 bajty). Te dane już znajdują się w tablicy w SRAM. Teraz, gdy używasz biblioteki Wire
, wywołujesz funkcję TwoWire::write
, która kopiuje dane do drugiego bufora. Następnie Wire
korzysta z biblioteki TWI
, w której twi_writeTo
kopiuje dane ponownie do Trzeci bufor. To „trochę niezgrabne, prawda?”
Widziałem DSSCircuits / I2C-Master-Library , ale nie jestem pewien jakie to dojrzałe, ponieważ nie było żadnego zatwierdzenia po pierwszym zatwierdzeniu, które ma teraz 3 lata.
Komentarze
- Czy faktycznie masz problemy z użyciem pamięci RAM? Optymalizacja czegoś, zanim stanie się problemem, jest często zmarnowanym wysiłkiem.
- Wszystko sprowadza się do pytania, czy chcesz, aby to zadziałało wkrótce i / lub przenośnie a nie chcąc, aby działało optymalnie . Oczywiście możesz pobrać instrukcję ' programisty ATmega i napisać do urządzenia peryferyjnego rejestruje się samodzielnie.
- dsscircuits ' Główna biblioteka Arduino I2C strona przedstawia pięć wersji I2C biblioteka, do której jest przeznaczony Twój link na githubie. Prawdopodobnie jest to dobry punkt wyjścia dla zmian, o których myślisz. Jeśli Wire wprowadził poprawki od stycznia 2012 r., możesz trzeba dodać je do I2C.
- > Alternatywy dla biblioteki Wire dla I2C napisz własną. i2c to jeden z łatwiejszych protokołów do pisania od zera.
Odpowiedź
Nie widzę żadnych zastrzeżeń do korzystania z obwodów DSS Circuits I2C Master Library .
Być może nie była aktualizowana przez kilka lat, ale jeśli działa, to nie ” nie trzeba. To nie jest tak, że biblioteki dla mikrokontrolerów muszą obsługiwać nowe sterowniki drukarki, sterowniki wideo itp.
Jeśli to działa, to działa.
Chip się nie zmienił , a jedynym prawdziwym powodem aktualizacji w dzisiejszych czasach jest zmiana IDE (lub zmiana kompilatora) w taki sposób, że wprowadza błędy kompilacji. Takie rzeczy zdarzyły się całkiem niedawno, gdy na przykład PROGMEM miał bardziej rygorystyczne reguły.
Komentarze
- Ta biblioteka wygląda bardzo obiecująco, ale pamiętaj, że tak obsługują tylko cele AVR. Ponieważ rdzenie Arduino zostały opracowane dla różnych architektur, ta biblioteka nie będzie " działać tylko " dla żadnej płyty kompatybilnej z Arduino. Na przykład nie jest kompatybilny z Adafruit ' s STM32F405 opartym na Feather
Odpowiedź
Warto również sprawdzić bibliotekę Procyon AVR . Jest teraz trochę stary, ale bardzo profesjonalny i trochę minimalistyczny. Niewiele zależności, powinno wystarczyć użycie tylko modułu I2C. Od tego czasu nie ma prawie nic nowego w części AVR I2C.
Odpowiedź
Cosa TWI to zupełnie inne podejście do obsługi sterowników urządzeń I2C. W ogóle nie używa dodatkowej pamięci SRAM dla buforów. Jeśli sterownik urządzenia nie blokuje, musi obsługiwać niezbędne buforowanie. Również klasa Cosa TWI obsługuje typową interakcję z urządzeniami I2C, takimi jak master / slave, wzorce „zapis danych do odczytu i odczytu” oraz transakcje przy użyciu wielowątkowości.
Dostępna jest biblioteka oprogramowania i sprzętu Arduino-TWI . Wykorzystuje bibliotekę Arduino-GPIO i może być używany na płytach opartych na AVR i SAM.
Kilka przykładów: TWI Scanner , DS3231 Zegar / kalendarz czasu rzeczywistego , Adapter I2C LCD z PCF8574 .
Odpowiedź
Sam utworzyłem 2 biblioteki dla łatwiejszego użycia i spójnych połączeń:
jedna dla celów AVR:
cI2C
inny korzystający z tych samych funkcji dla wszystkich innych celów (co w zasadzie jest opakowaniem biblioteki Wire):
WireWrapper
Oba są dostępne w menedżerze biblioteki IDE.
Oba działają jako master bez przerywania i są testowane na różnych obiektach z różnymi slaveami:
– UNO, Nano dla cI2C
– Zero, należne & ESP8266 dla WireWrapper
Odpowiedź
Możesz zastosować zupełnie inne podejście do głównego pytania.Pytając o alternatywy, podałeś powód: pozbycie się nieużywanego kodu w pliku binarnym. Możesz usunąć nieużywany kod bez korzystania z alternatywnej biblioteki. Pamiętaj, że możesz poinstruować kompilator i konsolidator, aby wykluczyć nieużywany kod ze skompilowanego pliku binarnego. Po prostu użyj flag kompilacji:
CFLAGS += -Wl,-static CFLAGS += -ffunction-sections CFLAGS += -Wl,--gc-sections
Funkcja Rach będzie w swojej własnej sekcji.
LDFLAGS += -Wl,-gc-sections
To mówi GCC, aby wysłał flagę -gc-sekcja do linkera, który usunie nieużywane sekcje. I voilla! Nieużywane sekcje są usuwane.