Skocz do zawartości

Błąd kompilacji Invalid Initializer


piotrdn

Pomocna odpowiedź

Cześć,

Kompilator zwraca błąd opisany jako "Invalid Initializer". 

image.thumb.png.009dba44a859925fbe8d2cbc4f3af0d7.png

image.thumb.png.80d70dcf88c0236ce1b635e66471a505.png

Wydaje mi się, że problem dotyczy niepoprawnych deklaracji zmiennych, które trafiają do funkcji: ai_sine_model_inputs_get

AI_API_ENTRY
ai_buffer* ai_sine_model_inputs_get(ai_handle network, ai_u16 *n_buffer)
{
  if (network == AI_HANDLE_NULL) {
    network = (ai_handle)&AI_NET_OBJ_INSTANCE;
    ((ai_network *)network)->magic = AI_MAGIC_CONTEXT_TOKEN;
  }
  return ai_platform_inputs_get(network, n_buffer);
}

Zmienna AI_HANDLE_NULL jest definiowana w następujący spsób:

#define AI_HANDLE_NULL                AI_HANDLE_PTR(NULL)

Natomiast NULL w ten sposób:

#define NULL ((void *)0)

Wywołanie tej funkcji następuje tutaj:

AI_DEPRECATED
#define AI_SINE_MODEL_IN \
  ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL)

i to właśnie linia: ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL)  jest opatrzona błędem "Invalid initializer". Analogiczna sytuacja jest dla ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL)

AI_DEPRECATED
#define AI_SINE_MODEL_OUT \
  ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL)

 

 

Kompilator zgłasza  także Info dla tych dwóch linii:

ai_buffer ai_input[AI_SINE_MODEL_IN_NUM] = AI_SINE_MODEL_IN;
ai_buffer ai_output[AI_SINE_MODEL_OUT_NUM] = AI_SINE_MODEL_OUT;

image.thumb.png.9e0812d9016029d557ca44bb3b2fd7d0.png

 

Czy ktoś może spotkał się z podobną sytuacją? W jaki sposób to poprawić?

Link do komentarza
Share on other sites

14 godzin temu, piotrdn napisał:

Cześć,

Kompilator zwraca błąd opisany jako "Invalid Initializer". 

image.thumb.png.009dba44a859925fbe8d2cbc4f3af0d7.png

image.thumb.png.80d70dcf88c0236ce1b635e66471a505.png

Wydaje mi się, że problem dotyczy niepoprawnych deklaracji zmiennych, które trafiają do funkcji: ai_sine_model_inputs_get




AI_API_ENTRY
ai_buffer* ai_sine_model_inputs_get(ai_handle network, ai_u16 *n_buffer)
{
  if (network == AI_HANDLE_NULL) {
    network = (ai_handle)&AI_NET_OBJ_INSTANCE;
    ((ai_network *)network)->magic = AI_MAGIC_CONTEXT_TOKEN;
  }
  return ai_platform_inputs_get(network, n_buffer);
}

Zmienna AI_HANDLE_NULL jest definiowana w następujący spsób:




#define AI_HANDLE_NULL                AI_HANDLE_PTR(NULL)

Natomiast NULL w ten sposób:




#define NULL ((void *)0)

Wywołanie tej funkcji następuje tutaj:




AI_DEPRECATED
#define AI_SINE_MODEL_IN \
  ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL)

i to właśnie linia: ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL)  jest opatrzona błędem "Invalid initializer". Analogiczna sytuacja jest dla ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL)




AI_DEPRECATED
#define AI_SINE_MODEL_OUT \
  ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL)

 

Czy ktoś może spotkał się z podobną sytuacją? W jaki sposób to poprawić?

Cześć,

dziwny wydaje mi się pomysł przekazywania null pointer na uchwyt jakiejś większej struktury, szczególnie, że funkcja ma zwracać wskaźnik na bufor.

Może najpierw odpowiesz na pytanie dlaczego przekazujesz do funkcji pusty wskaźnik? Co prawda w takim wypadku, jest tworzony nowy uchwyt, ale podczas jego tworzenia coś idzie źle.

Pozdrawiam

Edytowano przez FlyingDutch
update
Link do komentarza
Share on other sites

Część, dzięki za odpowiedź. Temat dotyczy uruchomienia algorytmu AI na STM32 przy wykorzystaniu modułu X-CUBE-AI. Projekt został przedstawiony w tym artykule: https://www.digikey.pl/en/maker/projects/tinyml-getting-started-with-stm32-x-cube-ai/f94e1c8bfc1e4b6291d0f672d780d2c0

Chciałbym go odwzorować na STM32 L476RG. 

W załączniku przesyłam mój kod projektu.

models.zip nucleo-l476_AI_v3.zip

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Niestety nie wiem jak powstał ten kod, ani nie wiem o co w nim chodzi, więc pozostaje tylko zgadywanie.

Pierwsze, co nie ma sensu to linie:

		//struktury wskazujące na dane in oraz out
			ai_buffer ai_input[char* AI_SINE_MODEL_IN_NUM] = AI_SINE_MODEL_IN;
			ai_buffer ai_output[char AI_SINE_MODEL_OUT_NUM] = AI_SINE_MODEL_OUT;
		//ai_buffer ai_input[1];
		//ai_buffer ai_output[1];

Co miały robić "char*" i "char" w deklaracjach ai_input/ai_output ciężko się domyślić. Ale bez tych dziwnych wstawek, faktycznie pojawia się opisywany błąd "Invalid Initializer".

Można go usunąć zmieniając kod na:

		//struktury wskazujące na dane in oraz out
			ai_buffer *ai_input = AI_SINE_MODEL_IN;
			ai_buffer *ai_output = AI_SINE_MODEL_OUT;
		//ai_buffer ai_input[1];
		//ai_buffer ai_output[1];

Tylko czy to jest cokolwiek lepsze, ciężko powiedzieć... Kompilator i tak wyrzuci błąd przy liniach:

		ai_input[0].n_batches = 1;

oraz

		ai_output[0].n_batches = 1;

Mam niejasne wrażenie, że to jakiś kod utworzony przez generator, który jest łatany bez zrozumienia o co w nim chodzi... tak raczej nie da się napisać sensownego programu. No chyba że sztuczna inteligencja osiągnie na tyle wysoki poziom, że napisze program za użytkownika zamiast przykładowo niszczyć świat.

Proponowałbym jakiś kurs podstaw programowania w C, może kurs Arduino? A zabawę w sztuczną inteligencję nieco później.

  • Lubię! 1
Link do komentarza
Share on other sites

@Elvis Dzięki za odpowiedź.

Jako, że nie mam w języku C dużego doświadczenia, postanowiłem odwzorować projekt opisany na DigiKey (link wysłany wcześniej). W ten sposób chciałbym się dowiedzieć jak to wszystko powinno działać. Niestety nie udało się tego przenieść 1:1 na STM32L476. Być może mógłbyś zaproponować jakiś inny sposób na uruchomienie tego (być może jakiś prostszy, podobny do tego, który opisałeś w jednym ze swoich artykułów)? Myślę, że to może być ciekawy przykład edukacyjny i pewnie więcej czytelników mogłoby zainteresować się tematem. 

Sama sieć neuronowa jest dosyć prosta. Nie jest to przykład taki jak najczęściej można znaleźć w sieci (czyli wykrywanie jakiegoś wzorca, sekwencji itp). Tutaj sieć przyjmuje jedno wejście i zwraca nam jedno wyjście (przyjmujemy argument funkcji sinus i zwracamy wartość). Fajnie by było mieć możliwość uruchomienia tego na jakimś mikrokontrolerze.

Link do komentarza
Share on other sites

Przykład od DigiKey działa bez problemu na Nucleo-STM32L476. Trzeba tylko go poprawnie przeklikać i kod wygenerowany przez CubeMX kompiluje się bez problemu.

Zmiany zamiast w pliku main.c łatwiej jest wprowadzać w pliku app_x-cube-ai.c, który jest generowany domyślne. W nim są zmienne ai_input oraz ai_output zadeklarowane jako wskaźniki (tak jak zgadywałem we wcześniejszym wpisie):

static ai_buffer* ai_input;
static ai_buffer* ai_output;

Niestety jakość kodu z generatora jest koszmarna, ale kompiluje się i działa. Niestety bez znajomości języka C nie ma raczej szans poradzić sobie z tym projektem. Więc jak napisałem wcześniej, zachęcam do nauki podstaw. Natomiast samo AI można poćwiczyć bez STM32, wtedy jest nieco łatwiej.

  • Lubię! 2
Link do komentarza
Share on other sites

Problem rozwiązany. Przyczyną błędów była różnica w wersji modułu X-CUBE-AI. Przytoczony artykuł został wykonany w wersji 5.1, natomiast ja zastosowałem wersję 7, dlatego że starsza wersja niekoniecznie chce współpracować z chociażby nowszą wersją biblioteki Tensorflow. W nowszej wersji inaczej są kodowane niektóre struktury, np ai_buffer.  Brakuje tam parametru n_batches. Różnic może być więcej.

Początkowo projekt pisałem w PyCharm ale przeszedłem na Google colab. Nie trzeba przejmować się konfiguracją środowiska.

Dzięki za wszystkie odpowiedzi.

Pozdrawiam 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

11 godzin temu, piotrdn napisał:

Problem rozwiązany. Przyczyną błędów była różnica w wersji modułu X-CUBE-AI. Przytoczony artykuł został wykonany w wersji 5.1, natomiast ja zastosowałem wersję 7, dlatego że starsza wersja niekoniecznie chce współpracować z chociażby nowszą wersją biblioteki Tensorflow. W nowszej wersji inaczej są kodowane niektóre struktury, np ai_buffer.  Brakuje tam parametru n_batches. Różnic może być więcej.

Początkowo projekt pisałem w PyCharm ale przeszedłem na Google colab. Nie trzeba przejmować się konfiguracją środowiska.

Dzięki za wszystkie odpowiedzi.

Pozdrawiam 🙂

Cześć,

fajnie, że udało się ustalić, co jest przyczyną błędów. Odnośnie środowiska to instalując "Anacondę" na lokalnym kompie też możemy korzystać z "Jupyter Notebook" i łatwo instalować nowe pakiety Pythona.Jako edytor (a właściwie IDE) u mnie dobrze się sprawdza także "PyScripter".

Pozdrawiam

 

  • Lubię! 1
Link do komentarza
Share on other sites

1 minutę temu, Elvis napisał:

@FlyingDutch Na colabie też można instalować pakiety, a dodatkowo mamy dostęp do GPU w całkiem silnej konfiguracji - nie każdy może sobie na taki sprzęt pozwolić w lokalnym kompie.

Cześć @Elvis,

wiem o tym, też korzystałem z "Google Colab" podczas pracy z Kerasem. Problem jest taki, że w fazie uczenia sieci neuronowej jest potrzeba przesyłania dużej ilości danych na to konto, a te dane są co dobę automatycznie usuwane. Pochłania to sporo czasu (transfer danych za pomocą sieci).

Pozdrawiam

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.