<div><font>Χαιρετώ τη λίστα.</font><br></div><div><font><br></font></div><div><font>Ας το κάνω σαφές από την αρχή. Αυτό το mail ΔΕΝ αφορά το GNU/Linux, ούτε καν πυρήνα τύπου UNIX με fork κτλ. Αφορά howto kernel dev για συνυπάρξεις μαζί με την GNU libc.<br>
</font></div><div><font><br></font></div><div><font>Πρόκειται για ένα πυρήνα για Cortex-M3/M4 τον "pkernel" εκ του pico-kernel, που γράφω εδώ και 2-3 βδομάδες και που ελπίζω σύντομα να δει το web/φως της δημοσιότητας.<br>
</font></div><div><font>Γενικά έχει (θέλω επιείκεια είμαι ηλεκτρονικός και όχι μηχανικός λογισμικού):<br></font></div><div><font>- Μpreemtive multitasking με priorities (nice και fit)<br></font></div><div><font>- Semaphores / mutexes<br>
- Privileged mode για όλους και όλα<br></font></div><div><font>- Sleep, wait, και lock μπορούν να κάνουν suspend<br></font></div><div><font>- και άλλα καλούδια για μας τους ηλεκτρονικούς.<br></font></div><div>
<font>- και μέχρι στιγμής τρέχει (μια χαρά) και κάνει compile χωρίς θεματάκια με τον arm-non-eabi-gcc 4.7</font> <font><br></font></div><div><font><br></font></div><div><font>Τεσπα, στο ζητούμενο. Ο pkernel κάνει χρήση του SysTick για μέτρηση χρόνου και του PendSV για context switching. Στo PendSV "ζει" ο πυρήνας μας, τρέχει ο scheduler και τα άλλα μπουξουσουλούκια και "καλείται" τόσο από το SysTick όσο και ασύγχρονα μέσω sleep(), wait() κτλ. Και αφού το έχουμε που το 'χουμε το SysTick δεν είναι "κρίμα" να μην κοινοποιήσουμε τον χρόνο στην time.h? Μέχρι τώρα υπάρχει ένα ktime.h που παρέχει mktime, time, clock ktl. Αν όμως κάποιος (εγώ δλδ πάλι) θέλει την time.h? Δεν θα ήταν καλό να μπορεί αυτή η ριμάδα να ξέρει την τιμή των μεταβλητών Ticks και Now που κάνω update στον SysTick? Μια σκέψη μου είναι να γίνει tailoring η clock() ή και κάποια άλλη συνάρτηση της time.h. Μια άλλη σκέψη μου είναι να "βρω" που σκατά βρίσκονται οι μεταβλητές για CPU time και να πειράξω εκείνες κρατώντας την ktime.h κρυφή μέσα στον πυρήνα μου και χρησιμοποιώντας τις λειτουργίες της(k_mktime, k_time κτλ) μόνο σε μικρά project που δεν έχει κανείς ανάγκη όλη την time.h. Έχει κανείς καμιά ιδέα για το πως γίνεται κάτι τέτοιο; Πως δηλαδή να πάρω από την clock() και την time() τις μεταβλητές του πυρήνα μου; Οποιαδήποτε άλλη λύση/ ιδέα είναι ευπρόσδεκτη.<br>
</font></div><div><font><br></font></div><div><font>Και μην νομίζετε ότι αυτό ήταν. Έχει και δεύτερη ερώτηση.<br></font></div><div><font>Αυτή τη στιγμή όταν ο πυρήνας ξεκινάει (καλείται από την main πχ) "ψάχνει" τις μεταβλητές που κάνει export το Link script _eram, _ebss, ..., _pulStack (δείτε διάγραμμα παρακάτω). Από ότι έχω καταλάβει το linker script τα βάζει όλα καλά και τακτοποιημένα, και μπορείς να δεσμεύσεις το χώρο (_eram - pulStack) για kernel stack.</font></div>
<div><font>Αλλά.....όταν θές heap, κανεις Link με libc και κλήση της malloc, τότε οι μεταβλητές γίνονται allocate, μετά το </font>
<font>pulStack + STACK_SIZE. Το οποίο είναι μλκία(sorry) γιατί κόβει στη μέση τον ωραίο χώρο</font><font> που είχαμε για kernel stack. Σας κάνω attach το script αν θέλετε, αλλά είναι το κλασικό script χωρίς να το έχω πειράξει καθόλου. Οπότε ερχόμαστε πάλι στην ίδια λύση. Ξέρει κανείς αν μπορώ να γράψω την δική μου malloc/free και να μην "χαλάσω" τη stdlib.h? Αν το κάνω αυτό τότε μπορώ να χρησιμοποιήσω αυτή τη malloc για να κάνω allocation μνήμη και για τα processes μου, ενώ τώρα έχω μια "μπακατέλα".<br>
</font></div><div><font><br></font></div><div><font>Ευχαριστώ<br></font></div><div><font> </font></div><div><font>  ----------------                  <br>|                                | <- _eram      <br>|                                |                 </font></div>
<div><font>|                                |           <br>|                                |            <br>|                                |              <br>   -  -  -  -  -  -                     |<- pulStack + STACK_SIZE<br>
|     Startup's    |                <br>|        stack          | <- pulStack   </font></div><div><font>----------------                 ---<br>|                                | <- _ebss</font></div><div><font>|                    .bss      |</font></div>
<div><font>|                                | <- _sbss / _edata<br> ----------------</font></div><div><font>|                                |<br>|                   .data      |<br>|                  .sdata     | <- _sdata<br>
</font></div><div><font>------------------<br></font></div><div><font><br></font></div><div><font><br></font></div><div>
<font>Συγνώμη για το μακροσκελές, εκτός θέματος μήνυμα.</font><font><br></font></div><div><font><br></font></div><div><font>ΥΓ: Αν πάλι θέλετε μπορώ να ανεβάσω κάπου και όλο τον κώδικα. Ούτως ή άλλως στο τέλος θα τον post-άρω κάπου.<br>
</font></div><div><font><br></font></div><div><font>--<br></font></div><div><font>Χουτουρίδης Χρήστος<br></font></div>