1 /* 2 * Copyright (c) 2017 Oticon A/S 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef _POSIX_SOC_INF_CLOCK_POSIX_NATIVE_TASK_H 8 #define _POSIX_SOC_INF_CLOCK_POSIX_NATIVE_TASK_H 9 10 #include <zephyr/toolchain.h> 11 12 #ifdef __cplusplus 13 extern "C" { 14 #endif 15 16 /** 17 * NATIVE_TASK 18 * 19 * For native targets (POSIX arch based), register a function to be called at particular moments 20 * during the native target execution. 21 * 22 * There is 5 choices for when the function will be called (level): 23 * * PRE_BOOT_1: Will be called before the command line parameters are parsed, 24 * or the HW models are initialized 25 * 26 * * PRE_BOOT_2: Will be called after the command line parameters are parsed, 27 * but before the HW models are initialized 28 * 29 * * PRE_BOOT_3: Will be called after the HW models initialization, right before 30 * the "CPU is booted" and Zephyr is started. 31 * 32 * * FIRST_SLEEP: Will be called the 1st time the CPU is sent to sleep 33 * 34 * * ON_EXIT: Will be called during termination of the native application 35 * execution. 36 * 37 * The function must take no parameters and return nothing. 38 * Note that for the PRE and ON_EXIT levels neither the Zephyr kernel or 39 * any Zephyr thread are running. 40 */ 41 #define NATIVE_TASK(fn, level, prio) \ 42 static void (* const _CONCAT(__native_task_, fn))() __used __noasan \ 43 __attribute__((__section__(".native_" #level STRINGIFY(prio) "_task")))\ 44 = fn 45 46 47 #define _NATIVE_PRE_BOOT_1_LEVEL 0 48 #define _NATIVE_PRE_BOOT_2_LEVEL 1 49 #define _NATIVE_PRE_BOOT_3_LEVEL 2 50 #define _NATIVE_FIRST_SLEEP_LEVEL 3 51 #define _NATIVE_ON_EXIT_LEVEL 4 52 53 /** 54 * @brief Run the set of special native tasks corresponding to the given level 55 * 56 * @param level One of _NATIVE_*_LEVEL as defined in soc.h 57 */ 58 void run_native_tasks(int level); 59 60 #ifdef __cplusplus 61 } 62 #endif 63 64 #endif /* _POSIX_SOC_INF_CLOCK_POSIX_NATIVE_TASK_H */ 65