MS-RTOS 启动参数文件

更新时间:
2023-08-09
下载文档

MS-RTOS 启动参数文件

本章将介绍 MS-RTOS 启动参数文件的使用。

MS-RTOS 启动参数文件功能

MS-RTOS 启动参数文件描述了 MS-RTOS 的 launcher 该如何去启动 APP 和如何定制 OS 的运行时功能。

MS-RTOS 启动参数使用 dts 格式文件描述,使用 msrtos-dtc 工具可以将 dts 格式文件编译成 dtb 格式文件。

MS-RTOS 启动内核后,BSP 调用 launcher 的 ms_apps_start 函数,并传入储存在 MS-FLASHFS 文件系统里 dtb 格式启动参数文件,launcher 将执行以下流程:

  • 定制 OS 运行时功能(创建管道、共享内存设备、全局 IPC 设备)
  • 依次启动具有自动启动属性的 APP,并建立配额、权限信息

dts 格式启动参数文件示例

/*
 * Copyright(c) 2015-2020 ACOINFO, Inc.
 */

/dts-v1/;

/ {
    os {
        compatible = "ms-rtos";                  // 类型
        vendor = "acoinfo";                      // 厂商
        version = <1>;                           // 版本号

        shm {
            shm0 {
                compatible = "ms-shm";           // 类型
                path = "/dev/shm0";              // 共享内存设备文件路径
                base = <0x20000000>;             // 共享内存基地址
                size = <4096>;                   // 共享内存大小
                mpu_protect = <1>;               // 使用 MPU 进行保护
            };
            
            shm1 {
                compatible = "ms-shm";           // 类型
                path = "/dev/shm1";              // 共享内存设备文件路径
                base = <0x20001000>;             // 共享内存基地址
                size = <4096>;                   // 共享内存大小
                mpu_protect = <1>;               // 使用 MPU 进行保护
            };
        };
        
        pipe {
            pipe0 {
                compatible = "ms-pipe";          // 类型
                path = "/dev/pipe0";             // 管道设备文件路径
                size = <128>;                    // 管道大小
            };
            
            pipe1 {
                compatible = "ms-pipe";          // 类型
                path = "/dev/pipe1";             // 管道设备文件路径
                size = <128>;                    // 管道大小
            };
        };

        semc {
            semc0 {
                compatible = "ms-semc";          // 类型
                path = "/dev/semc0";             // 全局计数信号量设备文件路径
                opt = <0>;                       // 全局计数信号量设备的选项
                init_value = <1>;                // 全局计数信号量设备的初始值
                max_value = <100>;               // 全局计数信号量设备的最大值
            };
            
            semc1 {
                compatible = "ms-semc";          // 类型
                path = "/dev/semc1";             // 全局计数信号量设备文件路径
                opt = <0>;                       // 全局计数信号量设备的选项
                init_value = <1>;                // 全局计数信号量设备的初始值
                max_value = <100>;               // 全局计数信号量设备的最大值
            };
        };
    };

    apps {
        lvgl_demo {                              // APP 的名字
            compatible = "ms-app";               // 类型,必须是 ms-app
            vendor = "acoinfo";                  // APP 的开发厂商
            version = <1>;                       // APP 的版本号
            
            img_file = "lvgl_demo.bin";          // APP 在 MS-FLASHFS 文件系统中的镜像源文件
            auto_start = <1>;                    // APP 是否自动启动
            mem_size = <65536>;                  // APP 可以使用的内存大小
            
            main_stk_size = <4096>;              // 进程的主线程的堆栈空间大小
            main_prio = <10>;                    // 进程的主线程的优先级
            main_time_slice = <0>;               // 进程的主线程的时间片
            
            crash_reboot = <0>;                  // APP crash 时是否重启
            highest_prio = <0>;                  // APP 的线程的最高优先级
            log_level = <0>;                     // APP 的默认日志级别

            thread_max = <3>;                    // APP 可以创建的最大线程数
            eventset_max = <3>;                  // APP 可以创建的最大事件标志组数
            mempool_max = <3>;                   // APP 可以创建的最大内存池数
            mqueue_max = <3>;                    // APP 可以创建的最大消息队列数
            mutex_max = <3>;                     // APP 可以创建的最大互斥量数
            semc_max = <3>;                      // APP 可以创建的最大计数信号量数
            rwlock_max = <3>;                    // APP 可以创建的最大读写锁数
            file_max = <3>;                      // APP 可以打开的最大文件数
            dir_perm = "/dev/*", "/nor/*";       // APP 可以访问的目录
            dev_perm = "/dev/console:rw", "/dev/uart0:rw", "/dev/rtc:rw";      
                                                 // APP 可以访问的设备文件和权限
            op_perm = "reboot", "update", "time_set", "app_start", "app_kill", "signal";
                                                 // APP 可以进行的操作
            eeprom_w_perm = <0 8>;               // APP 可以写的 EEPROM 区域(基地址、长度)
        };
    };
};

多个设备权限使用 , 号分隔,设备访问权限有三种:

设备访问权限描述
:rw可读写
:w可写
:r可读

如果没有提供设备访问权限,则为默认的可读写。

操作权限有以下几种:

操作权限描述
reboot可调用 ms_rtos_reboot 函数重启和可调用 ms_rtos_shutdown 函数关机
update可调用 ms_rtos_update 函数升级
time_set可调用 ms_settimeofday 函数设置当前精确时间
app_start可调用 ms_app_startms_apps_start 函数启动 APP
app_kill可调用 ms_process_kill 函数杀死进程和给进程发信号
signal可调用 ms_process_sigqueuems_process_sigbroadcast 函数给进程发信号

制作 dtb 格式启动参数文件

使用 msrtos-dtc 工具可以把 MS-RTOS 启动参数文件编译为 dtb 文件:

msrtos-dtc -I dts -O dtb -o ms-boot-param.dtb ms-boot-param.dts

dtb 文件进行反编译:

msrtos-dtc -I dtb -O dts -o ms-boot-param.dts ms-boot-param.dtb

dtb 格式启动参数文件的烧写与更新

dtb 格式启动参数文件需要储存在 MS-FLASHFS 文件系统中,可以使用 MS-RTOS ImagePackager 将启动参数文件储存到 MS-FLASHFS 文件系统中并合并成为一个统一的 MCU FLASH 烧录镜像。

MS-RTOS ImagePackager 的使用方法见 MS-RTOS ImagePackager 解压缩目录下的《MS-RTOS ImagePackager.pdf》。

dtb 格式启动参数文件的更新,请参考 OTA 升级章节。

相关 API

// 创建启动参数文件描述的共享内存、管道、全局 IPC 设备,依次启动具有自动启动属性的 APP
ms_err_t ms_apps_start(const char *boot_param_file);

// 启动启动参数文件中的指定的 APP
ms_err_t ms_app_start(const char *boot_param_file, const char *app_name, ms_pid_t *pid);

在 BSP 的启动线程 boot_thread 里调用 ms_apps_start 函数示例:

static void boot_thread(ms_ptr_t arg)
{
    // do some thing 

    ms_launcher_init(rsa_pub_key, rsa_pub_key_len);

    ms_apps_update("/nor/update/firmware/update_req", "/nor/update/firmware/update_log");

    ms_apps_start("ms-boot-param.dtb");

    // do some thing 
}

在 APP 里调用 ms_app_start 函数示例:

int main(int argc, char *argv[])
{
    ms_pid_t pid;

    ms_app_start("ms-boot-param.dtb", "app1", &pid);

    // do some thing 

    return 0;
}

相关命令

命令介绍参数
start启动 MS-FLASHFS 中的一个 APPstart boot_param_file app_name
文档内容是否对您有所帮助?
有帮助
没帮助