Unification des sources CM4/CM5 : makefiles scindés (common/cm4/cm5/cm5.debug), #ifdef CIBLE_CM5 pour GPIO, correctifs get_ip_address()/signal handler/backtrace, portabilité 32/64 bits

This commit is contained in:
2026-09-23 14:51:33 +02:00
parent 8fe204361b
commit fdf08bf1d7
23 changed files with 373 additions and 154 deletions
+48 -18
View File
@@ -10,7 +10,8 @@
// Prototypes :
int8_t init(void);
void sigintHandler(int dummy);
void sigintHandler(int32_t signal);
void sigfatalHandler(int32_t signal);
void lancement_reinit(uint16_t tempo);
int8_t analyse_signal(void);
int8_t init_signaux(void);
@@ -323,6 +324,7 @@ int8_t retour = 0;
return(retour);
}
//==================================================================================================================================================================
// Fonction : Initialisation des handlers de signaux (vers une seule et même fonction).
// Reçoit : Rien
@@ -331,41 +333,45 @@ int8_t retour = 0;
int8_t init_signaux(void)
{
systeme.faucheuse.signal_recu = SYSTEME_SIGNAL_AUCUN;
// Signaux ne permettant pas de traitement à proprement parler (fatal) :
// On utilise alors un gestionnaire de signaux dédié...
signal(SIGILL, sigfatalHandler); // 4 SIGILL Instruction illégale
signal(SIGTRAP, sigfatalHandler); // 5 SIGTRAP Trace trap
signal(SIGABRT, sigfatalHandler); // 6 SIGABRT (ANSI) Instruction (ABORT)
signal(SIGBUS, sigfatalHandler); // 7 SIGBUS Bus error
signal(SIGFPE, sigfatalHandler); // 8 SIGFPE Floating-point exception - Exception arithmétique
signal(SIGSEGV, sigfatalHandler); // 11 SIGSEGV Violation de mémoire
signal(SIGSYS, sigfatalHandler); // 31 SIGSYS Erreur d'appel système
signal(SIGHUP, sigintHandler); // 1 SIGHUP Instruction (HANG UP) - Fin de session
signal(SIGINT, sigintHandler); // 2 SIGINT Interruption
// Signaux moins violents, permettant un traitement après réception :
signal(SIGHUP, sigintHandler); // 1 SIGHUP Instruction (HANG UP) - Fin de session
signal(SIGINT, sigintHandler); // 2 SIGINT Interruption
signal(SIGQUIT, sigintHandler); // 3 SIGQUIT Instruction (QUIT)
signal(SIGILL, sigintHandler); // 4 SIGILL Instruction illégale
signal(SIGTRAP, sigintHandler); // 5 SIGTRAP Trace trap
signal(SIGABRT, sigintHandler); // 6 SIGABRT (ANSI) Instruction (ABORT)
signal(SIGIOT, sigintHandler); // 6 SIGIOT (BSD) IOT Trap
signal(SIGBUS, sigintHandler); // 7 SIGBUS Bus error
signal(SIGFPE, sigintHandler); // 8 SIGFPE Floating-point exception - Exception arithmétique
signal(SIGKILL, sigintHandler); // 9 SIGKILL Instruction (KILL) - termine le processus immédiatement
signal(SIGIOT, sigintHandler); // 6 SIGIOT (BSD) IOT Trap
signal(SIGKILL, sigintHandler); // 9 SIGKILL Instruction (KILL) - termine le processus immédiatement. En pratique, inutile car toujours intercepté par le noyau...
signal(SIGUSR1, sigintHandler); // 10 SIGUSR1 Signal utilisateur 1
signal(SIGSEGV, sigintHandler); // 11 SIGSEGV Violation de mémoire
signal(SIGUSR2, sigintHandler); // 12 SIGUSR2 Signal utilisateur 2
signal(SIGPIPE, sigintHandler); // 13 SIGPIPE Broken PIPE - Erreur PIPE sans lecteur
signal(SIGALRM, sigintHandler); // 14 SIGALRM Alarme horloge
signal(SIGTERM, sigintHandler); // 15 SIGTERM Signal de terminaison
signal(SIGSTKFLT, sigintHandler); // 16 SIGSTKFLT Stack Fault
signal(SIGCHLD, sigintHandler); // 17 SIGCHLD ou SIGCLD modification du statut d'un processus fils
signal(SIGCLD, sigintHandler); // 17 SIGCHLD ou SIGCLD modification du statut d'un processus fils
signal(SIGCLD, sigintHandler); // 17 SIGCHLD ou SIGCLD modification du statut d'un processus fils
signal(SIGCONT, sigintHandler); // 18 SIGCONT Demande de reprise du processus
signal(SIGSTOP, sigintHandler); // 19 SIGSTOP Demande de suspension imbloquable
signal(SIGSTOP, sigintHandler); // 19 SIGSTOP Demande de suspension imbloquable. En pratique, inutile car toujours intercepté par le noyau...
signal(SIGTSTP, sigintHandler); // 20 SIGTSTP Demande de suspension depuis le clavier
signal(SIGTTIN, sigintHandler); // 21 SIGTTIN lecture terminal en arrière-plan
signal(SIGTTOU, sigintHandler); // 22 SIGTTOU écriture terminal en arrière-plan
signal(SIGURG, sigintHandler); // 23 SIGURG évènement urgent sur socket
signal(SIGURG, sigintHandler); // 23 SIGURG évènement urgent sur socket
signal(SIGXCPU, sigintHandler); // 24 SIGXCPU temps maximum CPU écoulé
signal(SIGXFSZ, sigintHandler); // 25 SIGXFSZ taille maximale de fichier atteinte
signal(SIGVTALRM, sigintHandler); // 26 SIGVTALRM alarme horloge virtuelle
signal(SIGPROF, sigintHandler); // 27 SIGPROF Profiling alarm clock
signal(SIGWINCH, sigintHandler); // 28 SIGWINCH changement de taille de fenêtre
signal(SIGPOLL, sigintHandler); // 29 SIGPOLL (System V) occurence d'un évènement attendu
signal(SIGIO, sigintHandler); // 29 SIGIO (BSD) I/O possible actuellement
signal(SIGPWR, sigintHandler); // 30 SIGPWR Power failure restart
signal(SIGSYS, sigintHandler); // 31 SIGSYS Erreur d'appel système
signal(SIGIO, sigintHandler); // 29 SIGIO (BSD) I/O possible actuellement
signal(SIGPWR, sigintHandler); // 30 SIGPWR Power failure restart
return(0);
}
@@ -375,7 +381,7 @@ int8_t init_signaux(void)
// Fonction : Handler unique de tous les signaux. Récupére la valeur du signal et met à jour la variable globale correspondante.
// ATTENTION : il ne faut PAS faire de printf (ou équivalent) ici car il y a des restrictions dans les signals handlers.
// En l'occurence, le traitement en fonction du numéro de signal est fait dans la fonction 'analyse_signal()' ci-dessus.
// Reçoit : Rien
// Reçoit : Signal reçu
// Retour : Rien
//==================================================================================================================================================================
void sigintHandler(int32_t signal)
@@ -385,3 +391,27 @@ void sigintHandler(int32_t signal)
}
//==================================================================================================================================================================
// Fonction : Handler des signaux d'erreur fatale. Dans ce cas, un 'return' n'est pas acceptable car il ne débouchera, au mieux, que sur la répétition de
// l'erreur sans traitement possible.
// Reçoit : Signal reçu
// Retour : Rien
//==================================================================================================================================================================
void sigfatalHandler(int32_t signal)
{
// Uniquement des fonctions "async-signal-safe" ici : pas de sprintf/printf classiques, pas de mutex, pas de malloc. write() sur un fd est sûr :
const char msg[] = "/!\\ Signal fatal recu (SIGSEGV/SIGBUS/SIGILL/SIGFPE) - Arret immediat....\n"; // Pas d'accents...
write(STDERR_FILENO, msg, sizeof(msg) - 1);
// Optionnel : capturer une pile d'appel avant de sortir (backtrace() est généralement sûr en pratique même si pas garanti strictement async-signal-safe) :
void *tab[20];
int n = backtrace(tab, 20);
char buf[64];
int len = sprintf(buf, "La fontion backtrace() a retourne %d frame(s) :\n", n); // Pas d'accents...
write(STDERR_FILENO, buf, len);
if (n > 0) backtrace_symbols_fd(tab, n, STDERR_FILENO);
_exit(1); // JAMAIS return ici, et de préférence _exit() plutôt que exit() qui appelle des handlers atexit/flush non signal-safe
}