Ett embedded-OS
Postat: 25 januari 2018, 19:40:50
Mitt (långtids)projekt är att skapa ett eget operativsystem från grunden, som ska styra ett annat projekt jag också jobbar med. (Tråd om det kommer senare.)
Om någon annan går i samma tankar kanske det här kan bli en liten hjälp hur man gör, eller kanske mer troligt hur man inte bör göra
Varför göra ett eget OS när det redan finns så många öppna mcu-OS på nätet?
Jag har programmerat C/C++ i ganska många år, men har inte så mycket erfarenhet av mcu-miljöer annat än lite blinkade LEDs på olika arkitekturer så det här är tänkt att bli ett utbildningsmoment.
Målet är att få ett fungerande OS, inte ett högpresterande OS. Dessutom behöver jag inte hård RTOS-funktionalitet.
Jag kommer försöka göra så mycket som möjligt själv och inte förlita mig på färdiga vendor-bibliotek.
Jag har inte någon detaljerad plan för vad projektet ska innehålla utan kommer att ta saker allt eftersom jag kommer på att jag behöver dem.
Ja, jag vet att alla "experter" säger att man sparar mycket tid på att planera noggrannt först men det är så tråkigt.
Jag läste någonstans att det kallas för "big bang"-metoden, man slänger ihop olika delar tills allt exploderar. Sen bygger man något nytt av resterna som överlever.
Tänkta funktioner för mitt OS (härefter kallat mos tills jag kommer på något bättre namn)
Multitasking
├ Preemptive multitasking. En process som tar mycket processortid ska inte kunna låsa systemet.
├ Starta processer från filsystemet. Så att användarprocesser inte behöver hårdkodas. Ger en modulär design där man kan uppdatera specifika delar utan att starta om hela systemet.
└ Virtuellt minne (utan swap space). För att isolera processer från varandra. En kraschande process ska inte kunna ta någon annan med sig i fallet.
Filsystem
├ Något standard-filsystem, exakt vilket ej bestämt ännu. För att enkelt kunna överföra filer mellan mos och pc via sd-kort. FAT är enkelt, men lite väl begränsat.
├ Abstrakt fil-API. En process ska inte behöva bekymra sig över om filen ligger på sd, flash, eller någon annanstans utan samma API används till allt och OSet ser till att det blir rätt.
└ Kanske NFS och/eller SMB. (Ska det tillhöra filsystemet eller nätverket?)
Nätverk
├ 802.1Q VLAN.
├ IPv4 är ett måste. Kanske v6 också beroende på senare behov.
├ SSL/TLS, kanske IPSec. Osäker på om SSL ska räknas till nätverkssystemet eller ligga på en högre nivå.
└ Kanske NFS och/eller SMB. (Ska det tillhöra filsystemet eller nätverket?)
Övrigt
└ Saker som jag behöver som jag inte vet om än..
Tidsbudget
Ingen. Det är ett hobbyprojekt utan deadline.
Ja det är ett stort projekt att göra ensam, men jag är ihärdig.
Hårdvara
Ett Z-Turn devboard. En ZYNQ z7020, mest för att jag hade en tillgänglig. Kan ju också vara kul att lägga diverse hjälpfunktioner i FPGA-delen.
├ 2x ARM-A9 CPU.
├ 512MB DDR3.
├ Gigabit ethernet.
├ USB-host. Främst till extern lagring. Kanske fullt host-stöd senare om tid finns.
├ HDMI. Kanske. Systemet kommer primärt fjärrstyras via nätverket men det kan ju vara kul med lokal kontroll.
└ Kanske extern wifi. Jag har en microchip MRF24WB0MA som inte används till någonting men dokumentationen till den är väldigt dålig.
Mjukvara & dokumentation
Vivado webpack, med tillhörande mjukvaru-SDK. (usch, eclipsebaserat..)
Diverse datablad.
Google.
All kod tillhörande projektet kommer att laddas upp någonstans (github?) med en "gör vad du vill"-licens i de fall det är möjligt. Om jag måste använda tredjepartsbibliotek gäller givetvis deras egen licens.
Korta snuttar kan också komma att postas här i tråden med förklaringar om jag tycker det behövs (fråga gärna efter någonting om ni tycker att det fattas) men tanken är att tråden främst ska dokumentera utvecklingsprocessen och inte bara vara en koddump.
Första steget blir att skapa boot-kod (och lära mig ARM-assembler) för att få en processor i ett körbart läge (tvåkärnigt sparas till senare), och sen tända en LED för att visa att den lever.
Ingen bootloader ännu, kommer att starta över JTAG tillsvidare.
Fler uppdateringar följer..
Om någon annan går i samma tankar kanske det här kan bli en liten hjälp hur man gör, eller kanske mer troligt hur man inte bör göra
Varför göra ett eget OS när det redan finns så många öppna mcu-OS på nätet?
Jag har programmerat C/C++ i ganska många år, men har inte så mycket erfarenhet av mcu-miljöer annat än lite blinkade LEDs på olika arkitekturer så det här är tänkt att bli ett utbildningsmoment.
Målet är att få ett fungerande OS, inte ett högpresterande OS. Dessutom behöver jag inte hård RTOS-funktionalitet.
Jag kommer försöka göra så mycket som möjligt själv och inte förlita mig på färdiga vendor-bibliotek.
Jag har inte någon detaljerad plan för vad projektet ska innehålla utan kommer att ta saker allt eftersom jag kommer på att jag behöver dem.
Ja, jag vet att alla "experter" säger att man sparar mycket tid på att planera noggrannt först men det är så tråkigt.
Jag läste någonstans att det kallas för "big bang"-metoden, man slänger ihop olika delar tills allt exploderar. Sen bygger man något nytt av resterna som överlever.
Tänkta funktioner för mitt OS (härefter kallat mos tills jag kommer på något bättre namn)
Multitasking
├ Preemptive multitasking. En process som tar mycket processortid ska inte kunna låsa systemet.
├ Starta processer från filsystemet. Så att användarprocesser inte behöver hårdkodas. Ger en modulär design där man kan uppdatera specifika delar utan att starta om hela systemet.
└ Virtuellt minne (utan swap space). För att isolera processer från varandra. En kraschande process ska inte kunna ta någon annan med sig i fallet.
Filsystem
├ Något standard-filsystem, exakt vilket ej bestämt ännu. För att enkelt kunna överföra filer mellan mos och pc via sd-kort. FAT är enkelt, men lite väl begränsat.
├ Abstrakt fil-API. En process ska inte behöva bekymra sig över om filen ligger på sd, flash, eller någon annanstans utan samma API används till allt och OSet ser till att det blir rätt.
└ Kanske NFS och/eller SMB. (Ska det tillhöra filsystemet eller nätverket?)
Nätverk
├ 802.1Q VLAN.
├ IPv4 är ett måste. Kanske v6 också beroende på senare behov.
├ SSL/TLS, kanske IPSec. Osäker på om SSL ska räknas till nätverkssystemet eller ligga på en högre nivå.
└ Kanske NFS och/eller SMB. (Ska det tillhöra filsystemet eller nätverket?)
Övrigt
└ Saker som jag behöver som jag inte vet om än..
Tidsbudget
Ingen. Det är ett hobbyprojekt utan deadline.
Ja det är ett stort projekt att göra ensam, men jag är ihärdig.
Hårdvara
Ett Z-Turn devboard. En ZYNQ z7020, mest för att jag hade en tillgänglig. Kan ju också vara kul att lägga diverse hjälpfunktioner i FPGA-delen.
├ 2x ARM-A9 CPU.
├ 512MB DDR3.
├ Gigabit ethernet.
├ USB-host. Främst till extern lagring. Kanske fullt host-stöd senare om tid finns.
├ HDMI. Kanske. Systemet kommer primärt fjärrstyras via nätverket men det kan ju vara kul med lokal kontroll.
└ Kanske extern wifi. Jag har en microchip MRF24WB0MA som inte används till någonting men dokumentationen till den är väldigt dålig.
Mjukvara & dokumentation
Vivado webpack, med tillhörande mjukvaru-SDK. (usch, eclipsebaserat..)
Diverse datablad.
Google.
All kod tillhörande projektet kommer att laddas upp någonstans (github?) med en "gör vad du vill"-licens i de fall det är möjligt. Om jag måste använda tredjepartsbibliotek gäller givetvis deras egen licens.
Korta snuttar kan också komma att postas här i tråden med förklaringar om jag tycker det behövs (fråga gärna efter någonting om ni tycker att det fattas) men tanken är att tråden främst ska dokumentera utvecklingsprocessen och inte bara vara en koddump.
Första steget blir att skapa boot-kod (och lära mig ARM-assembler) för att få en processor i ett körbart läge (tvåkärnigt sparas till senare), och sen tända en LED för att visa att den lever.
Ingen bootloader ännu, kommer att starta över JTAG tillsvidare.
Fler uppdateringar följer..