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

[复制链接]
2163|4
 楼主| myxiaonia 发表于 2014-5-26 14:42 | 显示全部楼层 |阅读模式
cm3的互斥访问操作,当ldrex装载时,cm3内部会标记装载地址相关的一段地址。。。。这段锁定地址可大可小,最简单的做法是整个4GB地址段,
当然这样局限性很大,例如rtx源码中的rt_free_box这个函数就永远都不会成功
  1. int rt_free_box (void *box_mem, void *box) {
  2.   /* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */
  3. #ifndef __USE_EXCLUSIVE_ACCESS
  4.   int irq_dis;
  5. #endif

  6.   if (box < box_mem || box >= ((P_BM) box_mem)->end) {
  7.     return (1);
  8.   }

  9. #ifndef __USE_EXCLUSIVE_ACCESS
  10.   irq_dis = __disable_irq ();
  11.   *((void **)box) = ((P_BM) box_mem)->free;
  12.   ((P_BM) box_mem)->free = box;
  13.   if (!irq_dis) __enable_irq ();
  14. #else
  15.   do {
  16.     *((void **)box) = (void *)__ldrex(&((P_BM) box_mem)->free);     //此语句将在ldrex指令后,有个str指令,并且操作的地址十分相近,都是在box_mem这个内存池中
  17.   } while (__strex ((U32)box, &((P_BM) box_mem)->free));              //如果这个锁定地址段比较大的话,这个strex永远不会成功,因为之前的str指令破坏了这个同步对,显然stm32不会犯这种错误,那么请问,stm32的锁定地址段到底有多大呢???
  18. #endif
  19.   return (0);
  20. }


 楼主| 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地址段了.
这样就要求尽量少用, 用的时候中间 ...

这样的话这个函数永远都不会结束了,事实上是会结束的,我硬件仿真看到是可以正常释放的,一处未知来源提到只锁住地址上的一个字,就是无法确信
 楼主| myxiaonia 发表于 2014-5-27 12:32 | 显示全部楼层
airwill 发表于 2014-5-26 17:56
从 PM36 的编程手册看, STM32 没有做地址限制, 恐怕是整个4GB地址段了.
这样就要求尽量少用, 用的时候中间 ...

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

本版积分规则

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

18

主题

499

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部