kernel: Fixed init_delay initialization on older GCC versions
Within the K_THREAD_DEFINE macro, a nested set of macros is expanded to
populate the values of a global _static_thread_data structure.
The K_THREAD_DEFINE macro expands to statements including the
Z_THREAD_COMMON_DEFINE macro, which expands to statements including the
Z_THREAD_INITIALIZER macro, which expands to an initialization expression
of a _static_thread_data struct. The init_delay member of that struct is
then initialized with the Z_THREAD_INIT_DELAY_INITIALIZER macro, which
expands to an expression including the SYS_TIMEOUT_MS macro which
converts a number of milliseconds to a number of ticks.
For example, take the following macro:
K_THREAD_DEFINE(
thread_X,
STACKSIZE,
thread_X_entry_point, NULL, NULL, NULL,
PRIORITY,
0,
0);
In abbreviated form, it expands as follows:
typedef struct {
int ticks;
} k_timeout_t;
struct _static_thread_data {
/* ... */
k_timeout_t init_delay;
};
struct _static_thread_data _k_thread_data_thread_X = {
/* ... */
.init_delay = (k_timeout_t){ .ticks = 0 }
};
However, in GCC versions before 5.1, the code fails to compile with the
error "initializer element is not constant", when compiled with the
following options:
gcc -std=gnu99 -c test.c
In the above code, the error can be corrected by replacing...
.init_delay = (k_timeout_t){ .ticks = 0 }
...with...
.init_delay = { .ticks = 0 }
...i.e. removing initialization with a compound literal.
In order to achieve this, this patch reworks the system of macros.
The Z_TIMEOUT_TICKS(t) macro is refactored into Z_TIMEOUT_TICKS_INIT(t)
which defines the initializer part: { .ticks = t }, and Z_TIMEOUT_TICKS(t)
which is defined as ((k_timeout_t) Z_TIMEOUT_TICKS_INIT(t)) .
For symmetry, Z_TIMEOUT_NO_WAIT_INIT is split out of Z_TIMEOUT_NO_WAIT.
Similarly, SYS_TIMEOUT_MS_INIT(ms) is split out of SYS_TIMEOUT_MS(ms) so
that the Z_THREAD_INIT_DELAY_INITIALIZER(ms) macro can use
SYS_TIMEOUT_MS_INIT(ms) which expands Z_TIMEOUT_TICKS_INIT(t) to initialize
init_delay without using a compound literal.
Signed-off-by:
Joel Holdsworth <jholdsworth@nvidia.com>
Loading
Please sign in to comment