Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]>
- Loading branch information