kernel/os: Update device initialization condition #3043
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Function os_dev_init() is called in two places
First possibility is when device is created in
os_dev_create() AND g_os_started is not 0
This apply to devices that are created after main
function is called (including package defined syscfg functions).
Other place that calls os_dev_init is os_dev_initialize_all() This function calls all os_dev_init() functions for requested stage. When os_dev_initalize_all() is called only devices added by bsp (often delegated to mcu) are created. Keep in mind that since g_os_started is not set yet condition is not checked.
When mcuboot starts with sysinit() enabled it calls os_dev_initalize_all() twice then executes sysinit(). Any device created in sysinit() will not be initialized since g_os_started is not set.
This change stores device init stage number and uses it when devices are initialized. For devices created by BSP initial stage is 0 so dev_init is not called during device creation but postponed till os_dev_initialize_all() is called (so despite condition change initialization sequence stays the same).
For devices created in sysinit() stage is already set to KERNEL and they are initialized during creation even though g_os_started is not checked any more. So there should not be any differences in behavior.
For MCUBoot, devices created in sysinit() will have dev_init called when created just like it would happen when OS_SCHEDULING is enabled.
Only difference is that when device initialization fails at one stage but is not marked as critical initialization will be attempted in next stage.