2011-11-21 1 views
-1

Voici les struct liés:simple erreur de codage (potentiellement) dans le code du noyau

typedef struct OS_BM { 
    void *free;      /* Pointer to first free memory block  */ 
    void *end;      /* Pointer to memory block end    */ 
    U32 blk_size;     /* Memory block size */ 
    U32 owner_one;     
} *P_BM; 

typedef struct NEW {       //struct ADDED BY ME 
    void *free; 
    U8 pid; 
} *P_GH; 

Voici le code en question (seule la partie "AJOUTÉE PAR ME"):

void *rt_alloc_box (void *box_mem) { 
    /* Allocate a memory block and return start address. */ 
    void **free; 
#if !(defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) 
    int irq_dis; 

    irq_dis = __disable_irq(); 
    free = ((P_BM) box_mem)->free;   
    if (free) { 
    array[counter]->free=((P_BM) box_mem)->free; //ADDED BY ME- MAY NOT BE WORKING 
    array[counter]->pid = rt_tsk_self();   //ADDED BY ME 
    counter++;         //ADDED BY ME 
    ((P_BM) box_mem)->free = *free; 
    } 
    if (!irq_dis) __enable_irq(); 
#else 
    do { 
    if ((free = (void **)__ldrex(&((P_BM) box_mem)->free)) == 0) { 
     __clrex(); 
     break; 
    } 
    } while (__strex((U32)*free, &((P_BM) box_mem)->free)); 
#endif 
    return (free); 
} 

int free_owner (void *box_mem, void *box){ //FUNCTION ADDED BY ME 
    int i; 

    for(i = 0; i<8;i++){ 
     if (box == array[i]->free;){   //MAY NOT BE WORKING 
     if(rt_tsk_self() == (array[i]->pid)) 
     return (0); 
     } 
    } 
    return (1); 

} 

Code Description: La première fonction concerne l'allocation de mémoire, mais j'ai besoin d'ajouter une protection/propriété au bloc de mémoire qui est alloué à partir du pool. C'est pourquoi je mets l'adresse de bloc de mémoire aussi bien que l'identificateur de processus (retourné de rt_tsk_self()) dans un tableau global supplémentaire que j'ai créé. La deuxième fonction vérifie simplement si le processus d'utilisation du bloc alloué a la même propriété que celui créé (à nouveau, il utilise rt_tsk_self()). Les lignes commentées avec "PEUT NE PAS ÊTRE TRAVAILLANT" ne semblent pas fonctionner car je suis sûr que je peux mettre l'identificateur de processus dans le tableau et vérifier qu'il est présent, mais Je ne peux pas faire la même chose avec l'adresse de bloc de mémoire. Il est très probable que ce soit simplement une erreur de codage plutôt que conceptuelle.

+0

Point-virgule extrinsèque dans l'expression if? – user7116

+0

pourrait-il être la ligne qui dit 'counter ++;' devrait plutôt dire 'counta ++'? – necromancer

+0

désolé, il est supposé être COUNTER pour chacun d'eux. J'ai utilisé le compte à rebours dans le code original mais j'avais peur que cela puisse dérouter les gens. – user1056006

Répondre

0
if (box == array[i]->free;){   //MAY NOT BE WORKING 

Si ce pas:

if (box == *(array[i]->free)){   //MAY NOT BE WORKING 

En outre, la comparaison des pointeurs en quelque sorte de vide me faire, mal à l'aise.

+0

J'essaie de comparer les adresses de boîte et la variable libre de la fonction rt_alloc_box – user1056006

+0

aussi si (boîte == * (tableau [i] -> gratuit)) ne semble pas résoudre le problème car ils sont maintenant de différents types – user1056006

Questions connexes