Semaphore
Hi!
I have some doubts on semahore use for lock a resource (EEPROM).
I try to define the semaphore, let’s say in eeprom.c and initialize it:
static xSemaphoreHandle xSemaphoreEEPROM;
char eepromInit(void)
{
vSemaphoreCreateBinary( xSemaphoreEEPROM );
if( xSemaphoreEEPROM != NULL ) return 0;
return 1;
}
Then, can I have two files, each one with one different task that can test the semaphore xSemaphoreEEPROM before addressing the EEPROM, like:
…
if( xSemaphoreTake( xSemaphoreEEPROM, ( portTickType ) timeout ) )
{
/* Call function to write data on eeprom… */
xSemaphoreGive( xSemaphoreEEPROM );
}
…
This can lock the resource, or the last code must be included in eeprom.c like a driver:
char writeEEPROM (int addr, int n, char *data, int timeout)
{
if( xSemaphoreTake( xSemaphoreEEPROM, ( portTickType ) timeout ) )
{
/* Write data… */
xSemaphoreGive( xSemaphoreEEPROM );
}
}
Please give me some hint about this.
Semaphore
What you say seems to be correct. You are using the semaphore to ensure mutual exclusion of the eeprom resource.
Semaphore
I don’t have experience in these kinf of OS’s but there will eventually two task accessing the same function:
char writeEEPROM (int addr, int n, char *data, int timeout)
{
if( xSemaphoreTake( xSemaphoreEEPROM, ( portTickType ) timeout ) )
{
/* Write data… */
xSemaphoreGive( xSemaphoreEEPROM );
}
}
There is any problem when two tasks call the same function with a lock semaphore like the previous one?
Or there is a better way to do this?
Semaphore
Nope, this is exactly how semaphores should be used.