From b45dec9b1ac5ab73094dcf423f614670a1519a86 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Thu, 2 Oct 2014 01:38:28 +0200 Subject: [PATCH] Use MP_ATOMIC_SECTION to enable/disable IRQs --- src/cc3k/src/spi.c | 8 ++++---- src/omv/py/uart.c | 6 ++++-- src/omv/sdcard_sdio.c | 8 ++++---- src/omv/sdcard_spi.c | 17 ++++++----------- src/omv/soft_i2c.c | 9 +++++---- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/cc3k/src/spi.c b/src/cc3k/src/spi.c index 54612838b..cfa129b2e 100644 --- a/src/cc3k/src/spi.c +++ b/src/cc3k/src/spi.c @@ -271,21 +271,21 @@ long SpiWrite(unsigned char *pUserBuffer, unsigned short usLength) void SpiWriteDataSynchronous(unsigned char *data, unsigned short size) { - __disable_irq(); + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) { BREAK(); } - __enable_irq(); + MICROPY_END_ATOMIC_SECTION(atomic_state); } void SpiReadDataSynchronous(unsigned char *data, unsigned short size) { memset(data, READ, size); - __disable_irq(); + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) { BREAK(); } - __enable_irq(); + MICROPY_END_ATOMIC_SECTION(atomic_state); } void SpiReadPacket(void) diff --git a/src/omv/py/uart.c b/src/omv/py/uart.c index cd9d030b4..92814a18d 100644 --- a/src/omv/py/uart.c +++ b/src/omv/py/uart.c @@ -24,11 +24,11 @@ static mp_int_t py_uart_read(mp_obj_t obj) mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_WRITE); } - __disable_irq(); + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); if (HAL_UART_Receive(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) { return -1; } - __enable_irq(); + MICROPY_END_ATOMIC_SECTION(atomic_state); return bufinfo.len; } @@ -47,9 +47,11 @@ static mp_int_t py_uart_write(mp_obj_t obj) mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_READ); } + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); if (HAL_UART_Transmit(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) { return -1; } + MICROPY_END_ATOMIC_SECTION(atomic_state); return bufinfo.len; } diff --git a/src/omv/sdcard_sdio.c b/src/omv/sdcard_sdio.c index aa70f43bb..fde697beb 100644 --- a/src/omv/sdcard_sdio.c +++ b/src/omv/sdcard_sdio.c @@ -69,21 +69,21 @@ void sdcard_power_off(void) mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count) { - __disable_irq(); HAL_SD_ErrorTypedef err; + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); err = HAL_SD_ReadBlocks(&SDHandle, (uint32_t*)buff, sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count); - __enable_irq(); + MICROPY_END_ATOMIC_SECTION(atomic_state); return (err != SD_OK); } mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t count) { - __disable_irq(); HAL_SD_ErrorTypedef err; + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); err = HAL_SD_WriteBlocks(&SDHandle, (uint32_t*)buff, sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count); - __enable_irq(); + MICROPY_END_ATOMIC_SECTION(atomic_state); return (err != SD_OK); } diff --git a/src/omv/sdcard_spi.c b/src/omv/sdcard_spi.c index c318ac74e..279556324 100644 --- a/src/omv/sdcard_spi.c +++ b/src/omv/sdcard_spi.c @@ -83,22 +83,26 @@ static BYTE spi_send(BYTE out) if (HAL_SPI_TransmitReceive(&SPIHandle, &out, &out, 1, SPI_TIMEOUT) != HAL_OK) { BREAK(); } - return out; } static bool spi_send_buff(const BYTE *buff, uint32_t size) { - return HAL_SPI_Transmit(&SPIHandle, (void*)buff, size, SPI_TIMEOUT)== HAL_OK; + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); + bool res = (HAL_SPI_Transmit(&SPIHandle, (void*)buff, size, SPI_TIMEOUT) == HAL_OK); + MICROPY_END_ATOMIC_SECTION(atomic_state); + return res; } #define spi_recv() spi_send(0xFF) static bool spi_recv_buff(BYTE *buff, uint32_t size) { + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); do { *buff++ = spi_recv(); } while (--size); + MICROPY_END_ATOMIC_SECTION(atomic_state); return true; } @@ -323,8 +327,6 @@ mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count) sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */ } - __disable_irq(); - if (count == 1) { /* Single block read */ if (send_cmd(CMD17, sector) == 0) { /* READ_SINGLE_BLOCK */ if (rcvr_datablock(buff, SDCARD_BLOCK_SIZE)) { @@ -343,9 +345,6 @@ mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count) } } release_spi(); - - __enable_irq(); - return count ? true: false; } @@ -359,8 +358,6 @@ mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t cou sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */ } - __disable_irq(); - if (count == 1) { /* Single block write */ if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ && xmit_datablock(buff, 0xFE)) @@ -380,8 +377,6 @@ mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t cou } } release_spi(); - - __enable_irq(); return count ? true: false; } diff --git a/src/omv/soft_i2c.c b/src/omv/soft_i2c.c index 5f5da25f8..bb1ae3d60 100644 --- a/src/omv/soft_i2c.c +++ b/src/omv/soft_i2c.c @@ -9,6 +9,7 @@ #include #include #include "soft_i2c.h" +#include "mp.h" #define I2C_PORT GPIOA #define I2C_SIOC_PIN GPIO_PIN_2 @@ -128,7 +129,7 @@ int soft_i2c_read_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop) { int ret = 0; - __disable_irq(); + mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); i2c_start(); ret |= i2c_write_byte(slv_addr | 0x01); for (int i=0; i