logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Usuwanie spacji w funkcji __DATE__ w kompilatorze GCC AVR

Karol966 05 Maj 2022 19:44 912 15
  • #1 20007991
    Karol966
    Poziom 31  
    W GCC jest dostęp do czegoś co nazywa się "__DATE__" a wykonanie
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    sprawi dołączenie do stringu ciągu np:
    Cytat:
    May 5 2022
    , nie wiem na ile to prawdziwe ale osoba obsługująca serwer, na który wysyłam modułem SIM868 dane nie chce spacji (aczkolwiek ze spacjami również wszystko działa).
    Gdybym jednak chciał usunąć te spacje to wykorzystałem z pomocą googla taką funkcję:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Która działa operując na elemencie __DATE__. Pytanie czym jest __DATE__? Gdzie on leży, czy ja mogę sobie bezkarnie go modyfikować usuwając niechciane spacje? Cel osiągam w ten sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie otrzymując żadnych ostrzeżeń ani błędu kompilatora ale nie wiedząc czym/ gdzie jest __DATE__ nie jestem tego pewien.

    Pisząc ten post pomyślałem, że w sumie mogę usunąć spacje już ze swojej tablicy "string" przed jej wysłaniem na serwer...
  • #2 20008199
    JacekCz
    Poziom 42  
    manek3 napisał:
    Sądzę, że nie jest to to o czym myślis


    Dokładnie.

    Z jakichś chorych powodów pokutuje w świecie arduino __DATE__ jako aktualna data. Jest o tyle "aktualna", że to data kompilacji, i typowy tfurca oprogramowania nie zauważa problemów
    I potem uczył Marcin Marcina

    Dodano po 1 [minuty]:

    Karol966 napisał:
    W GCC jest dostęp do czegoś co nazywa się "__DATE__"


    Nie w gcc, ale to jest w standardzie języka
  • #3 20008208
    Karol966
    Poziom 31  
    manek3 napisał:
    Sądzę, że nie jest to to o czym myślisz.

    manek3 napisał:
    Nie jest to coś co da Ci aktualną datę

    A kto powiedział, ze szukam tam aktualnej daty?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Mi chodzi wyłącznie o datę kompilacji. Zrobiłem jak pisałem - wywaliłem spację ze swojej zmiennej "string". Mimo wszystko chętnie dowiem się czy można to modyfikować.

    Dodano po 1 [minuty]:

    JacekCz napisał:
    Z jakichś chorych powodów

    Z równie chorych powodów wrzuciłeś mnie do jednego wora z arduino, którego nawet nie używam.
  • Pomocny post
    #4 20008225
    JacekCz
    Poziom 42  
    legalnie (tj bez efektów ubocznych) możesz to zrobić kopiując do świeżego obszaru.
    Mniemam, że chwile, kiedy jest to potrzebne, są nieliczne, i znajdzie się te 20 bajtów tymczasowej pamięci
  • #5 20008235
    Karol966
    Poziom 31  
    JacekCz napisał:
    legalnie (tj bez efektów ubocznych) możesz to zrobić kopiując do świeżego obszaru.
    Mniemam, że chwile, kiedy jest to potrzebne, są nieliczne, i znajdzie się te 20 bajtów tymczasowej pamięci


    Oczywiście, że tak mogę zrobić. Urządzenie date kompilacji swojego programu w każdej ramce na serwer (raz na 20-30 sekund) czyli nie używam tego jednorazowo a te 20 bajtów wolę przeznaczyć na coś innego. Stąd powstało pytanie z pierwszego postu.
    Najchętniej skopiował bym na etapie kompilacji do flash tą datę od razu z pominięciem spacji (wciąż nie wiem czy to faktycznie ma znaczenie ale niech będzie), da się tak?

    Jeżeli zrobię:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to uzyskam wyniki:
    Cytat:
    Program Memory Usage : 9996 bytes 30,5 % Full
    Data Memory Usage : 887 bytes 43,3 % Full

    a jeżeli zrobię:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to uzyskam wyniki:
    Cytat:
    Program Memory Usage : 9996 bytes 30,5 % Full
    Data Memory Usage : 899 bytes 43,9 % Full

    Czyli w obu wypadkach flash ma ten sam rozmiar a jedynie zmienia się zajęcie RAMu, dlaczego?
  • Pomocny post
    #6 20008251
    mpier
    Poziom 29  
    Cześć,
    to "&build=" wygląda jak parametr dla GET i jego zawartość powinna być przed wysłaniem zakodowana.

    Jeśli nie podoba ci się zawartość __DATE__ to użyj innego, z dowolnym formatowaniem. Opcja -D dla gcc.

    Pewnie w obu przypadkach dwanaście bajtów zajmuje dwanaście bajtów.
  • Pomocny post
    #7 20008594
    tmf
    VIP Zasłużony dla elektroda
    Karol966 napisał:
    Czyli w obu wypadkach flash ma ten sam rozmiar a jedynie zmienia się zajęcie RAMu, dlaczego?

    Bo funkcje z suffiksem _P pobierają dane z FLASH, a bez tego suffiksu z SRAM, czyli twoje __DATE__ musi się najpierw w SRAM znaleźć, co jest lekko bez sensu. Ale to też zależy od MCU - w nowszych AVR jest płaska przestrzeń adresowa i obie funkcje mogą dać ten sam rezultat.
  • #8 20008626
    Sareph
    Poziom 24  
    Pytanie, czy to musi być string? Bo timestamp wydaje się mniej upierdliwy -> https://stackoverflow.com/questions/23032002/...teger-unix-timestamp-of-build-time-not-string
  • #9 20008694
    Karol966
    Poziom 31  
    mpier napisał:
    wygląda jak parametr dla GET
    Nie patametr a treść danych i nie dla GET a akurat dla POST. To jest po prostu kawałek treści danych, które wysyłam na serwer.
  • #10 20008714
    JacekCz
    Poziom 42  
    Karol966 napisał:
    czyli nie używam tego jednorazowo a te 20 bajtów wolę przeznaczyć na coś innego.


    Pamięć na stosie, zwana type auto, właśnie ma takie cechy. Po powrocie z funkcji (np wysłaniu ramki) wraca.

    mpier napisał:
    użyj innego, z dowolnym formatowaniem. Opcja -D dla gcc.


    Popieram oboma rękami, ustawić w skrypcie kompilującym tak, aby było idealnie dostosowane. Żadnych niechcianych formatów (np amerykańskich)
    Zresztą -D wartość makra to opcja powszechnie występująca, nie tylko w gcc.
  • #11 20008947
    mpier
    Poziom 29  
    Może być POST, sam wiesz co wysyłasz i czy traktujesz "treść" odpowiednio do "Content-Type:", np. urlencode(str, str_size) dla "application/x-www-form-urlencoded". Tak czy inaczej to inny temat, podobnie jak używanie strcat i strcat_P.

    Pozdrawiam.
  • Pomocny post
    #12 20009536
    jvoytech
    Poziom 21  
    Zmienić możesz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to makro jest datą kompilacji modułu, więc trzeba uważać, bo jak ono wystąpi w osobnych plikach to może się okazać że może mieć różną wartość dla każdego z nich. Lepiej jest utworzyć np. plik "parametry.h", który byłby generowany np. przez skrypt lub wstawić w odpowiednim miejscu w Makefile polecenie:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #13 20010979
    Karol966
    Poziom 31  
    mpier napisał:
    "application/x-www-form-urlencoded"

    Dokładnie taki CONTENT używam, nie znam się na HTTP wcale i nie wiem co to oznacza, wiem że tak miałem zrobić wg poleceń osoby odpowiedzialnej za serwer i na tym temat się zakończył.
    mpier napisał:
    podobnie jak używanie strcat i strcat_P.

    Możesz rozwinąć? W moim projekcie spotkało mnie już tyle pułapek wynikających z małego doświadczenia, że aż się boję kolejnej, nieświadomej gafy. Kiedyś coś mi się obiło o uszy ale totalnie tego nie pamiętam.

    Wracając do tematu, generalnie wydawało mi się, że zadaję proste pytanie ale ilość i treść odpowiedzi jest dość imponująca ;)

    Obawiając się konsekwencji zmian wartości symbolu __DATE__ wywaliłem niechciane znaki spacji już z ostatecznie utworzonej ramki danych. To, że jest to string oczywiście wiem, również wiem, że mogę sobie tens string sparsować i wyciąć z niego to co mi potrzebne aczkolwiek w tym konkretnym przypadku chodziło tylko o wywalenie spacji.
  • #14 20012011
    LED5W
    Poziom 34  
    Karol966 napisał:
    mpier napisał:
    "application/x-www-form-urlencoded"

    Dokładnie taki CONTENT używam, nie znam się na HTTP wcale i nie wiem co to oznacza, [...]

    W takim przypadku spacje powinny być zakodowane. Zamienione na %20 lub +.
  • #15 20027812
    Janusz_kk
    Poziom 38  
    mpier napisał:
    podobnie jak używanie strcat i strcat_P.

    Karol966 napisał:
    Możesz rozwinąć? W moim projekcie spotkało mnie już tyle pułapek wynikających z małego doświadczenia, że aż się boję kolejnej, nieświadomej gafy.

    Tu chodzi o dostęp do pamięci RAM i ROM (eprom), w starych avr-ach są one w odrębnych przestrzeniach adresowych w związku z tym używają innych rozkazów do odczytu, dlatego są różne funkcje, dla ROM mają dodatek '_P'.
  • #16 20030332
    Karol966
    Poziom 31  
    Janusz_kk napisał:
    Tu chodzi o dostęp do pamięci RAM i ROM (eprom), w starych avr-ach są one w odrębnych przestrzeniach adresowych w związku z tym używają innych rozkazów do odczytu, dlatego są różne funkcje, dla ROM mają dodatek '_P'.


    Aa, no to akurat wiem, myślałem że z jakiegoś powodu nie powinno się używać tych funkcji. Zależnie od tego gdzie leży dany string używam do jego wysłania funkcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

W dyskusji poruszono temat użycia makra __DATE__ w kompilatorze GCC AVR, które zwraca datę kompilacji programu. Użytkownik chciał usunąć spacje z tego ciągu, aby dostosować go do wymagań serwera, na który wysyła dane z modułu SIM868. Zastosowano funkcję remove_char do usunięcia niechcianych znaków. Uczestnicy dyskusji wyjaśnili, że __DATE__ jest makrem standardowym, które nie powinno być modyfikowane bezpośrednio, a lepszym rozwiązaniem jest skopiowanie jego wartości do innego obszaru pamięci. Zwrócono również uwagę na różnice w dostępie do pamięci RAM i ROM w architekturze AVR oraz na konieczność kodowania spacji w danych wysyłanych na serwer.
Podsumowanie wygenerowane przez model językowy.
REKLAMA