Robert_1967 napisał(a):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po pierwsze:
Moim zdaniem lepiej jednak jest korzystać z nazw typów, które jasno określają ich szerokość w bitach, czyli:
- uint8_t zamiast unsigned char
- uint64_t zamiast unsigned long long int
- int16_t zamiast int
- itd.
Typy wbudowane nie są jednoznaczne, ponieważ ich szerokość w bitach jest zależna od platformy sprzętowej (inna będzie dla 8-bitowego AVR, a inna dla STM32). Ja użyłem nazwy typu
unsigned long long tylko dlatego, żeby pokazać skąd wziął się przyrostek
ULL.
Po drugie:
Nadal masz zmienną 64-bitową w Twojej unii, a w zupełności wystarczy 32-bitowa:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Sprawę wymuszenia obliczeń na liczbach 64-bitowych załatwi przyrostek
ULL przy zdefiniowanych stałych.
Robert_1967 napisał(a):
frequency = 25000000ULL;
Zmienna
frequency jest typu
uint32_t i taka może być, jednak wartości 64-bitowej do niej i tak nie wpiszesz, więc spokojnie możesz tutaj pominąć przyrostek
ULL.
Robert_1967 napisał(a):
Jest to najczęściej spotykana metoda, ale jak pisałem wcześniej, to podobno z użyciem uni ten kod działa najszybciej, a więc uparłem się na niego
Wiesz, nie chce mis się teraz tego testować, ale wydaje mi się, że kompilator, po napotkaniu na przesunięcia bitowe podzielne przez 8, przynajmniej wtedy, gdy kompiluje kod dla 8-bitowego mikrokontrolera, nie będzie używał czasochłonnych przesunięć bitowych, tylko odczyta po kolei poszczególne bajty, podobnie jak w przypadku odczytu z tablicy. Jestem tego prawie pewien, choć gwarancji nie dam. Poza tym gdyby ten kod nieco przerobić, to można by go przyspieszyć:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Gdyby napisać w ten sposób, to nawet jeśli przesunięcia bitowe byłyby wykonywane, działoby się to w trakcie transmisji SPI, a i tak czekasz na jej zakończenie, zarówno tutaj, jak i w kodzie z unią. Nie wiem, z jaką prędkością te dane wysyłasz, ale jest szansa, że w trakcie transmisji przesunięcia zdążyłyby się wykonać. Tutaj dane są bezpośrednio wpisywane do rejestru SPDR, w kodzie z unią wywołujesz funkcję wysyłającą, a każde wywołanie i powrót z funkcji pochłania dodatkowe takty zegara. W kodzie z unią cczekasz na wysłanie danych, a dopiero później odczytujesz dane z tablicy, aby wysłać następny bajt, tutaj następny bajt można przygotować w czasie transmisji. W celu uzyskania odpowiedzi, który kod jest szybszy, należałoby wykonać testy, przeliczyć takty, ale nie za bardo mam na to czas.
andrews napisał(a):
Robert_1967 napisał(a):
Dzięki, ze chociaż Ty masz chęć nieraz odpisać.
Każdy ma jakiegoś bzika...
Robert_1967 napisał(a):
Nie widzę, jak wstawić cytat "Dzięki, ze chociaż Ty masz chęć nieraz odpisać." Poniekąd rozumiem, że to nie jest forum do nauki C od podstaw. Jeśli ktoś chce się uczyć, to niech idzie do szkoły, a nie szuka korepetycji za darmo
Nie wiem, czy mnie dobrze zrozumiałeś. Nie miałem zamiaru Cię urazić. Niemniej moim zdaniem forum jest jak najbardziej także dla początkujących. Jednak nauka programowania, tak jak wszystkie nauki ścisłe, wymaga zachowania pewnej kolejności w zdobywaniu wiedzy. Problem z początkującymi często polega na tym, że są niecierpliwi i chcą na skróty osiągnąć wysoki poziom, przez co odpowiedzi na ich pytania muszą być bardzo obszerne, a każda odpowiedź rodzi następne pytania. Nie traktuj tego jako złośliwość, tylko jako dobrą radę, żeby uczyć się z zachowaniem odpowiedniej kolejności, systematycznie, nie za szybko zwiększać stopień trudności swoich projektów i uzbroić się w cierpliwość, a efekty na pewno z czasem przyjdą.
Pozdrawiam
Andrzej