Znalazłem już samouczki Baking Pi , ale używają one tylko języka asemblera . Poszłam na pierwsze lekcje, ale już zastanawiam się, jak zamiast tego użyć C. Mam na myśli powód, dla którego wymyślili języki wyższego poziomu. Próbowałem po prostu skompilować kod C do pliku object ( .o
), kompilując
.section .init
.globl _start
_start:
bl main
loop$:
b loop$
do innego pliku obiektowego i łączenie ich ze sobą, a więc uzyskiwanie kernel.img
. Następnie zastąpiłem już obecne jądro moim własnym, ale nie wykonuje ono kodu C. Kod C, który napisałem, powinien po prostu włączyć diodę OK, a następnie powrócić (potem nadejdzie loop$: b loop$
). Ale dioda OK OK miga kilka razy losowo, a następnie pozostaje wyłączona. Oto mój kod C:
int main(int argc, char ** argv) {
volatile unsigned *gpioAddr = (volatile unsigned *)0x20200000;
*(gpioAddr + 4) = 1 << 18;
*(gpioAddr + 40) = 1 << 16;
return 0;
}
Jak używać C do programowania systemów operacyjnych na Raspberry Pi?
Wątpię, czy to błąd w kodzie (chociaż jestem tylko hobbystą). Wiem, że konfiguracja C może być skomplikowana, ale nie jestem pierwszą, która to robi. AFAIK, wszystkie obecnie dominujące systemy operacyjne są napisane głównie w C, więc musi być artykuł wyjaśniający ten proces. Byłbym też bardzo zadowolony z listy kroków, więc mogę wyszukiwać te kroki w Google i być może zadać pytanie nieco mniej ogólne.
Uwaga: odpowiednik zestawu ARM powyższego kodu C działa dobrze. Włącza diodę LED (po krótkim mrugnięciu). Myślę (mam nadzieję), że to wskazuje, że moje Raspberry Pi jest w porządku.
źródło
Odpowiedzi:
Wiele lat temu napisałem bardzo proste jądro i uruchomiłem je na 386. Od wielu lat nie programowałem bez systemu, ale ogólnie rzecz biorąc, musisz napisać kod asemblera, który:
Konfigurowanie stosu jest łatwe - znajdź pamięć, która nie jest używana, i załaduj adres, pod którym kiedykolwiek rejestr jest używany jako wskaźnik stosu.
W kodzie C musisz zainicjować struktury danych systemu operacyjnego, takie jak pule pamięci i tabele wątków. Nie będziesz mógł korzystać z funkcji biblioteki C - musisz sam to napisać.
Jeśli chcesz napisać prosty wielozadaniowy system operacyjny, musisz napisać kilka procedur asemblera, aby zapisać rejestry procesora na stosie i załadować inny zestaw wartości rejestru ze stosu innego wątku. I musisz napisać API, aby utworzyć różne wątki.
źródło
Nie zagłębiłem się w twój kod, ale wydaje mi się, że jesteś na dobrej drodze. Upewnij się, że:
_start
symbol jest rzeczywiście tym, który jest używany podczas kompilacji i łączenia pliku asemblera i pliku C (imain()
nie jest on używany zamiast tego)main()
należy użyć konwencji wywoływania C:return
instrukcję w C)int main() { ... }
objdump -S main.o
) i zobacz, jak manipuluje stosem.loop$
.OSDev wiki będzie bardzo przydatna Ressource - to dotyczyły głównie z rozwojem x86 ale większość informacji jest nadal stosowane do pi malinowym.
Kilka innych zasobów specyficznych dla raspberry-pi osdev:
kernel.img
.kernel.img
wykonaniem.źródło
Głównym problemem, jaki możesz napotkać, są biblioteki C i kod prologu. Uruchamia się, zanim twój własny kod zacznie działać i ustawi stos, stos i zrobi wiele innych pomocnych rzeczy. Jednak, gdy próbujesz programować na goły metal, nie masz systemu operacyjnego działającego pod tobą i lepiej unikać wywoływania tych funkcji. W tym celu potrzebujesz zmodyfikowanych wersji bibliotek C i / lub niektórych symboli globalnych zdefiniowanych lub zastąpionych własnymi. Ten proces jest nieco angażujący, dlatego ludzie „Baking Pi” zdecydowali się użyć asemblera do swoich samouczków.
źródło
Spróbuj zamiast tego:
http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/
Ponadto wrażenia z x86 są nieco inne. Może mieć zastosowanie do ogólnego programowania systemu operacyjnego ARM bez systemu operacyjnego. Ale dla Pi, przepraszam, że najpierw zaczyna się procesor GPU i ustawia się sporo przed kodem OS (?).
źródło
s-matyukevich/raspberry-pi-os
https://github.com/s-matyukevich/raspberry-pi-os
To niesamowite repozytorium wykonuje zarówno ładowanie w C, jak i dość skomplikowane tematy.
Ponadto analizuje, w jaki sposób jądro Linux działa, i adnotuje kod jądra Linux.
Zobacz pierwszy samouczek dotyczący minimalistycznej konfiguracji: https://github.com/s-matyukevich/raspberry-pi-os/tree/43f682d406c8fc08736ca3edd08a1c8e477c72b0/src/lesson01/src
Gorąco polecam.
źródło