# 应用框架常见问题 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 应用启动链路是什么? 1. *unirtos_init()* 先调用 *components_init()*; 2. 再调用 *apps_init()*; 3. *apps_init()* 再统一分发所有已注册应用的init函数。 # 为什么我写了一个init函数,但应用没有启动? 最常见原因有以下几类: 1. 只写了init函数,没写 *UNIRTOS_APP_EXPORT*。 2. 写了注册宏,但源文件没有被CMake编进目标。 3. CMake编进去了,但对应Kconfig没打开。 4. 应用目录放错位置,没被当前框架路径发现。 # UNIRTOS_APP_EXPORT里的order是干什么的? *order* 决定init执行顺序,数值越小越早执行。 # 一个应用的init函数里能不能直接写死循环业务? 不建议。 因为 *apps_init()* 会顺序调用所有注册的init函数,如果某个init直接进入长循环或做长时间阻塞,后续应用就没有机会初始化。 # 为什么应用已经编译进来了,但启动时还是没执行? 编译进来不等于注册成功。 最常见的两个根因: 1. 源文件被编译了,但没有 *UNIRTOS_APP_EXPORT* 2. 注册函数签名或可见性不对,导致实际没有生成有效注册项 这套框架要求的init函数签名很简单: - *void init_fn(void)* 不要把它写成带参数版本,也不要指望 *apps_init* 传上下文进去。 # 应用注册项有没有数量上限? 有。 当前 *apps_init.c* 里定义了: - *UNIRTOS_APP_INIT_MAX_COUNT* = 96 如果注册数量超过这个值,会打warning,并且只处理前96个。 这意味着: - 不要无限制堆积注册项 - 如果你在做大量demo聚合,要注意上限 - 出现“部分应用始终不启动”时,别忘了检查是不是注册数溢出 ##