1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-18 03:52:11 +01:00

OP-27 Use RTOS in LockDevice() and UnlockDevice()

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@564 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
fredericg 2010-05-01 14:49:51 +00:00 committed by fredericg
parent 724e82712b
commit 3281b1a128
3 changed files with 29 additions and 37 deletions

View File

@ -196,7 +196,7 @@ int32_t PIOS_BMP085_GetPressure(void)
int32_t PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len)
{
/* Try to get the I2C peripheral */
if(PIOS_I2C_LockDevice(I2C_Non_Blocking) < 0) {
if(PIOS_I2C_LockDevice(0) < 0) {
/* Request a retry */
return -2;
}
@ -230,7 +230,7 @@ int32_t PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len)
int32_t PIOS_BMP085_Write(uint8_t address, uint8_t buffer)
{
/* Try to get the IIC peripheral */
if(PIOS_I2C_LockDevice(I2C_Non_Blocking) < 0) {
if(PIOS_I2C_LockDevice(0) < 0) {
/* Request a retry */
return -2;
}

View File

@ -77,9 +77,9 @@ typedef struct {
#ifdef USE_FREERTOS
xSemaphoreHandle sem_readySignal;
portBASE_TYPE xHigherPriorityTaskWoken;
xSemaphoreHandle xBusyMutex;
#endif
volatile uint8_t i2c_semaphore;
} I2CRecTypeDef;
/* Local Prototypes */
@ -131,11 +131,11 @@ int32_t PIOS_I2C_Init(void)
PIOS_I2C_InitPeripheral();
/* Now accessible for other tasks */
I2CRec.i2c_semaphore = 0;
#ifdef USE_FREERTOS
vSemaphoreCreateBinary(I2CRec.sem_readySignal);
#endif
I2CRec.xBusyMutex = xSemaphoreCreateMutex();
#endif // USE_FREERTOS
TransferEnd(&I2CRec);
@ -197,45 +197,38 @@ static void PIOS_I2C_InitPeripheral(void)
}
#ifdef USE_FREERTOS
/**
* Semaphore handling: requests the IIC interface
* \param[in] semaphore_type is either IIC_Blocking or IIC_Non_Blocking
* \return Non_Blocking: returns -1 to request a retry
* \return 0 if IIC interface free
* \param[in] timeout Timeout in ticks, 0 for no delay
* \return TRUE when the lock to the device was obtained
*/
int32_t PIOS_I2C_LockDevice(I2CSemaphoreTypeDef semaphore_type)
bool PIOS_I2C_LockDevice(portTickType timeout)
{
volatile I2CRecTypeDef *i2cx = &I2CRec;
int32_t status = -1;
do {
PIOS_IRQ_Disable();
if(!i2cx->i2c_semaphore) {
i2cx->i2c_semaphore = 1;
status = 0;
}
PIOS_IRQ_Enable();
} while(semaphore_type == I2C_Blocking && status != 0);
/* Clear transfer errors of last transmission */
i2cx->transfer_error = 0;
return status;
if (xSemaphoreTake(I2CRec.xBusyMutex, timeout) == pdTRUE)
{
// Ok, got device
return TRUE;
}
else
{
return FALSE;
}
}
/**
* Semaphore handling: releases the IIC interface for other tasks
* \return < 0 on errors
*/
int32_t PIOS_I2C_UnlockDevice(void)
void PIOS_I2C_UnlockDevice(void)
{
I2CRec.i2c_semaphore = 0;
/* No error */
return 0;
xSemaphoreGive(I2CRec.xBusyMutex);
}
#endif // USE_FREERTOS
/**
* Internal function called at the start of a transfer

View File

@ -41,10 +41,6 @@
/* Global Types */
typedef enum {
I2C_Blocking,
I2C_Non_Blocking
} I2CSemaphoreTypeDef;
typedef enum {
I2C_Read,
@ -54,11 +50,14 @@ typedef enum {
/* Public Functions */
extern int32_t PIOS_I2C_Init(void);
extern int32_t PIOS_I2C_LockDevice(I2CSemaphoreTypeDef semaphore_type);
extern int32_t PIOS_I2C_UnlockDevice(void);
extern int32_t PIOS_I2C_TransferCheck(void);
extern int32_t PIOS_I2C_TransferWait(void);
extern int32_t PIOS_I2C_Transfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t *buffer, uint16_t len);
extern void PIOS_I2C_StartTransfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t *buffer, uint16_t len);
#ifdef PIOS_INCLUDE_FREERTOS
extern bool PIOS_I2C_LockDevice(portTickType timeout);
extern void PIOS_I2C_UnlockDevice(void);
#endif // PIOS_INCLUDE_FREERTOS
#endif /* PIOS_I2C_H */