how to use mutex

Chan Kim ckim at etri.re.kr
Wed Sep 2 13:39:29 UTC 2015


Hi, Gedare,
> Note also that you must account for how many resources (including
> semaphores) your program requires via the CONFIGURE_ macros. Check that
> you have enough semaphores configured there. For simplicity there is an
> option to enable unlimited objects that can ease this issue for
> development/porting efforts.
I'm debugging other scenario now, but I'll add
#define CONFIGURE_MAXIMUM_SEMAPHORES 20
in my app and try later.
Thanks!
Chan Kim




보낸 사람 : "Gedare Bloom" <gedare at rtems.org>
보낸 날짜 : 2015-09-02 22:26:23 ( +09:00 )
받는 사람 : 김찬 <ckim at etri.re.kr>
참조 : users at rtems.org <users at rtems.org>
제목 : Re: how to use mutex

Note also that you must account for how many resources (including
semaphores) your program requires via the CONFIGURE_ macros. Check
that you have enough semaphores configured there. For simplicity there
is an option to enable unlimited objects that can ease this issue for
development/porting efforts.

On Tue, Sep 1, 2015 at 10:50 PM, Paul Whitfield
wrote:
> Hi Chan Kim,
>
> The result code you are displaying in your debug output is 4, This is not 0, RTEMS_SUCCESSFUL.
> So the call to obtain the semaphore has failed.
>
> That result code can be found in rtems/status.h
> The result code is RTEMS_INVALID_ID, so you have a programming error, you are not accessing the semaphore with a valid ID.
>
> Regards
>
> Paul Whitfield.
>
>
>
> -----Original Message-----
> From: users [mailto:users-bounces at rtems.org] On Behalf Of Chan Kim
> Sent: Wednesday, 2 September 2015 10:28 AM
> To: users at rtems.org
> Subject: RE: how to use mutex
>
>
> I tried it with semaphore
> for init,
> rtems_attribute sem_attr;
> rtems_status_code status;
> sem_attr = RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY;
> sem_name = rtems_build_name( 'S','0',' ',' ');
> status = rtems_semaphore_create( sem_name, 1, sem_attr, 0, &sem_id);
> printk("semaphore created status = %d\n", status);
>
> to obtain, (read case, write thread the same)
> rtems_status_code status;
> status = rtems_semaphore_obtain( sem_id, RTEMS_WAIT, 0);
> printk("locked from read..status = %d\n", status);
>
> to release (read case, write thread the same)
> printk("unlocking from read..\n");
> rtems_semaphore_release( sem_id);
>
> I get result
> ...
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 0
> unlocking from read..
> locked from read..status = 4
> unlocking from read..
> locked from read..status = 4
> unlocking from read..
> locked from read..status = 4
> unlocking from read..
> locked from write.. status = 4
> unlocking from write..
> locked from write.. status = 4
> unlocking from write..
> locked from write.. status = 4
> unlocking from write..
> locked from read..status = 4
> locked from write.. status = 4 <===== read locked it, but write entered it.
>
> status code 4 is RTEMS_INVALID_ID meaning object ID is invalid. I don't know what's wrong.
> can anyone tell me what's wrong?
> Chan
>
>
>
> 보낸 사람 : "Chan Kim" 
> 보낸 날짜 : 2015-09-02 10:26:24 ( +09:00 )
> 받는 사람 : users at rtems.org 참조 :
> 제목 : how to use mutex
>
> Hello, rtems users,
>
> Please somebody help with with using mutex.
> To avoid sync problem by simpling serializing read and write processing, I tried using mutex and found it's not working properly.
>
> ------------ the way I did it
> pthread_mutexattr_t mutex_attr;
> pthread_mutex_t rd_wr_mutex;
>
> to initialize,
> statusi = pthread_mutexattr_init( &mutex_attr ); printk("mutext attri init result = %x\n", statusi); pthread_mutex_init(&rd_wr_mutex, &mutex_attr); printk("mutext init result = %x\n", statusi);
>
> to lock,
> pthread_mutex_lock(&rd_wr_mutex); // rtems_mutex_t printk("locked from read..\n");
>
> to unlock,
> printk("unlocking from read..\n");
> pthread_mutex_unlock(&rd_wr_mutex);
>
> --------------
> I see results (only mutex lock, unlock prints)
>
> mutext attr init result = 0
> mutext init result = 0
> ...
> locked from read..
> unlocking from read..
> locked from write..
> unlocking from write..
> locked from write..
> unlocking from write..
> locked from write..
> unlocking from write..
> locked from read..
> locked from write.. <===== ???
>
>
> Print result shows teh write thread enters it when read thread has locked it. What's wrong with the way of my using mutex?
> Hope someone clears it with some explanation.
> Thanks,
>
> regards,
> Chan Kim
> _______________________________________________
> users mailing list
> users at rtems.org
> http://lists.rtems.org/mailman/listinfo/users
> _______________________________________________
> users mailing list
> users at rtems.org
> http://lists.rtems.org/mailman/listinfo/users
> _______________________________________________
> users mailing list
> users at rtems.org
> http://lists.rtems.org/mailman/listinfo/users


More information about the users mailing list