MTK平台LK中的APP_START(LK app service)介绍
快速链接: .
1、LK启动流程
先回顾一下LK的启动流程: _start(crt0.S) --> reset --> .Lstack_setup --> kmain() …bootstrap2() -->apps_init()
在kmain()中创建了bootstrap2线程:
thread_t *thread_bs2 = thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE);
bootstrap2()–>apps_init()
2、APP_START宏的使用
在LK代码中,有如下APP_START的定义
APP_START(aboot) .init = aboot_init, APP_END APP_START(mt_boot) .init = mt_boot_init, APP_END APP_START(shell) APP_START(tests) APP_START(clocktests) APP_START(stringtests) APP_START(pcitests)
3、APP_START宏的实现原型
其实就是在section段中定义的数组,编译的时候将这些service加入到了section段中(相当于编译时注册service)
#define APP_START(appname) struct app_descriptor _app_##appname __SECTION(".apps") = { .name = #appname, #define APP_END };
4、APP_START定义的这些service的启动
在LK启动的时候,调用到apps_init(),在该函数中宏,循环遍历__apps_start,执行编译时注册的这些service
(lk/app/app.c) /* one time setup */ void apps_init(void) { const struct app_descriptor *app; /* call all the init routines */ for (app = __apps_start; app != __apps_end; app++) { if (app->init) app->init(app); } /* start any that want to start on boot */ for (app = __apps_start; app != __apps_end; app++) { if (app->entry && (app->flags & APP_FLAG_DONT_START_ON_BOOT) == 0) { start_app(app); } } }