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)
{
__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)

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);
}
__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;
}

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)
{
__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);
}

View File

@ -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;
}

View File

@ -9,6 +9,7 @@
#include <stdbool.h>
#include <stm32f4xx_hal.h>
#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<len; i++) {
@ -137,7 +138,7 @@ int soft_i2c_read_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
if (stop) {
i2c_stop();
}
__enable_irq();
MICROPY_END_ATOMIC_SECTION(atomic_state);
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;
__disable_irq();
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
i2c_start();
ret |= i2c_write_byte(slv_addr);
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) {
i2c_stop();
}
__enable_irq();
MICROPY_END_ATOMIC_SECTION(atomic_state);
return ret;
}