Простая ошибка кодирования (потенциально) в коде ядра - PullRequest
0 голосов
/ 21 ноября 2011

Вот соответствующие структуры:

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;

Вот код, о котором идет речь (только часть «ДОБАВЛЕНО МЕНЯМИ»):

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);

}

Код Описание: Первая функция связана с выделением памяти, но мне нужно добавить защиту / владение блоку памяти, выделенному из пула. Вот почему я помещаю адрес блока памяти, а также идентификатор процесса (возвращенный из rt_tsk_self()) в дополнительный глобальный массив, который я создал. Вторая функция просто проверяет, имеет ли процесс с использованием выделенного блока то же владение, что и созданный (снова он использует rt_tsk_self()).

Актуальная проблема: Строки, прокомментированные как «МОГУТ НЕ БЫТЬ РАБОТАЮТ», похоже, не работают, так как я уверен, что могу поместить идентификатор процесса в массив, а также проверить, что он находится в там, но я не могу сделать то же самое с адресом блока памяти. Скорее всего, это скорее простая ошибка кодирования, чем концептуальная.

1 Ответ

0 голосов
/ 21 ноября 2011
 if (box == array[i]->free;){            //MAY NOT BE WORKING

Разве это не должно быть:

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

Кроме того, как-то сравнение пустых указателей делает меня неловким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...