rtems RTEMS_BINARY_SEMAPHORE can not block

yao0718 29171383 at qq.com
Sat Dec 17 05:56:49 UTC 2016


hi,


I test binary semaphore used for mutex,but I find it can not block 


my simple test code is
struct zynq_qspi
{
    rtems_id sem_bus;
	rtems_id sem_done;
    bool inited;
    const uint8_t *txbuf;
	uint8_t *rxbuf;
	int32_t  bytes_to_transfer;
	int32_t  bytes_to_receive;
};
static  struct zynq_qspi  zynq_qspi_inst={
  .inited = false,
  .txbuf = 0,
  .rxbuf = 0,
  .bytes_to_transfer = 0,
  .bytes_to_receive = 0
};
int  zynq_qspi_init(void)
{
	rtems_status_code status;
	status = rtems_semaphore_create(
			rtems_build_name('q', 's', 'p', 'i'), 0,
                        RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,0, &zynq_qspi_inst.sem_bus);


	if (status != RTEMS_SUCCESSFUL)
	{
		printf("create qspi bus sem failure!\n");
		return -1;
	}
/*below is test*/
    status = rtems_semaphore_obtain(zynq_qspi_inst.sem_bus, RTEMS_WAIT, 100);
	if (status != RTEMS_SUCCESSFUL)
	{
		printf("%d get qspi bus sem failure!\n", __LINE__);
		return -1;
	}
	status = rtems_semaphore_obtain(zynq_qspi_inst.sem_bus, RTEMS_WAIT, 100);
	if (status != RTEMS_SUCCESSFUL)
	{
		printf("%d get qspi bus sem failure!\n", __LINE__);
		return -1;
	}
	status = rtems_semaphore_obtain(zynq_qspi_inst.sem_bus, RTEMS_WAIT, 100);
	if (status != RTEMS_SUCCESSFUL)
	{
		printf("%d get qspi bus sem failure!\n", __LINE__);
		return -1;
	}
	/*status = rtems_semaphore_create(
			rtems_build_name('q', 's', 'p', 'd'), 0,
			RTEMS_BINARY_SEMAPHORE|RTEMS_GLOBAL, 0, &zynq_qspi_inst.sem_done);


	if (status != RTEMS_SUCCESSFUL)
	{
		printf("create qspi done sem failure!\n");
		rtems_semaphore_delete(zynq_qspi_inst.sem_bus);
		return -1;
	}


    zynq_slcr_qspi_cfg();
    zynq_qspi_cfg();
    status = rtems_interrupt_handler_install(ZYNQ_QSPI_IRQ_NUM,
			"qspi", RTEMS_INTERRUPT_UNIQUE, zynq_qspi_interrupt,
			(rtems_irq_hdl_param)(&zynq_qspi_inst));
	if (status != RTEMS_SUCCESSFUL)
	{
		printf("error:register zynq qspi irq failure!\n ");
		rtems_semaphore_delete(zynq_qspi_inst.sem_bus);
		rtems_semaphore_delete(zynq_qspi_inst.sem_done);
		return -1;
	}
	*/
	zynq_qspi_inst.inited = true;
	return 0;
}



I create semaphore with count is 0,so I think I should get sem failure,but it sucessfully,change RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY to default attribute will block .
   I used git version of rtems4.12
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20161217/c2a0f9d9/attachment-0001.html>


More information about the devel mailing list