BSP et pilotes standalone
Comprendre la bibliothèque C embarquée, la structure d'un BSP et les deux niveaux de pilotes utilisés par une application Vitis.
Chargement…
Comprendre la bibliothèque C embarquée, la structure d'un BSP et les deux niveaux de pilotes utilisés par une application Vitis.
Le BSP relie le domaine logiciel au matériel exporté. Il fournit les pilotes, bibliothèques et services de démarrage pour le processeur choisi.
Une plateforme Vitis associe le XSA à un ou plusieurs domaines. Chaque domaine choisit processeur, système d'exploitation et BSP. En standalone, l'application utilise directement ces services, sans Linux.
| Élément | Rôle |
|---|---|
| En-têtes générés | Adresses, identifiants et paramètres du matériel |
| Pilotes | Accès aux périphériques du PS et de la PL |
| Bibliothèques | C standard, fichiers, réseau et services système |
| Code de démarrage | Table des vecteurs, initialisation et gestion des exceptions |
La bibliothèque C, généralement basée sur Newlib dans ce flux, fournit notamment memcpy, printf et l'allocation. Les services qui supposent un système d'exploitation demandent une adaptation. Vérifiez la bibliothèque effective de la chaîne utilisée.
#include "xparameters.h"
#define LED_BASEADDR XPAR_FPT_LED_BANK_BASEADDR
#define TIMER_ID XPAR_XTTCPS_0_DEVICE_IDxparameters.h contient adresses, identifiants, interruptions et certaines fréquences. Les noms dépendent des instances et du flux de génération. Après un changement matériel, mettez à jour XSA, plateforme et BSP avant de reconstruire.
Les flux plus récents peuvent utiliser des adresses de base à la place des identifiants historiques. Lisez les signatures dans le BSP réel plutôt que de conserver une API incompatible.
Le niveau 0 accède directement aux registres :
#include "xgpio_l.h"
void leds_write(UINTPTR base, u32 value)
{
XGpio_WriteReg(base, XGPIO_TRI_OFFSET, 0x0U);
XGpio_WriteReg(base, XGPIO_DATA_OFFSET, value & 0xFFU);
}Il convient à une séquence courte lorsque base, offsets et ordre d'accès sont maîtrisés. Le niveau 1 conserve une instance et vérifie son initialisation :
XGpio gpio;
int gpio_init(void)
{
int status = XGpio_Initialize(&gpio, XPAR_FPT_LED_BANK_DEVICE_ID);
if (status != XST_SUCCESS) {
return XST_FAILURE;
}
XGpio_SetDataDirection(&gpio, 1, 0x0U);
return XST_SUCCESS;
}Cette structure facilite les instances multiples et callbacks. Chaque retour doit être contrôlé ; une configuration absente ne doit pas conduire à un accès ultérieur.
XilFFS apporte FAT pour SD/eMMC ; lwIP apporte une pile réseau. Flash et autres services peuvent ajouter code et buffers. Choisissez selon mémoire disponible, modèle d'exécution et besoin réel.
init_platform() et cleanup_platform() exécutent les opérations de platform.c. Selon la cible, elles gèrent notamment caches ou UART standard. Elles ne remplacent pas l'initialisation ni la libération des périphériques applicatifs.
int main(void)
{
int status;
init_platform();
status = gpio_init();
if (status != XST_SUCCESS) {
xil_printf("GPIO initialization failed\r\n");
cleanup_platform();
return XST_FAILURE;
}
XGpio_DiscreteWrite(&gpio, 1, 0x55U);
cleanup_platform();
return XST_SUCCESS;
}Ce main complète les déclarations et la fonction gpio_init précédentes ; il requiert aussi les en-têtes BSP et platform.h. Il traite l'échec avant de poursuivre et appelle le nettoyage sur les deux chemins de retour. Une boucle infinie aurait un autre cycle de vie.
Les guides Vitis UG1400 décrivent les domaines et le BSP. Les sources embeddedsw permettent de vérifier les pilotes utilisés.
Tester mes connaissances - Quiz du chapitre