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