cm3的互斥访问操作,当ldrex装载时,cm3内部会标记装载地址相关的一段地址。。。。这段锁定地址可大可小,最简单的做法是整个4GB地址段,
当然这样局限性很大,例如rtx源码中的rt_free_box这个函数就永远都不会成功
int rt_free_box (void *box_mem, void *box) {
/* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */
#ifndef __USE_EXCLUSIVE_ACCESS
int irq_dis;
#endif
if (box < box_mem || box >= ((P_BM) box_mem)->end) {
return (1);
}
#ifndef __USE_EXCLUSIVE_ACCESS
irq_dis = __disable_irq ();
*((void **)box) = ((P_BM) box_mem)->free;
((P_BM) box_mem)->free = box;
if (!irq_dis) __enable_irq ();
#else
do {
*((void **)box) = (void *)__ldrex(&((P_BM) box_mem)->free); //此语句将在ldrex指令后,有个str指令,并且操作的地址十分相近,都是在box_mem这个内存池中
} while (__strex ((U32)box, &((P_BM) box_mem)->free)); //如果这个锁定地址段比较大的话,这个strex永远不会成功,因为之前的str指令破坏了这个同步对,显然stm32不会犯这种错误,那么请问,stm32的锁定地址段到底有多大呢???
#endif
return (0);
}
|