下面是相關的結構:簡單的編碼內核代碼中的錯誤(潛在的)
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);
}
代碼說明:第一個功能是處理內存分配,但我需要將保護/所有權添加到從池分配的內存塊。這就是爲什麼我將內存塊地址以及進程ID(從rt_tsk_self()
返回)放入我創建的額外全局數組中。第二個函數只是檢查使用已分配塊的進程是否與創建的進程擁有相同的所有權(同樣使用rt_tsk_self()
)。
實際問題:行註釋「可能不工作」似乎不工作,因爲我確信我可以將進程ID放入數組中,並檢查它是否在那裏,但我不能用內存塊地址做同樣的事情。這很可能僅僅是一個簡單的編碼錯誤,而不是概念。
if表達式中多餘的分號? – user7116
是否應該說'counter ++;'應該改爲'counta ++'? – necromancer
對不起,它是假設所有的計數器。我在原始代碼中使用了counta,但是我擔心它可能會讓人困惑。 – user1056006