应用框架常见问题

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聚合,要注意上限

  • 出现“部分应用始终不启动”时,别忘了检查是不是注册数溢出