[LINUX] Portez FreeRTOS vers Raspberry Pi 4B

introduction

Lorsque je voulais intégrer Unikernel dans un système embarqué d'une bonne manière, j'avais besoin d'un équipement capable de faire fonctionner RTOS et Linux en même temps, alors je l'ai porté comme le titre le suggère.

Je pense qu'il existe de nombreuses configurations de démarrage indépendantes de FreeRTOS lors du portage pour Raspberry Pi, mais cette fois, FreeRTOS vous permet de démarrer simultanément avec Linux après avoir quitté u-boot.

Ce serait très facile si vous apportiez un SoC i.MX8M ou ZynqMP qui a déjà une implémentation qui exécute RTOS et Linux en même temps, mais si vous utilisez Raspai, cela devrait vous faire économiser de l'argent et acquérir des connaissances.

Dépôt

Il peut être trouvé ici (https://github.com/TImada/raspi4_freertos). Voir README.md pour savoir comment le construire et l'utiliser.

L'implémentation de base est @eggman FreeRTOS pour Raspberry Pi 3. Merci pour les efforts de nos prédécesseurs m (_ _) m.

À propos de la transplantation

Ce qui a changé depuis l'implémentation de base

  1. Comme il est basé sur le «démarrage à partir de u-boot» et le «démarrage simultané avec Linux», la routine de démarrage est modifiée pour fonctionner à partir d'EL2.
  2. Modification du binaire FreeRTOS pour qu'il fonctionne sur le cœur du processeur n ° 3 (le cœur du processeur n ° 0-2 est pour Linux)
  3. Raspberry Pi 4B peut maintenant utiliser GIC comme contrôleur d'interruption, alors changez-le pour l'utiliser
  4. UART a changé pour utiliser UART2 (par PL011) (UART1 est pour Linux)
  5. Ajout d'une routine pour gérer les changements de configuration GIC par Linux afin qu'il puisse être démarré simultanément avec Linux.
  6. Mettez à jour la version du noyau FreeRTOS vers la v10.3.0

Conseils de mise en œuvre

Coup de pied binaire sur le cœur du processeur n ° 3

Comme décrit en détail dans article de commentaire sur le stub code Raspberry Pi, la zone de mémoire jusqu'à 0xD8 --0xF7 est de 8 octets. Chacun est étiqueté spin_cpuX: X = 0,1,2,3. Si vous voulez lancer le binaire avec le cœur de processeur n ° 3, écrivez l'adresse de début de la table vectorielle dans spin_cpu3 (= adresse 0xF0) et émettez l'instruction SEV, et le cœur de processeur n ° 3 commencera à fonctionner correctement.

Dans ce portage, j'ai laissé l'adresse de la table vectorielle écrire à l'adresse 0xF0 à la commande u-boot mw, mais lorsque cette commande est exécutée sur le cœur du processeur n ° 0, le résultat de l'écriture reste dans le cache et est stocké dans la mémoire physique. Il y avait une situation où cela ne se reflétait pas (Alee ...). CPU core # 3 définit le compteur de programme en regardant la valeur à l'adresse 0xF0, mais si la valeur n'est pas reflétée dans la mémoire physique, la valeur à l'adresse 0xF0 reste 0x0. À ce moment, le cœur de processeur n ° 3 a un code de stub implémenté de sorte que l'instruction WFE soit émise et qu'une sieste soit effectuée.

Pour résoudre ce problème, ce serait bien si la commande dcache flush de u-boot pouvait être utilisée, mais u-boot inclus dans Ubuntu 20.04 LTS pour Raspberry Pi 4B n'avait pas cette commande, donc u-boot J'ai dû recompiler ...

Démarrage simultané avec Linux

Si vous lancez Linux après avoir expulsé l'exemple FreeRTOS de l'invite u-boot, Linux définira GIC pour Linux et la configuration GIC que vous avez définie précédemment dans FreeRTOS sera écrasée (en particulier le problème). C'était une réécriture des paramètres du distributeur GIC par Linux). Si cela se produit, le chronomètre et les interruptions UART n'entreront pas.

Donc, cette fois, j'ai implémenté un mécanisme du côté FreeRTOS pour détecter le moment où Linux termine le paramètre GIC Distributor, et FreeRTOS réinitialise le paramètre GIC une fois que Linux a terminé le paramètre GIC. Mécanisme de détection est un processus de boucle occupée x2 qui n'est pas convivial pour la Terre. A terme, nous devrons repenser la méthode.

Implémentation de code pour UART2 (PL011)

Si vous le connaissez, vous l'avez peut-être déjà remarqué. En fait, si vous utilisez UART1 (mini UART) du côté FreeRTOS, vous n'avez pas besoin de vous soucier d'implémenter UART2 car UART1 était déjà dans l'implémentation de base.

Oui, bien sûr, je le savais, mais j'ai osé le faire. Sourire.

Prochaine étape

Porté remoteproc / rpmsg afin que Linux et FreeRTOS puissent communiquer.

Recommended Posts

Portez FreeRTOS vers Raspberry Pi 4B
J'ai parlé à Raspberry Pi
Présentation de PyMySQL à Raspberry pi3
raspberry pi 1 modèle b, python
Raspberry pi 1 modèle b, partie rouge noeud 17
Sortie du Raspberry Pi vers la ligne
[Raspberry Pi] Changement par défaut de Python en Python3
Connectez deux caméras USB au Raspberry Pi 4
Démarrage USB sur Raspberry Pi 4 modèle B
Construire un environnement OpenCV-Python sur Raspberry Pi B +
Comment installer NumPy sur Raspeye
Pourquoi detectMultiScale () est lent sur Raspberry Pi B +
Comment utiliser Raspeye Pie Camera Python
Introduction de Ceph avec Kubernetes sur Raspberry Pi 4B (ARM64)
Connectez votre Raspberry Pi à votre smartphone en utilisant Blynk
Connectez-vous à MySQL avec Python sur Raspberry Pi
Suivi GPS avec Raspeye 4B + BU-353S4 (Python)
De la configuration du Raspberry Pi à l'installation de l'environnement Python
Mémo de la migration de la base de données de Django de SQLite3 vers MySQL sur Docker sur Raspberry Pi 4B
Exécutez la matrice LED de manière interactive avec Raspberry Pi 3B + sur Slackbot
Qu'est-ce que Raspberry Pi?
IoT facile pour démarrer avec Raspeye et MESH
GPGPU avec Raspberry Pi
Visualisons la pièce avec tarte aux râpes, partie 1
Comment utiliser Raspeye Relay Module Python
pigpio sur Raspberry pi
Caméra vidéo Raspberry Pi
Mauvaise connaissance Raspberry Pi
Faisons Raspberry Pi?
Démarrage USB avec Raspberry Pi 4 modèle B (3) édition LVM
Contrôler la mise sous / hors tension du port USB du Raspberry Pi
DigitalSignage avec Raspberry Pi
Notes de configuration du Raspberry Pi 4
Sortie sur "LED 7 segments" en utilisant python avec Raspberry Pi 3!
Cython sur Raspberry Pi
Introduction facile au piratage domestique avec Raspberry Pi et discord.py
Mettre à jour Raspberry Pi Python vers 3.7 ou version ultérieure avec pyenv
[Remarque] Installation de vmware ESXi sur Arm Fling sur Raspeye 4B
[Raspberry PI & Garmin GLO] Jusqu'à ce que le GPS Bluetooth soit connecté à Raspberry PI & Garmin GLO
Exécutez l'exemple de code python BNO055 avec I2C (Raspberry Pi 3B)
Je souhaite désactiver les interruptions sur le Raspberry Pi (≒ DI / EI)
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
getrpimodel: Reconnaître le modèle Raspberry Pi (A, B, B +, B2, B3, etc.) avec python
Changer le message affiché lors de la connexion à Raspberry Pi
Comment obtenir la température du thermo-hygromètre SwitchBot à l'aide de Raspberry Pi
[Raspberry Pi] Mémo de création de pilote de périphérique minimal pour la sortie GPIO
Connectez Raspberry Pi à Alibaba Cloud IoT Platform avec «Python»
J'ai envoyé les données de Raspberry Pi à GCP (gratuit)
Surveillance intérieure à l'aide de Raspberry Pi
Plantes Mutter avec Raspberry Pi
Installation du système d'exploitation Raspberry Pi (Raspbian)
Raspeye + Python + Mémo OpenGL
Paramètres initiaux de Raspbian (Raspberry Pi 4)
Introduction de pyenv sur Raspberry Pi
Utilisez NeoPixel avec la tarte aux framboises
Installez OpenCV4 sur Raspberry Pi 3