Semaphore strangeness!

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Semaphore strangeness!

446件の閲覧回数
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by a.unique.identifier on Wed May 23 07:52:04 MST 2012
I'm trying to use a semaphore to control a common resource. I'm bascially using a slightly modified version of code from the Joseph Yiu book, which uses the CMSIS __LDREXW and __STREXW calls. Much to my surprise, an interrupt handler takes control of the common resource without (apparently) regard for the fact that the resource is already being used! Am I missing some basic concept here?


Here is the semaphore code:

volatile uint32_t MuxPortLocked;    // The mutex

/*
* return TRUE if the lock was successful, else FALSE
*/
uint32_t MuxPortLockSuccessful(void){
[INDENT]           // See if the device is already locked
[/INDENT][INDENT]           if (__LDREXW(&MuxPortLocked) == 0){
[/INDENT][INDENT]                       // The device isn't locked
[/INDENT][INDENT]                       if (__STREXW(1, &MuxPortLocked) != 0)
[/INDENT][INDENT][INDENT]                                return (FALSE); // failed
[/INDENT][/INDENT][INDENT]                      else
[/INDENT][INDENT][INDENT]                                return (TRUE); // success
[/INDENT][/INDENT][INDENT]           }else{
[/INDENT][INDENT][INDENT]                       return(FALSE); // failed
[/INDENT][/INDENT][INDENT]           }
[/INDENT] }

void MuxPortUnlock(void){
[INDENT]           MuxPortLocked = FALSE;
[/INDENT] }


Here is the code (same for both the interrupt handler as well as the "normal" C code) used to access the common resource:

    while (!MuxPortLockSuccessful());
   // Do something with the common resource
   MuxPortUnlock();

I single stepped through the "normal" code, which is protected by the semaphore, and low and behold I hit a breakpoint in my (systick) interrupt handler, which should have been blocked by the initial "while" statement.

Finally, should I use the CMSIS __CLREX commenad instead of simply clearing the semaphore?
0 件の賞賛
返信
0 返答(返信)