ESP32-C3 débugger un serveur web

Bonjour à tous,

J'ai à nouveau (ou pas encore vu) un plantage sur mon ESP32 mais pas le même que le précédent.
Au moins j'arrive à le reproduire assez précisément, c'est déjà ça...

Serveur réalisé classiquement avec

#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <LittleFS.h> 

Le plantage

E (46034) task_wdt: Task watchdog got triggered. The following t00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fcbee00: 0x00000004 0x00000003 0x3fcd07a8 0x00000002 0x3fcb1000 0xffffffff 0x3fcd07a8 0x4200f6c6
3fcbee20: 0x3fcb1000 0xffffffff 0x3fcd0780 0x42035f94 0x00000000 0x00000000 0x00000000 0x3fcd0780
3fcbee40: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x4038e200
3fcbee60: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fcbee80: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xbaad5678
3fcbeea0: 0x00000a0c 0xabba1234 0x00000a00 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeec0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeee0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5

a lieu systématiquement quand, depuis le navigateur, je recharge la page et le cache du navigateur (CTRL-MAJ-R ou MAJ-F5)

l'IHM web comporte pas mal de fichiers (.html, .css, .js, .png et trois polices .ttf)

J'ai l'impression que c'est là que ça coince, je vais essayer d'être clair.

Point 1 : Je suis obligé de servir ces fonts :

  • l'IHM n'est pas à priori relié à internet (pas possible d'utiliser les googlefonts par exemple)
  • deux sont peu courantes et pas forcément sur le PC de l'utilisateur (OK c'est un caprice esthétique), la troisième est totalement perso

Point 2 : Les fonts sont « appelées » par le CSS :

@font-face {
        font-family: oxanium;
        font-style: normal;
        src: url("./Oxanium-Regular.ttf");
}
@font-face {
        font-family: oxanium;
        font-weight: bold;
        src: url("./Oxanium-Bold.ttf");
}
@font-face {
        font-family: icons;
        font-style: normal;
        src: url("./icons.ttf");
}
body {
  font-family: oxanium, Helvetica, Arial, sans-serif;
  font-size: 1.5rem;
}
// couic la suite du CSS

Point 3 : si je commente la partie

// polices de caractère
   server.on("/Oxanium-Bold.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
     request->send(LittleFS, "/Oxanium-Bold.ttf", "application/octet-stream");
   });
   server.on("/Oxanium-Regular.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
     request->send(LittleFS, "/Oxanium-Regular.ttf", "application/octet-stream");
   });
   server.on("/icons.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
     request->send(LittleFS, "/icons.ttf", "application/octet-stream");
   });

C'est moche (bascule sur les polices par défaut du CSS) mais ça ne plante plus !

Point 4 : Ce qui m'a mis la puce à l'oreille, c'est qu'en accédant à l'IHM avec un smartphone qui n'a pas la police installée, le plantage est immédiat au premier chargement. Mon ordi l'a, c'est peut-être pour ça que je n'ai pas vu très vite le bug.

Est-ce que quelqu'un a une idée de l'origine et/ou d'une solution ?

ce serait pas mal de passer les codes hexa dans le décodeur pour voir où ça plante

Ce que j'ai tenté : comprendre quand/comment sont servis les fichiers.

J'ai ajouté un mouchard à chaque fichier :

void serv_fichiers() {
  // pour la racine, servir index.html en GET et POST
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("--1"); Serial.flush();
    request->send(LittleFS, "/index.html", String(), false, processor);
  });
  server.on("/", HTTP_POST, [](AsyncWebServerRequest *request){
Serial.println("--2"); Serial.flush();
    request->send(LittleFS, "/index.html", String(), false, processor);
  });
  server.on("/index.html", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("--3"); Serial.flush();
    request->send(LittleFS, "/index.html", String(), false, processor);
  });
//  etc...

// polices de caractère
   server.on("/Oxanium-Bold.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("-16"); Serial.flush();
     request->send(LittleFS, "/Oxanium-Bold.ttf", "application/octet-stream");
   });
   server.on("/Oxanium-Regular.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("-17"); Serial.flush();
     request->send(LittleFS, "/Oxanium-Regular.ttf", "application/octet-stream");
   });
   server.on("/icons.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("-18"); Serial.flush();
     request->send(LittleFS, "/icons.ttf", "application/octet-stream");
   });

Ça ne m'aide absolument pas : les Serial.println("-xx"); Serial.flush(); n'apparaissent quasiment jamais dans dans console série ???? :thinking: malgré le flush()

Merci de ta réponse rapide...
Comment fait-on cela ?

avec le exception stack decoder

PS: le MIME type pour vos fonts est incorrect, ce serait sans doute plus font/ttf normalement

server.on("/Oxanium-Bold.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send(LittleFS, "/Oxanium-Bold.ttf", "font/ttf");
});
server.on("/Oxanium-Regular.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send(LittleFS, "/Oxanium-Regular.ttf", "font/ttf");
});
server.on("/icons.ttf", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send(LittleFS, "/icons.ttf", "font/ttf");
});

Vous pourriez aussi envisager de réduire la taille des fichiers. .ttf (TrueType Font) est non compressé, donc généralement le plus volumineux. Si vous passez en .woff2 ce sera plus compact.

Merci pour votre disponibilité et compétences hors norme !
Je regarde ça dès que possible et je reviens !

Je n'ai pas laissé tombé... c'est juste que le "décodeur hexa" ne fonctionne pas avec l'EDI 2.3.2 et que mon code ne compile pas avec l'EDI 1.8.19.

Faudrait pas non plus que je m'ennuie :wink:

ah il y a une autre version pour l'IDE 2.x

j'avais posté un lien, faut que je le retrouve

j'ai retrouvé le lien

Bonjour

Cette version de décodeur ne semble pas pouvoir gérér les ESP32-C3, -C6 .... avec des coeurs RISC-V

ici intervention de igrr :slight_smile: Exception decoding for RISC-V chips (ESP32-C3, C6, H2, etc) · Issue #6 · dankeboy36/esp-exception-decoder · GitHub

Il y a un truc que je ne fais pas bien... (ou le décodeur mais c'est moins probable) :

ESP Exception Decoder
Sketch: kelvin_V5_debug FQBN: esp32:esp32:esp32c3

3fcbed20: 0x3fcbedac 0x00000000 0x3fcb94e4 0x4038be9e 0x00000000 0x3fcd27b4 0x0000059c 0x0000001d
3fcbed40: 0x00000000 0x00000000 0x00000000 0x00009eac 0x00000004 0x00000003 0x3fcd14d8 0x00000002
3fcbed60: 0x3fcb1000 0xffffffff 0x3fcd05a0 0x4204a322 0x00000004 0x00000003 0x3fcd05c8 0x3fcbedac
3fcbed80: 0x3fcb1000 0xffffffff 0x3fcd05a0 0x4204a154 0x3fcb1000 0xffffffff 0x3fcd05a0 0x42035b24
3fcbeda0: 0x00000000 0x00000000 0x00000000 0x3fcd05a0 0x00000000 0x00000000 0x00000000 0x00000000
3fcbedc0: 0x00000000 0x00000000 0x00000000 0x4038e200 0x00000000 0x00000000 0x00000000 0x00000000
3fcbede0: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee00: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xbaad5678 0x00000a0c 0xabba1234 0x00000a00 0xa5a5a5a5
3fcbee20: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee40: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee60: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee80: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeea0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeec0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeee0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef00: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef20: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef40: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef60: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef80: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbefa0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbefc0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbefe0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbf000: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5


Could not recognize stack trace/backtrace

Paste exception to decode...

Edit : j'avais pas vu la modif de @al1fch c'est peut-être ça ?

Maintenant que ça compile aussi avec l'IDE 1.8.19 j'ai testé : ça marche pas mieux, le "décodeur" reste muet...

Il faut copier coller le texte dans le décodeur

C'est ce que j'ai fait... Enfin je pense !

J'explique exactement ce que j'ai fait :

compilation - upload - démarrage - MAJ+F5 - plantage

Sur la console série il affiche alors :


assert failed: tcp_recved /IDF/components/lwip/lwip/src/core/tcp.c:985 (don't call tcp_recved for listen-pcbs)
Core  0 register dump:
MEPC    : 0x40381db8  RA      : 0x4038b38e  SP      : 0x3fcbec20  GP      : 0x3fc93200  
TP      : 0x3fc7a838  T0      : 0x61632074  T1      : 0x696c2072  T2      : 0x276e6f64  
S0/FP   : 0x00000001  S1      : 0x3fcbedbe  A0      : 0x3fcbec84  A1      : 0x3fc95389  
A2      : 0x00000001  A3      : 0x00000029  A4      : 0x00000001  A5      : 0x3fcb1000  
A6      : 0x6263702d  A7      : 0x6e657473  S2      : 0x00000059  S3      : 0x3fcbec78  
S4      : 0x3fcbec78  S5      : 0x4203988c  S6      : 0x00000004  S7      : 0x3c15c67c  
S8      : 0x00000000  S9      : 0x00000000  S10     : 0x00000000  S11     : 0x00000000  
T3      : 0x6f662064  T4      : 0x65766365  T5      : 0x725f7063  T6      : 0x74206c6c  
MSTATUS : 0x00001801  MTVEC   : 0x40380001  MCAUSE  : 0x00000007  MTVAL   : 0x00000000  
MHARTID : 0x00000000  

Stack memory:
3fcbec20: 0x3fcb1000 0x3fcb1000 0x3c15c73c 0x40391306 0x00000002 0x3fcd94f8 0x3fcb92b4 0x3fc95388
3fcbec40: 0x00000000 0x00000000 0x3fcbff64 0x00353839 0x3c15be3c 0x3fc956c0 0x3c15cc34 0x3fc95a7c
3fcbec60: 0x3c15c67c 0x3fc956d0 0x3fcbec4c 0x3fc956d4 0x3c15c73c 0x3fc95388 0x00000000 0x00000000
3fcbec80: 0x3f000000 0x65737361 0x66207472 0x656c6961 0x74203a64 0x725f7063 0x65766365 0x492f2064
3fcbeca0: 0x632f4644 0x6f706d6f 0x746e656e 0x776c2f73 0x6c2f7069 0x2f706977 0x2f637273 0x65726f63
3fcbecc0: 0x7063742f 0x393a632e 0x28203538 0x276e6f64 0x61632074 0x74206c6c 0x725f7063 0x65766365
3fcbece0: 0x6f662064 0x696c2072 0x6e657473 0x6263702d 0x3f002973 0x00000003 0x00000004 0x00000000
3fcbed00: 0x00000000 0x00000000 0x00000000 0x00000000 0x3fcd8dd8 0x3fcdaa64 0x0000000a 0x00000001
3fcbed20: 0x3fcbedac 0x00000000 0x3fcb94e4 0x4038bea2 0x00000000 0x00000000 0x3fcb92b4 0x0000001c
3fcbed40: 0x00000000 0x00000014 0x00000000 0xf2ecfadc 0x3fcd7ea2 0x3fcad5a4 0x3fcd07a8 0x00000000
3fcbed60: 0x00000004 0x00000003 0x3fcd0808 0x00000002 0x3fcb1000 0xffffffff 0x3fcd0df0 0x4203988c
3fcbed80: 0x00000008 0x3fcd8b08 0x3fcd0808 0x4200f0ec 0x3fcb1000 0xffffffff 0x3fcd07e0 0x42035a72
3fcbeda0: 0x00000000 0x00000000 0x00000000 0x3fcd07e0 0x00000000 0x00000000 0x00000000 0x00000000
3fcbedc0: 0x00000000 0x00000000 0x00000000 0x4038e200 0x00000000 0x00000000 0x00000000 0x00000000
3fcbede0: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee00: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xbaad5678 0x00000a0c 0xabba1234 0x00000a00 0xa5a5a5a5
3fcbee20: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee40: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee60: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbee80: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeea0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeec0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbeee0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef00: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef20: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef40: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef60: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbef80: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbefa0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbefc0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbefe0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fcbf000: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5



ELF file SHA256: 3d049e69316e4012

Rebooting...
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x3 (RTC_SW_SYS_RST),boot:0xd (SPI_FAST_FLASH_BOOT)
Saved PC:0x40048b82
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5820,len:0x1058
load:0x403cc710,len:0x8a8
load:0x403ce710,len:0x2fa0
entry 0x403cc710

Outils - ESP exception décoder

il affiche « Paste your stack trace here »

Je copie-colle alors la partie en dessous de Stack memory:

Et rien ne se passe.

Pareil si je mets absolument toute la sortie du plantage.

Ok je ne connais pas cette version…

Bonsoir à tous,

Quelques infos pour ceux qui suivent ce sujet (et un grand merci pour les aides apportées)

Je commence à y voir un peu plus clair sur la cause :
ESPAsyncWebServer a du mal à supporter les requêtes simultanées (rafraîchissements trop rapides, accès pas plusieurs clients simultanément, pages complexes avec plusieurs `, etc. De ce que j'ai pu lire, il n'est pas impossible que ce soit aggravé par l'utilisation d'un WebSocket.

Je suis arrivé à avoir un truc un peu plus stable mais en jouant du côté du code HTML : au lieu d'une page classique j'ai une page avec juste le contenu en HTML et dans l'entête un javascript qui va créer dynamiquement les différents <link> pour charger les polices puis la feuille de style, puis les autres JS, etc.

Ça semble à première vue plus stable... Ça plante encore avec des appuis frénétiques sur CTRL-F5 mais en usage normal ça semble (je reste prudent) OK.

Le prix à payer est une interface web un peu moins réactive que souhaitée, mais ça reste très raisonnable.

SI ces diagnostic et solution parlent à certains d'entre vous et/ou cela vous évoque des commentaires/perfectionnements, je suis bien sûr preneur de vos avis !

C’est plutôt l’ESP32 qui a du mal avec cela , n’oubliez pas que ça reste un petit MCU avec un accès mémoire assez lent des qu'on sort de la RAM embarquée pour aller vers la SPI RAM.

En conséquence si le callback qui doit bâtir la réponse est lent, il faut implement une solution qui libère la boucle principale d’évènements du serveur.

Ça peut être par envoi par petits bouts ou création d’une task qui traite la demande et répond plus tard. Il me semble que la bibliothèque ESPAsyncWebServer conserve l'objet AsyncWebServerRequest actif jusqu'à ce que la réponse soit envoyée, permettant ainsi de différer la réponse en toute sécurité même lorsque le pointeur de la requête est passé à une tâche séparée.

et l'ESP32-C3 est un 'petit ESP32' avec un seul coeur (RISC-V), un ESP32-S2 ou ESP32-S3 serait peut être un peu plus réactif, sans forcément satisfaire des CTRL-F5 'frénétiques' !

Effectivement un des intérêts de ESPAsyncWebServer est dans sa capacité à utiliser les 2 cœurs quand ils sont là. C’est mieux de pouvoir en profiter surtout si on ajoute des tasks

Merci à vous deux pour ce retour… j’essayerais de faire un prototype numéro 2 avec un S2 ou un S3.

L’envoi par petits morceaux marche bien, je l’utilise pour extraire les données en csv mais le problème avec la page web c’est de composer avec, nécessairement, plusieurs requêtes : la page en elle-même (on peut y mettre le css et JavaScript si besoin pour avoir un seul gros fichier) mais avec les binaires ça coince (polices et images)