编译
在build\lite\product下的文件BearPi-HM_Nano.json 描述了编译模块路径
其中,dir给定路径,通过该路径,可以找到对应的"app"
接着,在又在"app"里,BUILD.gn中又指向了my_led下的BUILD.gn文件
my_led下的BUILD.gn文件中,有给定的.c文件,这些文件会被编译成.a文件
通过这样的方式 将各种.c文件(头文件等)编译成.a文件 再连接起来 最后生成.bin文件
接着把.bin文件烧录到开发板就可以运行了!
执行
从哪里开始执行?
vendor\hisi\hi3861\hi3861\app\wifiiot_app\src文件下的app_main.c文件
其中有一个入口函数:
可以看到有一个打印函数 打开MobaXterm验证下是否有这个打印结果
这个入口函数最后回执行HOS_SystemInit()函数
点进去查看这个函数
观察SYS_INIT函数
发现该函数调用了SYS_CALL
SYS_CALL函数调用了两个函数SYS_BEGIN和SYS_END
发现SYS_BEGIN是被定义成SYS_NAME 其中#name、#step是两个参数 分别sys.servise和2
于是SYS_NAME被定义成了”.zinitcall.sys.servise2.init”
也就是说 上面指针指向了 ”.zinitcall.sys.servise2.init”代码段的地址
接着分析”.zinitcall.sys.servise2.init”是什么
打开base\startup\services\bootstrap_lite\source\bootstrap_service.c
有一个函数SYS_SERVICE_INIT 点开查看
看不懂 但作用是把Init()函数放到”.zinitcall.sys.servise2.init”里 也就是 刚刚的指针是指向函数Init()的
Init()函数被执行,其中调用了函数MessageHandle,查看该函数
看到INIT_APP_CALL()函数 这个形式见过 点开查看
果然形式差不多 刚刚是SYS_CALL
按照刚刚的分析 这个指针指向的是代码段”zinitcall.app.feature2.init”的地址
而”zinitcall.app.feature2.init”地址所指向的函数就是写业务代码时 在最后加上的APP_FEATURE_INIT()函数
也就是说 最后会让指针指向要执行的Hello_World()函数
业务代码成功执行!