Cortex M3-如何使用信号量
我有一个关于在cortex m3中使用信号量的问题。我发现了一个线程“手臂皮层:使用位绑定的互斥”。 对这个问题有一个简短的描述,最后一个答案对我的问题很好——但我不确定如何在c/c++中实现它 “我从未在ARM上使用过位绑定;相反,我倾向于对所有此类操作使用load exclusive/store conditional。使用循环以独占方式加载旧值,计算新值,并使用条件存储将其写回。循环直到条件存储成功(如果不是第一次,可能第二次也会如此)。” 如果有人能发布一个简短的代码,告诉我如何使用它,我将非常感激 谢谢,Cortex M3-如何使用信号量,c,arm,semaphore,cortex-m3,C,Arm,Semaphore,Cortex M3,我有一个关于在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有同步对象,所以我建议你使用它们。如果你认为我的回答是有帮助的,你应该接受它-更多的人会愿意回答你的问题,如果他们看到你接受答案。