Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 11h15   #1
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
Par défaut Mémoire Previous State

Bonjour,

Pour mon projet, je suis sensée créer une mémoire puis utiliser les données qui y sont stockées pour faire un conversion.

La mémoire que je dois construire est un buffer circulaire avec une taille de 10.
Ce buffer est créé et le rebouclage se fait sans souci. Par contre pour la conversion je faire un calcul sous la forme :
(a)k = (a)k-1 + (b)k k étant la position actuelle de la mémoire.

Pour l'utilisation des données dans la mémoire j'utilise un compteur.

Je ne vois pas comment je pourrais coder le k-1. J'ai peur que si je code directement k-1 je me retrouve avec la valeur de k soustraite de 1. Ce qui n'est pas ce que je veux.
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 12h52   #2
mith06
Membre confirmé
 
Ingénieur développement matériel électronique
Inscription : juillet 2010
Messages : 141
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement matériel électronique
Secteur : Industrie

Informations forums :
Inscription : juillet 2010
Messages : 141
Points : 200
Points : 200
Salut,

Code :
1
2
3
4
5
#define BUFF_SIZE 10
int decrement_k(const int k)
{
    return k<=0?BUFF_SIZE-1:k-1;
}
J’espère que çà répond a ta question.
mith06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h13   #3
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
Que signifie le "return k<=0?BUFF_SIZE-1:k-1;" ?
Je connais le principe du return mais je ne comprend l'action que va avoir cette ligne.
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h28   #4
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 296
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 296
Points : 2 871
Points : 2 871
C'est une opération ternaire.
Si k est inférieur ou égal à 0 alors on fait BUFF_SIZE-1 sinon on fait k-1

Autrement codé :
Code C :
1
2
3
4
if( k<=0 )
  return BUFF_SIZE-1;
else
  return k-1;
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h29   #5
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 608
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 608
Points : 7 045
Points : 7 045
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Il s'agit de l'opérateur ternaire.

condition ? valeur si condition vrai : valeur si condition fausse.

Exemple : x == 1 ? 1 : 2
=> vaut 1 si x vaut 1 sinon vaut 2.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h47   #6
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
Je gère la mémoire de cette manière-ci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
//ecriture memoire roue 1 et test memoire pleine wheel1 ------------------
 
if (write_buffer_wheel1 != buffer_lenght) {
 
    if (write_buffer_wheel1< buffer_lenght && buffer_full1 != 0)  {           //test de la taille de la memoire
              wheel1 [write_buffer_wheel1]= receive_data[1] + (256*receive_data[0]) ;      //ecriture dans la memoire
              write_buffer_wheel1 ++;                   //incrementation du compteur ecriture                       
    } else if (write_buffer_wheel1< buffer_lenght && buffer_full1 == 0) {
 
         PORTB =0b00000001  ; 
         sendOnCanFull ()   ;
     }
}else {
             write_buffer_wheel1 = 0;                  //rebouclage de la memoire
              wheel1 [write_buffer_wheel1]= receive_data[1] + (256*receive_data[0]) ; 
 
          }
void interrupt 8 TOC0_ISR () {          //lecture de la mémoire
 
  TFLG1 = TFLG1_C0F_MASK ;    // rabaisse le flag de l'interruption
 
 // buffer_empty1 = buffer_lenght - buffer_full1;
 
 if (buffer_empty1 == buffer_lenght) {
    PORTB =0b00000100  ; 
     sendOnCanEmpty ()   ;  
 
 }
 
  if ( read_buffer_wheel1 < buffer_lenght ){                    //test taille de la memoire
 
     TC0 = TC0 + wheel1[read_buffer_wheel1] ;                //lecture des donnees
     read_buffer_wheel1 ++    ;         //incrementation compteur lecture 
      } else{
 
         read_buffer_wheel1 = 0    ;                           //rebouclage memoire   .
         TC0 = TC0 + wheel1[read_buffer_wheel1] ;                //lecture des donnees 
 
     }                                                            
 
}
Je veux faire la conversion juste avant de transmettre les données (en gros avant la ligne TC0=TC0...) Si je touche au compteur (k = read_buffer_wheel1) en faisant une décrementation ça ne risque pas de perturber la suite du programme ?

En bref la mémoire se remplit et se vide non stop est-ce que faire une décrémentation ne va pas perturber la lecture ?
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h29   #7
pfeuh
Membre Expert
 
Développeur en systèmes embarqués
Inscription : mars 2006
Messages : 763
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 763
Points : 1 031
Points : 1 031
Salut,

Citation:
Envoyé par BlueWolf9 Voir le message
un calcul sous la forme :
(a)k = (a)k-1 + (b)k k étant la position actuelle de la mémoire.
C'est une somme que tu veux faire? A travers un buffer parce que les données sont envoyées par un autre processus?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
 
#define BUFFER_SIZE 10
 
typedef struct
{
    float buffer[BUFFER_SIZE];
    int inptr;
    int outptr;
} BUFFER;
 
BUFFER* bufferCreate(void)
{
    BUFFER* pBuffer = malloc(sizeof(BUFFER));
    if(pBuffer != NULL)
    {
        pBuffer->inptr = 0;
        pBuffer->outptr = 0;
    }
    return pBuffer;
}
 
void bufferDestroy(BUFFER* pbuf)
{
    if(pbuf != NULL)
        free(pbuf);
}
 
void bufferPut(float value, BUFFER* pbuf)
{
    pbuf->buffer[pbuf->inptr] = value;
    pbuf->inptr = (pbuf->inptr + 1) % BUFFER_SIZE;
}
 
float bufferGet(BUFFER* pbuf)
{
    float value;
    while(pbuf->outptr == pbuf->inptr)
        /* do nothing, just wait */;
    value = pbuf->buffer[pbuf->outptr];
    pbuf->outptr = (pbuf->outptr +1) % BUFFER_SIZE;
    return value;
}
 
int main(void)
{
	float input[]={1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0 ,5.0, 5.0, 5.0, 5.0, 5.0 };
    int index;
    float value;
    float total;
	BUFFER* pbuf = bufferCreate();
 
	if(pbuf != NULL)
    {
        for(index = 0; index < 15; index++)
        {
            value = input[index];
            total += value;
            bufferPut(total, pbuf);
            printf("%f\n", bufferGet(pbuf));
        }
    }
    bufferDestroy(pbuf);
	return 0;
}
L'idée étant de calculer une somme de deux itérations, il faut une variable supplémentaire qui fait office de somme, ici c'est total. Reculer et ré-avancer avec l'index me semble une mauvaise idée.

A+

Pfeuh

A+

Pfeuh
pfeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h45   #8
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
Là où ça devient compliquer c'est que je ne peux pas utiliser de fonction "malloc, free..." et je ne crois pas que return soit supporté par le logiciel que j'utilise (CodeWarrior une très vieille version)

Est-ce que je pourrais utiliser un deuxième compteur en parallèle (par rapport au read_buffer_wheel1) que je resynchroniserai avec le premier après chaque conversion ?
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h59   #9
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
Quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
void convert () {
 
unsigned short decrement;
unsigned short t [10];
unsigned short conv;
unsigned short Delta_t;
 
decrement = read_buffer_wheel1;
decrement --;
 
conv = t[decrement];
 
Delta_t = wheel1[read_buffer_wheel1] - t[decrement];
 
//Output
}
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h41   #10
pfeuh
Membre Expert
 
Développeur en systèmes embarqués
Inscription : mars 2006
Messages : 763
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 763
Points : 1 031
Points : 1 031
Citation:
Envoyé par BlueWolf9 Voir le message
Là où ça devient compliquer c'est que je ne peux pas utiliser de fonction "malloc, free..." et je ne crois pas que return soit supporté par le logiciel que j'utilise (CodeWarrior une très vieille version)
Euh... C'est quand même du C que tu nous a montré, j'ai du mal à croire que l'on puisse faire du C sans return! Si j'ai bien compris wikipedia, CodeWarrior est un IDE, il y a quand mêle un compilo C quelque part dedans?

Il me manque beaucoup d'info pour comprendre ce que tu veux faire, mais supposons que tu ne puisses écrire qu'une fonction qui ne retourne rien et que wheel1 et read_buffer_wheel1 soient une sorte de variables globales, tu peux peut-être passer par une variable statique:

Code :
1
2
3
4
5
6
7
8
9
10
11
void convert(void)
{
    unsigned short Delta_t;
    unsigned short current_time;
    static unsigned short last_timestamp = 0;
 
    current_time = wheel1[read_buffer_wheel1];
    Delta_t = current_time - last_timestamp;
    last_timestamp = current_time;
    /* Output */
}
pfeuh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 15h52   #11
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
J'ai oublié de replacer le contexte. En fait j'ai modfié le calcul du début (désolé je ne m'en suis pas rendu compte )
En gros dans ce que j'ai présenté

Citation:
(a)k = (a)k-1 + (b)k
b = Delta_t le résultat de ma conversion
a = Wheel1 elle représente les valeurs qui se trouvent dans ma mémoire

Par rapport l'exemple que tu m'as montré, last_timestamp ne peut pas être égal à 0 (sauf au moment de l'init). Il doir prendre la valeur précédente de Wheel1.
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h00   #12
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
En bref

Le calcul serai plus :

(b)k = (a)k - (a)k-1
Delta_t = Wheel1[read_buffer_wheel1] - wheel1[read_buffer_wheel1 -1] (avec -1 previous state)
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h30   #13
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
Citation:
Là où ça devient compliquer c'est que je ne peux pas utiliser de fonction "malloc, free..." et je ne crois pas que return soit supporté par le logiciel que j'utilise (CodeWarrior une très vieille version)
Sûrement parce que tu ne codes pas sur PC mais sur micro-contrôleur (d'où l'utilisation de CodeWarrior ?) et que donc pas de gestionnaire de mémoire signifie de de malloc / free ?
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 08h18   #14
pfeuh
Membre Expert
 
Développeur en systèmes embarqués
Inscription : mars 2006
Messages : 763
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 763
Points : 1 031
Points : 1 031
Citation:
Envoyé par BlueWolf9 Voir le message
Par rapport l'exemple que tu m'as montré, last_timestamp ne peut pas être égal à 0 (sauf au moment de l'init).
C'est exactement ce que fait la variable statique de mon exemple... C'est comme une globale, mais en plus propre...
pfeuh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 09h46   #15
BlueWolf9
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2013
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 48
Points : 6
Points : 6
Ok je n'avais pas compris ça comme ça.

Et oui je programme bien sur microcontrôleur mais j'ai estimé que mon problème correspondait à du C qu'a du microcontrôleur.
BlueWolf9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 17h55   #16
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
Quand tu poses des questions sur le forum C (ça marche pour tous les forums de Developpez.com en fait), n'hésites pas à dire avec quel outil tu travailles (compilateur, type d'architecture, système d'exploitation), ça aide souvent à mieux répondre.

Ici, les gens posent à 90% des questions pour des problèmes en C sous Windows ou Linux. Si tu as un contexte très différent, comme un micro-contrôleur 8 bits, ça peut être particulièrement bon de le préciser car cela implique beaucoup de contraintes sur le code. Tu verras avec le temps ^^
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h58.


 
 
 
 
Partenaires

Hébergement Web