Bitmap handling (goal_bm)
This GOAL core module provides a function to allocate memory for a bit-field. Single bits of the bit-field can be taken from the bit-field by a function. The function can use the bit. If the bit is not more needed the function has to return the bit to the bit-field. If a bit is used, another function cannot take this bit from the bit-field. The bit-field must be allocated in state GOAL_FSA_INIT
.
Figure: bitmap handling
Locking mechanisms are not implemented for the functions of this GOAL core module. If the locking of the bit-field is necessary, the locking must be done by the caller.
This GOAL core module provides no CM-variables and no command line interface.
GOAL files:
goal_bm.[h,c]
example:
not available
Implementation guidelines
Create a bit-field with a lock
Code: Create a bit-field with a lock
/* Create a handle to the bit-field. */
GOAL_BM_T *pFlags = NULL;
/* Create a handle for the lock to the bit-field. */
GOAL_LOCK_T *pLockFlags;
/* Create a binary lock to avoid multiple accesses to the bit-field. A binary lock has the value range [0,1]. */
GOAL_STATUS_T res; /* GOAL return value */
res = goal_lockCreate(GOAL_LOCK_BINARY, &pLockFlags, 0, 1, GOAL_ID_BM);
/* Allocate the memory for the bit-field in state GOAL_FSA_INIT for 16 bits. */
if (GOAL_RES_OK(res)) {
res = goal_bmAlloc(&pFlags, 16);
}
Take a bit from the bit-field
Code: Take a bit from the bit-field
GOAL_STATUS_T res; /* GOAL return status */
uint32_t bitNum; /* number of the bit */
/* Set the lock. If the lock is not available, wait on the lock forever. */
res = goal_lockGet(pLockFlags, GOAL_LOCK_INFINITE);
/* Take the next available bit from the bit-field. */
if (GOAL_RES_OK(res)) { /* lock is set successful */
res = goal_bmBitReq(pFlags, &bitNum);
/* Reset the lock. */
goal_lockPut(pLockFlags);
}
Return a bit to the bit-field
Code: Return a bit to the bit-field
GOAL_STATUS_T res; /* GOAL return status */
/* Set the lock. If the lock is not available, wait on the lock forever. */
res = goal_lockGet(pLockFlags, GOAL_LOCK_INFINITE);
/* Return the bit to the bit-field. */
if (GOAL_RES_OK(res)) { /* lock is set successful */
res = goal_bmBitRel(pFlags, bitNum);
/* Reset the lock. */
goal_lockPut(pLockFlags);
}