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
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to