This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
packed array of bitfileds with gcc
- From: Drößler Tobias <Droessler dot Tobias at ik-elektronik dot com>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Mon, 28 Oct 2013 10:41:27 +0100
- Subject: packed array of bitfileds with gcc
- Authentication-results: sourceware.org; auth=none
Hi there.
Problem: I get data from an external interface with an organisation/granularity of 20bit-blocks. For buffering and processing I'd like to have an array of 20bit width elements.
Two Ideas:
a) a "packed" array of elements with 20bits width. So in 32Bit word there is a variable boundary to the next array index.
For a better understand here is a graphic about the memory - placement :
# |<----32bit------>|
==============
..
3 |-B5-|-----B4-----|
2 |-----B3-----|-B1-|
1 |---B2---|---B1---|
0 |-B1-|-----B0-----|
Is this possible in c /gcc ? The Advance will be a generic type and easy handling for processing, instead of idea b. How to get those type defined ?
The following code did not work because the array elements will not be packed, so memory is lost unused:
typedef struct __attribute__ ((__packed__))
{
uint32_t bl:20;
} block_t;
block_t buffer[30];
b) I define a union about 5 Bytes and two blocks - but handling will be bad, because of the two blocks as an elementary type.
typedef union
{
uint8_t B[5];
struct __attribute__ ((__packed__))
{
uint32_t block0: 20;
uint32_t block1: 20;
};
} block2_byte5_t;
Machine: 32bit (small) embedded CPU (Freescale Coldfire), processing time low priority / efficient RAM usage high prio.
So I hope there is a wise guy helping me .. Thanks to your attention.
Tobias