Application Selector说明


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 08/15/2024

    1. 概述

    Application Selector作为一个APP的Common Lib被RTOS Preload/RTOS CM4/PTREE等应用调用。如果earlyinit setting相关的config打开时,它会从earlyinit_setting.json或者headers中获取“APP_0_0”中“NAME”字段的值选择要启动的APP,获取“PARAM”获取启动app的参数,从而达到可以通过json动态配置需要启动的APP的目的。

    2. 编译配置

    代码存放路径:rtos/proj/sc/application/pipeline_demo/application_selector/

    ALKAID的menuconfig config路径:Rtos -----  > Rtos Application Options ----- > Support pipeline demo applications ------ > Support application selector

    默认情况下,如果Support IPC application即RTOS Preload应用、Support CM4 application即RTOS CM4、Support pipeline tree application即PTREE,处于被打开的状态下,application selector会被跟着打开


    3. 接口介绍

    请看application_selector.h中的注释说明:

    /*
     * Register initcall function for each application, and only one matched in earlyinit json can be run.
     */
    #define rtos_application_selector_initcall(__name, __func)                         \
    extern int application_selector_check(const char *app_name, char ***pargv);        \
    extern bool g_selector_found_app;                                                  \
    static void __rtos_application_selector_main(void)                                 \
    {                                                                                  \
        int argc = 0, i = 0;                                                           \
        char **argv = NULL;                                                            \
        argc = application_selector_check(#__name, &argv);                             \
        if (argc > 0)                                                                  \
        {                                                                              \
            g_selector_found_app = true;                                               \
            int ret = __func(argc, argv);                                              \
            if (ret != 0)                                                              \
            {                                                                          \
                CamOsPrintf("[APP-SEL][ERR] : %s Exit error, ret %d\n", #__name, ret); \
            }                                                                          \
            for (i = 0; i < argc; i++)                                                 \
            {                                                                          \
                CamOsMemRelease(argv[i]);                                              \
                argv[i] = NULL;                                                        \
            }                                                                          \
        }                                                                              \
    }                                                                                  \
    rtos_application_initcall(__rtos_application_selector_main, 1);
    
    /*
     * Do umount the partition and resume richos.
     * Return: 0  if success.
     * Return: -1 if got any failure.
     */
    int application_selector_retreat(void);
    
    /*
     * For big file such as ipu model, isp iq bin etc..
     * Return: 0  if success.
     * Return: -1 if got any failure.
     */
    const char *application_selector_get_rofile_path(void);
    
    /*
     * For small file such as modparam.json, PreloadSetting.txt etc..
     * Return: 0  if success.
     * Return: -1 if got any failure.
     */
    const char *application_selector_get_rwfile_path(void);
    

    4. 应用场景

    1、参考rtos_preload.c,使用宏rtos_application_selector_initcall注册程序的入口处调用函数,入口函数的类型为:static int initcall(int argc, char **argv)

    2、应用结束时必须调用application_selector_retreat。