Torna indietro   Hardware Upgrade Forum > Software > Programmazione

FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7
FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7
FRITZ!Repeater 1700 porta il Wi-Fi 7 dual-band nelle case connesse. Mette a disposizione fino a 2.880 Mbit/s su 5 GHz e 688 Mbit/s su 2,4 GHz, integrazione Mesh immediata via WPS con FRITZ!Box e funzioni smart come MLO per bassa latenza. Compatto, plug-and-play e pronto per il futuro, è la soluzione ideale per chi vuole coprire ogni angolo senza cavi o complicazioni
Fondazione Chips-IT, l'Italia alla riscossa nei chip. Il piano e la partnership EssilorLuxottica
Fondazione Chips-IT, l'Italia alla riscossa nei chip. Il piano e la partnership EssilorLuxottica
La Fondazione Chips-IT ha presentato a Pavia il piano strategico 2026-2028 per rafforzare l'ecosistema italiano dei semiconduttori. Con un focus su ricerca, design, talenti e infrastrutture, la Fondazione punta a consolidare il ruolo dell'Italia nel Chips Act europeo, sostenendo innovazione, collaborazione industriale e sovranità tecnologica.
Nutanix: innovazione, semplicità e IA al centro della strategia hybrid multicloud
Nutanix: innovazione, semplicità e IA al centro della strategia hybrid multicloud
Al Museo Alfa Romeo di Arese, Nutanix ha riunito clienti, partner ed esperti per .Next On Tour Italia e per mostrare come l’infrastruttura hybrid multicloud possa diventare il fondamento dell’innovazione, con una piattaforma capace di unificare applicazioni tradizionali, moderne architetture cloud-native e nuovi scenari basati sull’intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-01-2011, 17:03   #1
erkk84
Member
 
Iscritto dal: Dec 2006
Messaggi: 53
[C]Aiuto su programma con PThread e schedulazione thread

Ciao a tutti, sono in cerca d'aiuto per la comprensione di alcuni argomenti riguardanti il mondo del RT, in particolare i PThreads e la loro schedulazione; premetto che singolarmente e nella teoria mi sembra di averli capiti, è la loro applicazione che mi sta dando problemi.
Sto cercando di capire un programmino che li integra, sostanzialmente scrive a video su terminale le coordinate di una pallina in movimento; non posto tutto il codice (anche perchè è suddiviso in file), ma solo quelle parti che non penso di aver capito bene.
Cominciamo dal main:
Codice:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <stdint.h>

#include "output.h"
#include "system.h"
#include "control.h"

int main(int argc, char *argv[])
{
  int res;
  void *returnvalue;
  pthread_t system_id, control_id, output_id;
  /*const*/ double system_period = 0.005, control_period = 0.2;
  /*const*/ int output_period = 300;

printf("Chiamo system_id\n");
  res = pthread_create(&system_id, NULL, system_body, &system_period);  //crea un pthread, al quale è associato un id, attr di default (NULL), funzione 
									//col codice (in system.c) che deve eseguire e l'argomento passato alla funzione
									// (&system_period)
  if (res) {
    perror("pthread_create system");

    return -1;
  }

printf("Chiamo control_id\n");
  res = pthread_create(&control_id, NULL, control_body, &control_period); //idem come sopra; funzione in control.c
  if (res) {
    perror("pthread_create control");

    return -1;
  }

printf("Chiamo output_id\n");
  res = pthread_create(&output_id, NULL, output_body, &output_period); //idem come           sopra; funzione in output.c
  if (res) {
    perror("pthread_create output");

    return -1;
  }

  pthread_join(system_id, &returnvalue); 

  pthread_join(control_id, &returnvalue);

  pthread_join(output_id, &returnvalue);


  return 0;
}
i body dei pthreads sono:
Codice:
void *system_body(void *p)
{
printf("Chiamo system_body\n");
  double dt = *(double *)p; //p=0.005
  struct periodic_task *t;
  double th;
int j=0;

  r = 1;
  r1 = 0;
  th = 0;
  t = start_periodic_timer(0, 1000000.0 * dt);
  while(j<20) {
    th = c();
//printf("THETA: %d\n", (int)th);
    r1 = f1(r1, th, dt);
    r = f(r, r1, dt);
    wait_next_activation(t);
j++;
  }

  return NULL;
}


void *control_body(void *p)
{
printf("Chiamo control_body\n");
  double dt = *(double *)p;
  struct periodic_task *t;
  double u, u1;
  const double kp = -3, kd = -3;
  int i;

  u = 0; u1 = 0;
  i = 0;
  t = start_periodic_timer(0, 1000000.0 * dt);
  u1 = position();
  while(1) {
    wait_next_activation(t);
    i++;
    u = position();
    theta = kp * (ref(dt * i) - u) - kd * (u - u1) / dt;
    u1 = u;	
  }


void *output_body(void *p)
{
printf("Chiamo ouput_body\n");
  int dt = *(int *)p;
  struct periodic_task *t;
  int i;

  i = 0;
  t = start_periodic_timer(0, 1000 * dt);
  while(1) {
    printf("%lf\t%lf\n", dt / 1000.0 * i, position());
    fflush(stdout);
    wait_next_activation(t);
    i++;
  }
Questi ultimi si trovano in file diversi; lasciate stare le funzioi chiamate internamente, quelle non mi danno particolari problemi, fanno dei loro calcoli matematici.

In ultimo, la parte relativa alle chiamate di sistema.
Codice:
extern int clock_nanosleep(clockid_t __clock_id, int __flags,
                           __const struct timespec *__req,
                           struct timespec *__rem);

struct periodic_task {
        struct timespec r;
        int period;
} ;
#define NSEC_PER_SEC 1000000000ULL

static inline void timespec_add_us(struct timespec *t, uint64_t d)
{
    d *= 1000;
    d += t->tv_nsec;
    while (d >= NSEC_PER_SEC) {
        d -= NSEC_PER_SEC;
        t->tv_sec += 1;
    }
    t->tv_nsec = d;
}

void wait_next_activation(struct periodic_task *pd)
{
    clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &pd->r, NULL);
    timespec_add_us(&pd->r, pd->period);
}

struct periodic_task *start_periodic_timer(uint64_t offs, int t)
{
    struct periodic_task *task;

    task = malloc(sizeof(struct periodic_task));
    clock_gettime(CLOCK_REALTIME, &task->r);
    timespec_add_us(&task->r, offs);
    task->period = t;

    return task;
}
Il problema è: non riesco a capire come vengono gestiti i vari PThreads; cioè, io ad esempio avrei detto che viene chiamato prima il body "System", invece viene chiamato prima il control, poi l'output e poi il System...e questo è uno dei problemi;
Poi, non riesco a capire la schedulazione dei processi con le varie chiamate a start_periodic_timer, wait_next-activation, ecc...

C'è qualche buon'anima che mi potrebbe aiutare in questo senso?Magari allego il pacchetto dei file completii per avere un'idea migliore di come è strutturato il programma.

Grazie
Allegati
File Type: zip BallAndBeam.zip (13.5 KB, 0 visite)

Ultima modifica di erkk84 : 09-01-2011 alle 17:06. Motivo: File non allegato
erkk84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7 FRITZ!Repeater 1700 estende la rete super-veloce...
Fondazione Chips-IT, l'Italia alla riscossa nei chip. Il piano e la partnership EssilorLuxottica Fondazione Chips-IT, l'Italia alla riscossa nei ...
Nutanix: innovazione, semplicità e IA al centro della strategia hybrid multicloud Nutanix: innovazione, semplicità e IA al ...
Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il n...
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando Due mesi di Battlefield 6: dalla campagna al bat...
'Thank You', l'update gratuito per tutti...
L'IA è più brava degli uma...
Tutti i vincitori dei The Game Awards 20...
Instagram sta usando l'IA per migliorare...
Super prezzo per iPhone 16e: il modello ...
HP LaserJet MFP M234sdw, in prova la mul...
Phantom Blade Zero ha finalmente una dat...
Google e Apple stanno collaborando per r...
180 Hz in 5K? Il nuovo monitor di ASUS m...
L'Europa salva le auto termiche? Forse s...
Total War: Warhammer 40K è realt&...
NVIDIA rassicura il mondo HPC: il format...
Lenny Kravitz diventa un villain in 007 ...
Saros rinviato ad aprile 2026: il nuovo ...
EPYC Embedded 2005: AMD punta su efficie...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:38.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v