Cortex M3-如何使用信号量

Cortex M3-如何使用信号量,c,arm,semaphore,cortex-m3,C,Arm,Semaphore,Cortex M3,我有一个关于在cortex m3中使用信号量的问题。我发现了一个线程“手臂皮层:使用位绑定的互斥”。 对这个问题有一个简短的描述,最后一个答案对我的问题很好——但我不确定如何在c/c++中实现它 “我从未在ARM上使用过位绑定;相反,我倾向于对所有此类操作使用load exclusive/store conditional。使用循环以独占方式加载旧值,计算新值,并使用条件存储将其写回。循环直到条件存储成功(如果不是第一次,可能第二次也会如此)。” 如果有人能发布一个简短的代码,告诉我如何使用它,

我有一个关于在cortex m3中使用信号量的问题。我发现了一个线程“手臂皮层:使用位绑定的互斥”。 对这个问题有一个简短的描述,最后一个答案对我的问题很好——但我不确定如何在c/c++中实现它

“我从未在ARM上使用过位绑定;相反,我倾向于对所有此类操作使用load exclusive/store conditional。使用循环以独占方式加载旧值,计算新值,并使用条件存储将其写回。循环直到条件存储成功(如果不是第一次,可能第二次也会如此)。”

如果有人能发布一个简短的代码,告诉我如何使用它,我将非常感激

谢谢,
Martin

请注意,并非所有实现都提供位带功能(最值得注意的是,NXP的LPC1xxx系列中缺少位带功能)

有关使用LDREX/STREX实现信号量的正式方法,请参阅。它使用ARM汇编

下面是我创建的一个简单类,它使用编译器内部函数(未测试!)。这个名称可能用词不当,因为它实际上像互斥锁一样工作。它还缺少可能需要的DMB指令

class Semaphore
{
  enum { SemFree, SemTaken };
  // semaphore value
  int s;  

public:
  // constructor
  Semaphore(): s(SemFree) {};

  // try to take the semaphore and return success
  // by default block until succeeded
  bool take(bool block = true)
  {
    int oldval;
#if defined(TARGET_LPC1768) // on Cortex-M3 we can use ldrex/strex
    do {
      // read the semaphore value
      oldval = __ldrex(&s);
      // loop again if it is locked and we are blocking
      // or setting it with strex failed
    }
    while ( (block && oldval == SemTaken) || __strex(SemTaken, &s) != 0 );
    if ( !block ) __clrex(); // clear exclusive lock set by ldrex
#else // on arm7 there's only swp
    do {
      // swp sets the pointed data to the given value and returns the previous one
      oldval = __swp(SemTaken, &s);
      // if blocking, loop until the previous value becomes 0
      // which would mean we have successfully taken the lock
    }
    while (block && oldval == SemTaken);
#endif
    return oldval == SemFree;
  }

  // release the semaphore
  void release()
  {
    s = SemFree;
  }
};

您好,Igor,谢谢您的回复。我不太确定如何使用您的代码。我所读到的关于信号量的所有信息都是有一个函数semop(),您可以这样做:semop()-lock…-这是安全代码?(对吗?).semop()-unlock,那么,现在我必须这样做吗?a.获取()-我的安全代码在这里。a.释放()谢谢,Martin代码不会变得“安全”仅仅因为您使用信号量;如果需要的话,应该使用信号量。通常,您使用信号量来保护公共资源,使其不受并发代码路径的同时访问。如果您没有某种RTO或调度器,则不太可能需要信号量。我建议您提出一个新问题,并描述ac你试图解决的实际问题,然后我们可以看看你是否需要信号量,如果需要,如何应用它们。嗨,伊戈尔,谢谢你的回答,很抱歉有一段时间没有回应……我使用freeRTOS,似乎我需要信号量。在对信号量进行快速检查后,我明白了我的问题-当然,我之前的问题并不聪明:)无论如何,谢谢你的帮助。FreeRTOS有同步对象,所以我建议你使用它们。如果你认为我的回答是有帮助的,你应该接受它-更多的人会愿意回答你的问题,如果他们看到你接受答案。