Utiliser le C et internet

Le langage C permet de créer des programmes rapides et proches de la machine

Modérateur : Francois

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Utiliser le C et internet

Message par Bud Spencer » mar. 23 oct. 2018 20:49

adelantejm a écrit :
mar. 23 oct. 2018 09:33
… Coté PI, j'ai un processus avec deux threads …
adelantejm a écrit :
mar. 23 oct. 2018 09:33
... J'utilise Fork ...
Donc tu n’utilises pas 1 process, mais autant que de client + le père ;-)
C'est ce que l'on faisait il y à 30 ans, faute de mieu, mais vu que ca fonctionne encore :mrgreen: ….
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: Utiliser le C et internet

Message par destroyedlolo » mar. 23 oct. 2018 22:24

adelantejm a écrit :
mar. 23 oct. 2018 09:33
Pour les timers oui c'est vrai. Mais avant d'utiliser le C je programmais les microprocesseurs, principalement PIC, en assembleur. J'étais donc à 200 nanosecondes prés car j'utilisais beaucoup les interruptions. J'ai même côtoyé les picosecondes (au moins théoriquement) avec l'aide de circuits externes. Pour moi c'est dur d'accepter qu'un micro reste 1.000.000.000 nanosecondes à ne rien faire (pour moi) !
Oui, moi aussi j'ai commencé avec des procs très lents (512khz en l’occurrence) ou chaque cycle comptait ... cependant : est-ce que ca sert à qq chose ? Je veux dire, est-ce que tu as des choses a faire faire à ton ESP ?
adelantejm a écrit :
mar. 23 oct. 2018 09:33
Tout ceci fait que l'échange d'infos avec le central ne dure que 26 ms, toutes les 30 s, vu de l'ESP32. Du coup je pense à la transmission d'images ...
Il faut que j'envisage la mise en veille du Wifi sur l'ESP pour diminuer la consommation.
Tu peux meme le stopper totalement : regarde du coté du deepsleep() ...
adelantejm a écrit :
mar. 23 oct. 2018 09:33
Coté PI, j'ai un processus avec deux threads (while(1) ) un pour la mesure de température l'autre pour être le serveur des autres microprocesseurs en Wifi. J'utilise Fork, shm, mutex, ... Cela fonctionne correctement.
Heu ... tu parlais d'économie de cycle, mais là, j'ai un peu peur a te lire que fasse dans le lourd :)
Un fork() est extrêmement consommateur en ressource car il fait un remapping mémoire à chaque invocation : donc ok si tu ne le fais qu'une fois ... mais si tu le fais à chaque donnée recus, c'est vite lourding. Regarde plutot du coté des threads (libpthread sous Linux) si tu veux faire dans la parallelisation.
Quand un while(1), j'imagine que le mutex provoque l'arret du process lorsqu'il n'y a rien a faire ... sinon, bonjour l’utilisation CPU :twisted:
adelantejm a écrit :
mar. 23 oct. 2018 09:33
Un processus, en cours de développement, doit être le serveur internet, ce que faisait péniblement un Arduino Mega. J'ai testé l'échange d'infos avec l'autre processus(shm) : OK.
Je peine aujourd'hui avec les html et xml que je ne domine pas du tout (j'ai même confondu les deux ...).
La joie d'apprendre de nouvelles choses ... mais c'est ca qu'est fun, non :)

Pour le coté reception de données + serveur web, le plus simple serait sans doute de regardze du coté des langages qui peuvent embarquer un serveur web : NodeJS comme tu as pu le voir dans l'autre tuto, ou python, ou Lua ... voir même java si tu veux faire dans le lourding.
Par contre, si souhaites avoir 2 process distincts avec d'un coté ton démon en C et de l'autre ton serveur web qui communiquent entre eux, rien ne t'empeche d'utiliser un serveur web classique genre Apache, NGX ou lighttpd avec plugin de page dynamique (php, Lua a nouveau, JS, ...) : c'est plus complexe a mettre en place, mais tu controle ce que tu fais et c'est plus formateur. Ca se rapproche aussi des trucs a la mode en ce moment comme le KISS ou les micro services ...

Mais en tout cas, l'important c'est de s'amuser, n'est-ce pas :mrgreen:
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

adelantejm
Messages : 31
Enregistré le : ven. 5 oct. 2018 09:11

Re: Utiliser le C et internet

Message par adelantejm » ven. 26 oct. 2018 19:33

Bonsoir la compagnie,

Oui l'ESP32 n'a pas grand chose à faire : je vais le remplacer par un ESP8266 à la première occasion.
Sur le Pi ce qui consomme le plus, et de loin, c'est la mesure de température, du moins je pense : W1_bus_master1 (plus d'une heure sur ?), alors que le serveur local qui recueil les infos des autres micros ne consomme que 6 s. Il faudra que je fasse des stats sur une longue durée ...
Le fork() n'est exécuté qu'une fois je pense, pour créer (ou continuer) le père qui fait un while(1) pour mesurer la température locale (chambre) avec un sleep(5) entre les mesures. Le fils n'est créé qu'une fois : while(1) qui débute par un accept bloquant en attendant les clients : autres microprocesseurs.
Le serveur internet a été assez pénible à mettre au point et pourtant c'était une simple transposition Arduino --> PI, en gardant le même langage et le même écran de saisie.
Un "close(newsockfd)" mal placé, m'a fait perdre plusieurs jours.
Enfin la partie chauffage gaz fonctionne. Reste à voir la fiabilité. La partie chauffage électrique est très simple et pas urgente : chambres inoccupées.
La porte, ouverture par différents moyens, est un peu plus difficile je l'ai déjà transposée sur un ESP8266 autonome mais ce n'est pas fiable du tout.
Une question : comment mettre les sorties console sur le PI dans un fichier log ?

adelantejm
Messages : 31
Enregistré le : ven. 5 oct. 2018 09:11

Re: Utiliser le C et internet

Message par adelantejm » ven. 9 nov. 2018 18:35

Bonsoir,

Apparemment personne ne sait comment mettre les sorties d'un programme dans un fichier.
La méthode normale prog >fichierlog ne fonctionne pas pour moi.
La seule solution que j'ai trouvée c'est avec nohup :
sudo nohup ./prog&
Le fichier nohup.out contient les sorties, le "&" provoque une exécution en arrière plan.

J'ai un autre PB (petit) pour lire la température d'un DS18B20 j'utilise les instructions suivantes trouvées sur le net :

Code : Tout sélectionner

  // Temperature :mount the device:
    system("sudo modprobe w1-gpio");
    system("sudo modprobe w1-therm");
    // Check if /sys/bus/w1/devices/ exists.
    if((dirp = opendir(path)) == NULL)
    {   printf("opendir error\n");return 1; } 
    // Reads the directories or files in the current directory.
    while(( direntp = readdir(dirp) )!= NULL)
    {   if(strstr(direntp->d_name,"28-"))
        {   strcpy(rom,direntp->d_name);printf(" rom: %s\n",rom); }
    }
    closedir(dirp);
    // Append the String rom and "/w1_slave" to path
    // path becomes to "/sys/bus/w1/devices/28-00000xxxx/w1_slave"
    strcat(path,rom);
    strcat(path,"/w1_slave");
    
         while (1) {
	sleep(5);
	if((fd = open(path,O_RDONLY)) < 0)
        {   printf("open error\n"); return 1; }
        // Read the file
        if(read(fd,buft,sizeof(buft)) < 0)
        {   printf("read error\n"); return 1; }
        // Returns the first index of 't'.
        temp = strchr(buft,'t');
        sscanf(temp,"t=%s",temp);
        value = atof(temp)/1000;
	   close(fd);}
Cela fonctionne surtout depuis que j'ai rajouté le "close(fd);".
Cependant ça consomme beaucoup de temps CPU, 200 fois plus que tout le reste du programme qui communique en Wifi avec un ESP32 et avec un serveur, par segment de mémoire commun.
Y a-t-il une autre méthode plus rapide ?
A moins que le sleep(5) soit compté comme du temps CPU ?
Modifié en dernier par adelantejm le sam. 10 nov. 2018 11:47, modifié 2 fois.

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: Utiliser le C et internet

Message par destroyedlolo » ven. 9 nov. 2018 20:19

Salut,

plusieurs remarques :

D'abords, ca serait beaucoup plus lisible si tu utilisait les balises codes ;)

Code : Tout sélectionner

// Temperature :mount the device:
system("sudo modprobe w1-gpio");
system("sudo modprobe w1-therm");
Ca marche ... mais qu''est-ce que c'est crade !
Normalement, c'est le genre de chose qui doivent se gérer côté système et non dans ton code. Sur ma distib, Gentoo, ca se fait dans /etc/modprobe.d/*, je ne sais pas sous Raspbian.

Code : Tout sélectionner

if((dirp = opendir(path)) == NULL)
{ printf("opendir error\n");return 1; } 
t'y gagnerai de faire un

Code : Tout sélectionner

if(!(dirp = opendir(path))) {
  perror("opendir"); exit(EXIT_FAILLURE);
}
Le perror() t'affichera en clair l'erreur qui a eu lieu.

Sinon, pour tes autres questions :
La méthode normale prog >fichierlog ne fonctionne pas pour moi.
Il devrait pourtant :)
Pendant testes, je te conseillerais de faire un

Code : Tout sélectionner

prog | tee fichier.log
Le tee te permet d'avoir les sorties à la fois sur la console et dans le fichier.
Sinon, je ne vois pas dans ton code ce qui afficherait le moindre message hormis en cas d'erreur ... mais il est clairement incomplet.
Cependant ça consomme beaucoup de temps CPU, 200 fois plus que tout le reste
Plusieurs pistes :
1/ Les modules kernel 1-wire sont TRES consommateurs (parce qu'il y'a des busywait et des coupures du multitaches) : de mon coté, je passe par un adaptateur I2C ce qui décharge le CPU

2/

Code : Tout sélectionner

temp = strchr(buft,'t');
sscanf(temp,"t=%s",temp);
value = atof(temp)/1000;
gagnerait a devenir

Code : Tout sélectionner

const char *temp = strchr(buft,'t'); // le const pourrait amener plus d'optimisation de la part du compilo
value = atof(temp+2)/1000; // tu connais déja l'offset, pas besoin de sscanf()
Et plutot que passer par des flottant tu peux mettre en place un système a virgule fixe en restant sur des entiers.

Des idées juste comme ca, je n'ai pas regardé plus loin ...
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Répondre

Retourner vers « C / C++ »