第三章鸿蒙hi3681开发板入门代码路径及启动过程分析章节Hi3681开发目录:3.1编写一个简单的helloworld程序3.2Hi3861相关代码结构3.2Hi3861启动过程3.1编写一个简单的helloworld程序编写一个helloworld程序比较简单,可以参考官网:https://device.harmonyos。com/cn/docs/start/introduce/oem_wifi_start-0000001050168544这篇文章总结到这里:(1)确定目录结构。开发者在编写业务时,首先要在./applications/sample/wifi-iot/app路径下新建一个目录(或一组目录结构),用于存放业务源码文件。例如:在app下添加业务my_first_app,其中hello_world.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下:.└──applications└──sample└──wifi-iot└──app│──my_first_app││──hello_world.c│└──BUILD.gn└──BUILD.gn(2)编写业务代码。在hello_world.c中新建一个业务入口函数HelloWorld,并实现业务逻辑。并在代码底部使用HarmonyOS启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN在ohos_init.h文件中定义)#include"ohos_init.h"#include"ohos_types.h"voidHelloWorld(void){printf("[DEMO]Helloworld.\n");}SYS_RUN(HelloWorld);(3)将用于构建业务的BUILD.gn文件写成静态库。在步骤1中提到,BUILD.gn文件由三部分组成(目标、源文件、头文件路径),需要开发者填写。以my_first_app为例,需要创建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,完成如下配置。static_library("myapp"){sources=["hello_world.c"]include_dirs=["//utils/native/liteos/include"]}static_library指定的业务模块的编译结果为静态库文件libmyapp.a、开发申请人根据实际情况填写表格。在sources中,指定静态库.a所依赖的.c文件及其路径。如果路径中包含“//”,则表示绝对路径(这里是代码根路径),如果不包含“//”,则表示相对路径。include_dirs指定源需要依赖的.h文件路径。(4)编写模块BUILD.gn文件,指定需要参与构建的特性模块。配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段添加索引,使目标模块参与编译。features字段指定业务模块的路径和目标。以my_first_app为例,features字段配置如下。import("//build/lite/config/component/lite_component.gni")lite_component("app"){features=["my_first_app:myapp",]}my_first_app是相对路径,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。myapp是目标,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。3.2Hi3861相关代码结构目前hi3861使用的是liteos-m内核,但是目前hi3681的liteos-m是ROM化固化在芯片内部。所以在harmonyOS代码中找不到hi3861的内核部分。但这并不妨碍我们整理hi3861的其他代码结构。hi3861平台配置文件build\lite\platform\hi3861v100_liteos_riscv\platform.json这个文件描述了hi3681平台相关的代码路径,比如application和startup。这里我列举几个比较重要的:subsystem:applications:path:applications/sample/wifi-iot/app功能:这个路径存放的是hi3681写的应用代码,比如我们刚才写的helloworld代码放在下面这条路。子系统:iot_hardware:路径:base/iot_hardware/frameworks/wifiiot_lite功能:存放hi3681芯片相关驱动,如spi、gpio、uart等子系统:vendor路径:vendor/hisi/hi3861/hi3861功能:存放文件如hi3681相关厂商SDK。最重要的是vendor\hisi\hi3861\hi3861\app\wifiiot_app\init\app_io_init.cvendor\hisi\hi3861\hi3861\app\wifiiot_app\src\app_main.c其中app_io_init.c是hi3681之后的iokernel启动时进行端口相关设置,用户需要根据应用场景合理选择各个外设的IO复用配置。app_main.c是内核引导进入的应用程序入口。3.2Hi3861启动过程由于hi3681的liteos-m是芯片ROM化的,固化在芯片内部。所以我们主要看内核启动后的第一个入口函数。代码路径:vendor\hisi\hi3861\hi3861\app\wifiiot_app\src\app_main.chi_voidapp_main(hi_void){#ifdefCONFIG_FACTORY_TEST_MODEprintf("factorytestmode!\r\n");#endifconsthi_char*sdk_ver=hi_get_sdk_version();printf("sdkver:%s\r\n",sdk_ver);hi_flash_partition_table*ptable=HI_NULL;peripheral_init();…..中间省略了代码HOS_SystemInit();}app_main开头打印SDK版本号,最后打印SDK版本号行将调用HOS_SystemInit();该函数初始化鸿蒙系统。我们进去看看初始化做了什么。路径:base/startup/services/bootstrap_lite/source/system_init.cvoidHOS_SystemInit(void){MODULE_INIT(bsp);MODULE_INIT(device);MODULE_INIT(core);SYS_INIT(service);SYS_INIT(feature);MODULE_INIT(run);SAMGR_Bootstrap();}我们可以看到一些相关的模块和系统都被初始化了,包括bsp和device。最后一个是MODULE_INIT(run);它负责调用run部分的所有代码,那么run部分的代码有哪些呢?其实就是我们之前应用中SYS_RUN()宏设置的函数名。还记得我们之前写的helloworld应用吗?#include"ohos_init.h"#include"ohos_types.h"voidHelloWorld(void){printf("[DEMO]Helloworld.\n");}SYS_RUN(HelloWorld);也就是说所有用SYS_RUN()宏设置的函数都会在MODULE_INIT(run)时被调用;用来。为了验证这一点,我们可以添加一些打印信息,如下:我们重新编译并烧录。打开串口查看打印信息,如下:可以看到第35行之后打印了helloworld信息。符合预期。了解更多请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz
