diff options
| author | xqyjlj <[email protected]> | 2023-10-25 20:31:25 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-25 20:31:25 +0800 |
| commit | 3283f54c7a0444b2e51ec79a4da57e7871528f05 (patch) | |
| tree | e4bcd748ad2362f16d0dea5c5da62922de466999 /components/drivers/serial/serial.c | |
| parent | 91fc52df3635d5dda8285616420f08efa79cea04 (diff) | |
🎈 perf: perf rt_hw_interrupt_disable/enable (#8042)
Signed-off-by: Shell <[email protected]>
Co-authored-by: Shell <[email protected]>
Diffstat (limited to 'components/drivers/serial/serial.c')
| -rw-r--r-- | components/drivers/serial/serial.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c index 1777a231b3..0382f3c856 100644 --- a/components/drivers/serial/serial.c +++ b/components/drivers/serial/serial.c @@ -26,6 +26,7 @@ * when using interrupt tx * 2020-12-14 Meco Man implement function of setting window's size(TIOCSWINSZ) * 2021-08-22 Meco Man implement function of getting window's size(TIOCGWINSZ) + * 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable */ #include <rthw.h> @@ -208,10 +209,10 @@ static int serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req) rx_fifo = (struct rt_serial_rx_fifo*) serial->serial_rx; - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); if ((rx_fifo->get_index != rx_fifo->put_index) || (rx_fifo->get_index == rx_fifo->put_index && rx_fifo->is_full == RT_TRUE)) mask |= POLLIN; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); } return mask; @@ -303,13 +304,13 @@ rt_inline int _serial_int_rx(struct rt_serial_device *serial, rt_uint8_t *data, rt_base_t level; /* disable interrupt */ - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); /* there's no data: */ if ((rx_fifo->get_index == rx_fifo->put_index) && (rx_fifo->is_full == RT_FALSE)) { /* no data, enable interrupt and break out */ - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); break; } @@ -324,7 +325,7 @@ rt_inline int _serial_int_rx(struct rt_serial_device *serial, rt_uint8_t *data, } /* enable interrupt */ - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); *data = ch & 0xff; data ++; length --; @@ -501,7 +502,7 @@ rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data, RT_ASSERT((serial != RT_NULL) && (data != RT_NULL)); - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); if (serial->config.bufsz == 0) { @@ -518,7 +519,7 @@ rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data, serial->ops->dma_transmit(serial, data, length, RT_SERIAL_DMA_RX); } else result = -RT_EBUSY; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); if (result == RT_EOK) return length; @@ -547,7 +548,7 @@ rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data, recv_len + rx_fifo->get_index - serial->config.bufsz); } rt_dma_recv_update_get_index(serial, recv_len); - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); return recv_len; } } @@ -563,18 +564,18 @@ rt_inline int _serial_dma_tx(struct rt_serial_device *serial, const rt_uint8_t * result = rt_data_queue_push(&(tx_dma->data_queue), data, length, RT_WAITING_FOREVER); if (result == RT_EOK) { - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); if (tx_dma->activated != RT_TRUE) { tx_dma->activated = RT_TRUE; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); /* make a DMA transfer */ serial->ops->dma_transmit(serial, (rt_uint8_t *)data, length, RT_SERIAL_DMA_TX); } else { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); } return length; @@ -980,10 +981,10 @@ static void _tc_flush(struct rt_serial_device *serial, int queue) if((device->open_flag & RT_DEVICE_FLAG_INT_RX) || (device->open_flag & RT_DEVICE_FLAG_DMA_RX)) { RT_ASSERT(RT_NULL != rx_fifo); - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); rx_fifo->get_index = rx_fifo->put_index; rx_fifo->is_full = RT_FALSE; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); } else { @@ -1245,9 +1246,9 @@ static rt_err_t rt_serial_control(struct rt_device *dev, rt_size_t recved = 0; rt_base_t level; - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); recved = _serial_fifo_calc_recved_len(serial); - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); *(rt_size_t *)args = recved; } @@ -1286,6 +1287,8 @@ rt_err_t rt_hw_serial_register(struct rt_serial_device *serial, struct rt_device *device; RT_ASSERT(serial != RT_NULL); + rt_spin_lock_init(&(serial->spinlock)); + device = &(serial->parent); device->type = RT_Device_Class_Char; @@ -1337,7 +1340,7 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) /* disable interrupt */ - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); rx_fifo->buffer[rx_fifo->put_index] = ch; rx_fifo->put_index += 1; @@ -1354,7 +1357,7 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) } /* enable interrupt */ - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); } /* invoke callback */ @@ -1363,10 +1366,10 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) rt_size_t rx_length; /* get rx length */ - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index): (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index)); - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); if (rx_length) { @@ -1438,13 +1441,13 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) else { /* disable interrupt */ - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(serial->spinlock)); /* update fifo put index */ rt_dma_recv_update_put_index(serial, length); /* calculate received total length */ length = rt_dma_calc_recved_len(serial); /* enable interrupt */ - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(serial->spinlock), level); /* invoke callback */ if (serial->parent.rx_indicate != RT_NULL) { |
