Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-01-2011, 16: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 16:06. Motivo: File non allegato
erkk84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
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: 06:30.


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