打印
[STM32F1]

互斥访问 ldrex/strex 锁定地址段多大

[复制链接]
1992|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
myxiaonia|  楼主 | 2014-5-26 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
}


沙发
myxiaonia|  楼主 | 2014-5-26 14:43 | 只看该作者
期待香水城版本亲自来回答这个问题吧

使用特权

评论回复
板凳
airwill| | 2014-5-26 17:56 | 只看该作者
从 PM36 的编程手册看, STM32 没有做地址限制, 恐怕是整个4GB地址段了.
这样就要求尽量少用, 用的时候中间间隔尽量短.

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
myxiaonia + 3
地板
myxiaonia|  楼主 | 2014-5-26 18:34 | 只看该作者
airwill 发表于 2014-5-26 17:56
从 PM36 的编程手册看, STM32 没有做地址限制, 恐怕是整个4GB地址段了.
这样就要求尽量少用, 用的时候中间 ...

这样的话这个函数永远都不会结束了,事实上是会结束的,我硬件仿真看到是可以正常释放的,一处未知来源提到只锁住地址上的一个字,就是无法确信

使用特权

评论回复
5
myxiaonia|  楼主 | 2014-5-27 12:32 | 只看该作者
airwill 发表于 2014-5-26 17:56
从 PM36 的编程手册看, STM32 没有做地址限制, 恐怕是整个4GB地址段了.
这样就要求尽量少用, 用的时候中间 ...

今天重新搜索该问题,就在21上,香版主已经回答过这个问题,我之前提到的未知来源真tnn的恶心,是抄袭的21上的帖子,原来是香版主亲自回复,这下我就放心了
相关帖子在这里bitband与互斥访问

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:只灌水,不技术

18

主题

499

帖子

5

粉丝