fbpx

W poprzednim wpisie z cyklu o dwurdzeniowcach przedstawiłem Ci naprawdę mocnego  zawodnika, czyli STM32H745, który znajduje się na płytce Nucleo rozmiarze 144. Doszedłem do momentu, gdzie stworzyłem pierwszy projekt. Strukturę projektu mamy już za sobą. Jak teraz uruchomić nasz kod?

Rdzeń “główny” – start MCU

Kto rządzi w obudowie STM32H745? Wydaje się, że ten silniejszy, czyli Cortex-M7. Mogłoby się wydawać, że Cortex-M7 w takim wypadku będzie inicjował cały mikrokontroler. No i dokładnie tak jest w domyśle.

Cube generuje projekt w opcji Boot Mode Sequence 1. Na czym ta sekwencja polega? Przybliżyłem całą w tabeli.

Cortex-M4 Cortex-M7
Start Start
Włącza semafory i aktywuje notyfikacje na HSEM_ID_0 Czeka na to aż Cortex-M4 wejdzie w STOP Mode
Czyści Eventy i wchodzi w STOP Mode
Inicjuje HAL
Konfiguruje zegary (wspólne dla dwóch rdzeni)
Bierze Semafor HSEM_ID_0
Zwalnia Semafor HSEM_ID_0 (wysłanie notyfikacji do Cortex-M4, aby go obudzić)
Czeka na obudzenie się Cortex-M4
Budzi się po Notyfikacji z Semafora
Inicjuje HAL Inicjuje swoje peryferia
Inicjuje swoje peryferia Działa
Działa

 

Po tej sekwencji startowej obydwa rdzenie już pracują. Każdy według swojego programu, bo przecież piszemy dwa osobne programy jeśli pamiętasz z poprzedniego wpisu.

Prosty program migania diodami

Co można zrobić jako pierwsze na nowym dla nas mikrokontrolerze? Oczywiście, że zamigać diodą! Na NUCLEO-H745ZI-Q mamy aż trzy diody w porównaniu do mniejszych Nucleo. Zieloną, żółtą i czerwoną.

Na jednym rdzeniu zamigamy zieloną, na drugim czerwoną. Obydwa migania zrobimy na HAL_Delay, więc w końcu będziemy mogli odpalić “dwie rzeczy naraz” 😉

Kod jest banalnie prosty. W pliku main.c dla Cortex-M4 w pętli głównej po prostu migasz diodą.

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

Natomiast na drugim rdzeniu Cortex-M7 piszemy w innym main.c, ale kod będzie wyglądał prawie tak samo. Różni się numerem diody i prędkością migania.

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
	  HAL_Delay(300);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

To tyle w kodzie. Schody przychodzą dopiero teraz, teraz gdy chcemy to uruchomić na mikrokontrolerze jako debug, aby podejrzeć pracę całego układu.

Uruchamianie Debug na STM32H745

Całą sekwencję startową możesz znaleźć w odpowiednim dokumencie od ST. W nim znajdują się informacje o tym jak zacząć działać z dual-core w STM32CubeIDE. Pozwól, że przedstawię Ci najważniejszą część, czyli właśnie uruchamianie Debugowania.

W skrócie:

  • Potrzebujemy osobnego projektu debugowego dla każdego z rdzeni
  • Trzeba ustawić konfutorację tak, aby rdzenie haltowały się zawzajem
  • Utworzyć grupę konfiguracji debugowych do odpalania ich jednocześnie.

Jak to wygląda w praktyce? Już pokazuję.

Zacznijmy od Cortex-M7. Stwórzmy mu konfigurację debugową.

Następnie ustaw “Connect under reset” oraz zaznacz Halt all cores. Zwróc uwagę na numer portu dla GDB.

Stwórz też taki projekt debugu dla Cortex-M4. Tutaj nie rób ustawienia resetu, ale za to ustaw inny numer portu GDB niż dla Cortex-M7. Inaczej to nie zadziała!

Skoro jeszcze jesteśmy w zakładce Debugger to w obydwu konfiguracjach musisz koniecznie zaznaczyć obydwie opcje w Cross Trigger Interface. Pozwala to na to, że jeden rdzeń może wstrzymywać pracę drugiego i na odwrót.

OK. Wróć teraz do konfiguracji Cortex-M7. W zakładce Startup musisz dodać teraz plik *.elf od Cortex-M4. Robisz to przez Add…

I konfigurację tego ELFa zrób jak poniżej. Musisz zaznaczyć który projekt chcesz dodać do Startupu. Zauważ, że zaznaczyłem checkbox “Download”. Oznacza to, że to konfiguracja Cortex-M7 będzie programowała mikrokontroler również kodem dla Cortex-M4. Oznacza to tyle, że konfiguracja Cortex-M4 już tego nie może robić. Trzeba tam odznaczyć checkbox Download.

Teraz trzeba to uruchomić. Musimy stworzyć tzw. Launch group w debugu, który to uruchomi nam dwie konfiguracje jednocześnie.

Konfiguracja jest gotowa. Teraz wystarczy to odpalić! Tu też nie jest tak prosto 🙂

Odpalanie programu

Nie możesz po prostu wcisnąć Play w Debugu i patrzeć jak działa. Masz dwa projekty i w dwóch musisz wystartować osobno. Dodatkowo trzeba to zrobić w odpowiedniej sekwencji, aby rdzenie ze sobą współgrały!

Po kolei:

  1. Uruchomić projekt grupowy
  2. Wystartować projekt Cortex-M4 – wpadnie do adresu 0xA05F0000 co oznacza, że wszedł w STOP Mode i się debug zatrzyma.
  3. Wystartować Cortex-M7.
  4. Puścić Cortex-M4 dalej.
  5. Obydwa rdzenie pracują.

Jeśli wrzuciłeś proste miganie diodą na każdy z rdzeni, zaobserwujesz na Nucleo miganie dwóch diodek 🙂 Każdą z nich steruje inny rdzeń mikrokontrolera.

Podsumowanie

Jak widzisz jest trochę gimnastyki z uruchamianiem programu na takim 2-rdzeniowcu. Jednak da się to zrobić w miarę prosto jeśli trzymamy się odpowiednio kilku zasad. Później trzeba tylko pamiętać o tym, w jakiej kolejności uruchamiać programy na mikrokontrolerze i to tyle.

Pewnie zastanawia Cię, w jaki sposób skomunikować ze sobą obydwa rdzenie, prawda? Przecież nie wsadzili ich do jednej obudowy, aby sobie chodziły oddzielnie.

STM32H745 ma kilka możliwości jeśli chodzi o takie współdziałanie dwóch jajek. Zajmę się tym w przyszłych wpisach.

Jeśli artykuł Ci się spodobał, kup coś u mnie! ? https://sklep.msalamon.pl/

Jeśli zauważyłeś jakiś błąd, nie zgadzasz się z czymś, chciałbyś coś dodać istotnego lub po prostu uważasz, że chciałbyś podyskutować na ten temat, napisz komentarz. Pamiętaj, że dyskusja ma być kulturalna i zgodna z zasadami języka polskiego.

 

Podobne artykuły

.

3 komentarze

Janusz · 13/07/2021 o 16:38

CZy będzie część trzecia – komunikacja między rdzeniami? 🙂

    Mateusz Salamon · 14/07/2021 o 10:32

    Robiłem prostą komunikację przez współdzielony RAM na Live: https://youtu.be/0U5BoqqG95E
    Z czasem pojawi się i wpis 🙂

    Mateusz Salamon · 04/08/2021 o 12:03

    Jest w zapisie z Live. Prosta, bo z wykorzystaniem współdzielonego RAM, ale jakiś zalążek już jest 🙂

Dodaj komentarz

Avatar placeholder

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *