On 6/5/19 1:55 am, Ярослав Лещинский wrote: > Hello again, > > still have some troubles with post/wait binary semaphore sequence. Could > someone > suggest what is a right way when you're working with semaphore inside > interrupts. > > I have sys call via spidev which is waiting for the binary semaphore. > Semaphore > released inside the interrupt. In some cases after several transmission I'm > getting fatal: RTEMS_FATAL_SOURCE_EXCEPTION.
What type of fatal error are you seeing? Chris > > I'll be really appreciate for any suggestions. > > BRs, Yaroslav. > > On Wed, 17 Apr 2019 at 16:25, Ярослав Лещинский <midniwal...@gmail.com > <mailto:midniwal...@gmail.com>> wrote: > > Hello, > > I wrote spidev driver for stm32l4 mcu. > > spi_trasfer function looks like: > > static int spi_transfer( > spi_bus *base, > const spi_ioc_transfer *msgs, > uint32_t msg_count) > { > struct stm32l4_spi_bus *bus = (struct stm32l4_spi_bus *)base; > > SPI_TypeDef *spix = (SPI_TypeDef *)bus->driver.spix; > enum spi_major_num num = get_spi_major_number(spix); > > bus->msg = &msgs[0]; > spi_bus_table[num] = bus; > spi_bus_table[num]->msg_count = msg_count; > spi_bus_table[num]->messages_left = msg_count; > > int msg_error = spi_setup_trasfer( > spi_bus_table[num], > spi_bus_table[num]->msg, > spi_bus_table[num]->messages_left); > > rtems_binary_semaphore_wait(&bus->sem); > > return (msg_error == 0)? 0 : -EINVAL; > } > > Transmission proceeded via SPI IRQ + DMA IRQ. In DMA IRQ handler after dma > successfully transmitted all data I'm using rtems_binary_semaphore_post > for > corresponding semaphore. > > bool bus_is_broken = (bus == NULL) || > (msg_count < bus->messages_left) || > (msg_count == 0); > int ret = 0; > > if(bus_is_broken == true) > { > return -EINVAL; > } > > if(msgs->cs_change == true) > { > spi_css_deselect(&bus->driver); > } > > if(bus->messages_left > 0) > { > const size_t msg_idx = msg_count - bus->messages_left; > ret = spi_do_transfer(bus, msgs, msg_idx); > > bus->messages_left--; > > if(ret != 0) > { > rtems_binary_semaphore_post(&bus->sem); > > return ret; > } > } > else > { > rtems_binary_semaphore_post(&bus->sem); > } > > return ret; > > Currently I see that semaphore was successfully posted but control was not > returned to spi_transfer. > > As I know there are can be some issues with a context switching. > Does rtems_binary_semaphore_post know about where control should be > returned? > > > Thanks. > > -- > -- > Kind regards, > *Yaroslav Leshchinsky* > > > > -- > -- > Kind regards, > *Yaroslav Leshchinsky* > > _______________________________________________ > users mailing list > users@rtems.org > http://lists.rtems.org/mailman/listinfo/users > _______________________________________________ users mailing list users@rtems.org http://lists.rtems.org/mailman/listinfo/users