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);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码改变世界ctw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值