The init infrastructure, found in `init.h`, is currently used by:
- `SYS_INIT`: to call functions before `main`
- `DEVICE_*`: to initialize devices
They are all sorted according to an initialization level + a priority.
`SYS_INIT` calls are really orthogonal to devices, however, the required
function signature requires a `const struct device *dev` as a first
argument. The only reason for that is because the same init machinery is
used by devices, so we have something like:
```c
struct init_entry {
int (*init)(const struct device *dev);
/* only set by DEVICE_*, otherwise NULL */
const struct device *dev;
}
```
As a result, we end up with such weird/ugly pattern:
```c
static int my_init(const struct device *dev)
{
/* always NULL! add ARG_UNUSED to avoid compiler warning */
ARG_UNUSED(dev);
...
}
```
This is really a result of poor internals isolation. This patch proposes
a to make init entries more flexible so that they can accept sytem
initialization calls like this:
```c
static int my_init(void)
{
...
}
```
This is achieved using a union:
```c
union init_function {
/* for SYS_INIT, used when init_entry.dev == NULL */
int (*sys)(void);
/* for DEVICE*, used when init_entry.dev != NULL */
int (*dev)(const struct device *dev);
};
struct init_entry {
/* stores init function (either for SYS_INIT or DEVICE*)
union init_function init_fn;
/* stores device pointer for DEVICE*, NULL for SYS_INIT. Allows
* to know which union entry to call.
*/
const struct device *dev;
}
```
This solution **does not increase ROM usage**, and allows to offer clean
public APIs for both SYS_INIT and DEVICE*. Note that however, init
machinery keeps a coupling with devices.
**NOTE**: This is a breaking change! All `SYS_INIT` functions will need
to be converted to the new signature. See the script offered in the
following commit.
Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
init: convert SYS_INIT functions to the new signature
Conversion scripted using scripts/utils/migrate_sys_init.py.
Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
manifest: update projects for SYS_INIT changes
Update modules with updated SYS_INIT calls:
- hal_ti
- lvgl
- sof
- TraceRecorderSource
Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
tests: devicetree: devices: adjust test
Adjust test according to the recently introduced SYS_INIT
infrastructure.
Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
tests: kernel: threads: adjust SYS_INIT call
Adjust to the new signature: int (*init_fn)(void);
Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
|
||
|---|---|---|
| .. | ||
| boards | ||
| remote | ||
| src | ||
| CMakeLists.txt | ||
| common.h | ||
| Kconfig | ||
| Kconfig.sysbuild | ||
| prj.conf | ||
| README.rst | ||
| sample.yaml | ||
| sysbuild.cmake | ||
.. _openAMP_sample: OpenAMP Sample Application ########################## Overview ******** This application demonstrates how to use OpenAMP with Zephyr. It is designed to demonstrate how to integrate OpenAMP with Zephyr both from a build perspective and code. Note that the remote and primary core images can be flashed independently, but sysbuild must be used in order to flash them in one step. Building the application for lpcxpresso54114_m4 *********************************************** .. zephyr-app-commands:: :zephyr-app: samples/subsys/ipc/openamp :board: lpcxpresso54114_m4 :goals: debug Building the application for lpcxpresso55s69_cpu0 ************************************************* .. zephyr-app-commands:: :zephyr-app: samples/subsys/ipc/openamp :board: lpcxpresso55s69_cpu0 :goals: debug Building the application for mps2_an521 *************************************** .. zephyr-app-commands:: :zephyr-app: samples/subsys/ipc/openamp :board: mps2_an521 :goals: debug Building the application for v2m_musca_b1 ***************************************** .. zephyr-app-commands:: :zephyr-app: samples/subsys/ipc/openamp :board: v2m_musca_b1 :goals: debug Building the application for mimxrt1170_evk_cm7 *********************************************** .. zephyr-app-commands:: :zephyr-app: samples/subsys/ipc/openamp :board: mimxrt1170_evk_cm7 :goals: debug Open a serial terminal (minicom, putty, etc.) and connect the board with the following settings: - Speed: 115200 - Data: 8 bits - Parity: None - Stop bits: 1 Reset the board and the following message will appear on the corresponding serial port, one is master another is remote: .. code-block:: console **** Booting Zephyr OS build zephyr-v1.14.0-2064-g888fc98fddaa **** Starting application thread! OpenAMP[master] demo started Master core received a message: 1 Master core received a message: 3 Master core received a message: 5 ... Master core received a message: 99 OpenAMP demo ended. .. code-block:: console **** Booting Zephyr OS build zephyr-v1.14.0-2064-g888fc98fddaa **** Starting application thread! OpenAMP[remote] demo started Remote core received a message: 0 Remote core received a message: 2 Remote core received a message: 4 ... Remote core received a message: 98 OpenAMP demo ended.