Use MP_ATOMIC_SECTION to enable/disable IRQs

This commit is contained in:
iabdalkader 2014-10-02 01:38:28 +02:00
parent d7cc41cfb0
commit b45dec9b1a
5 changed files with 23 additions and 25 deletions

View File

@ -271,21 +271,21 @@ long SpiWrite(unsigned char *pUserBuffer, unsigned short usLength)
void SpiWriteDataSynchronous(unsigned char *data, unsigned short size) 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) { if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) {
BREAK(); BREAK();
} }
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
} }
void SpiReadDataSynchronous(unsigned char *data, unsigned short size) void SpiReadDataSynchronous(unsigned char *data, unsigned short size)
{ {
memset(data, READ, 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) { if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) {
BREAK(); BREAK();
} }
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
} }
void SpiReadPacket(void) void SpiReadPacket(void)

View File

@ -24,11 +24,11 @@ static mp_int_t py_uart_read(mp_obj_t obj)
mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_WRITE); 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) { if (HAL_UART_Receive(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) {
return -1; return -1;
} }
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
return bufinfo.len; 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_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) { if (HAL_UART_Transmit(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) {
return -1; return -1;
} }
MICROPY_END_ATOMIC_SECTION(atomic_state);
return bufinfo.len; return bufinfo.len;
} }

View File

@ -69,21 +69,21 @@ void sdcard_power_off(void)
mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count) mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count)
{ {
__disable_irq();
HAL_SD_ErrorTypedef err; HAL_SD_ErrorTypedef err;
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
err = HAL_SD_ReadBlocks(&SDHandle, (uint32_t*)buff, err = HAL_SD_ReadBlocks(&SDHandle, (uint32_t*)buff,
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count); sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
return (err != SD_OK); return (err != SD_OK);
} }
mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t count) mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t count)
{ {
__disable_irq();
HAL_SD_ErrorTypedef err; HAL_SD_ErrorTypedef err;
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
err = HAL_SD_WriteBlocks(&SDHandle, (uint32_t*)buff, err = HAL_SD_WriteBlocks(&SDHandle, (uint32_t*)buff,
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count); sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
return (err != SD_OK); return (err != SD_OK);
} }

View File

@ -83,22 +83,26 @@ static BYTE spi_send(BYTE out)
if (HAL_SPI_TransmitReceive(&SPIHandle, &out, &out, 1, SPI_TIMEOUT) != HAL_OK) { if (HAL_SPI_TransmitReceive(&SPIHandle, &out, &out, 1, SPI_TIMEOUT) != HAL_OK) {
BREAK(); BREAK();
} }
return out; return out;
} }
static bool spi_send_buff(const BYTE *buff, uint32_t size) 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) #define spi_recv() spi_send(0xFF)
static bool spi_recv_buff(BYTE *buff, uint32_t size) static bool spi_recv_buff(BYTE *buff, uint32_t size)
{ {
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
do { do {
*buff++ = spi_recv(); *buff++ = spi_recv();
} while (--size); } while (--size);
MICROPY_END_ATOMIC_SECTION(atomic_state);
return true; 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 */ sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */
} }
__disable_irq();
if (count == 1) { /* Single block read */ if (count == 1) { /* Single block read */
if (send_cmd(CMD17, sector) == 0) { /* READ_SINGLE_BLOCK */ if (send_cmd(CMD17, sector) == 0) { /* READ_SINGLE_BLOCK */
if (rcvr_datablock(buff, SDCARD_BLOCK_SIZE)) { 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(); release_spi();
__enable_irq();
return count ? true: false; 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 */ sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */
} }
__disable_irq();
if (count == 1) { /* Single block write */ if (count == 1) { /* Single block write */
if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
&& xmit_datablock(buff, 0xFE)) && 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(); release_spi();
__enable_irq();
return count ? true: false; return count ? true: false;
} }

View File

@ -9,6 +9,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stm32f4xx_hal.h> #include <stm32f4xx_hal.h>
#include "soft_i2c.h" #include "soft_i2c.h"
#include "mp.h"
#define I2C_PORT GPIOA #define I2C_PORT GPIOA
#define I2C_SIOC_PIN GPIO_PIN_2 #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; int ret = 0;
__disable_irq(); mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
i2c_start(); i2c_start();
ret |= i2c_write_byte(slv_addr | 0x01); ret |= i2c_write_byte(slv_addr | 0x01);
for (int i=0; i<len; i++) { for (int i=0; i<len; i++) {
@ -137,7 +138,7 @@ int soft_i2c_read_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
if (stop) { if (stop) {
i2c_stop(); i2c_stop();
} }
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
return ret; return ret;
} }
@ -145,7 +146,7 @@ int soft_i2c_write_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
{ {
uint8_t ret = 0; uint8_t ret = 0;
__disable_irq(); mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
i2c_start(); i2c_start();
ret |= i2c_write_byte(slv_addr); ret |= i2c_write_byte(slv_addr);
for (int i=0; i<len; i++) { for (int i=0; i<len; i++) {
@ -155,7 +156,7 @@ int soft_i2c_write_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
if (stop) { if (stop) {
i2c_stop(); i2c_stop();
} }
__enable_irq(); MICROPY_END_ATOMIC_SECTION(atomic_state);
return ret; return ret;
} }