ITPub博客

首页 > 数据库 > 数据库开发技术 > 【星闪】Hi2821 | SDK开发入门,应用启动流程,创建自己的应用

【星闪】Hi2821 | SDK开发入门,应用启动流程,创建自己的应用

数据库开发技术 作者:赛博行者 时间:2025-07-14 08:30:46 0 删除 编辑

1. SDK文件结构

  • docs:官方文档;
  • src:SDK源码;
  • tools:其他文档;
  • vendor:厂商资料,里面包含一些第三方厂商开发板的资料。 

        一般在开发的时候只需要复制 src 目录进自己的项目即可。src 目录的结构如下:

  • .vscode:因为 HiSpark Studio 是魔改 VSCode 的,所以这个文件夹就是用来放对应的配置文件的;
  • analyzerJson:也是放一些配置文件;
  • application:应用代码;
  • build:SDK构建所需的脚本、配置文件;
  • drivers:驱动代码;
  • include:API头文件;
  • interim_binary:核心库;
  • kernel:内核代码;
  • middleware:中间件代码;
  • open_source:第三方库代码;
  • output:存放编译时生成的目标文件与中间文件;
  • tools:编译工具链(包括linux和windows)、镜像打包脚本、NV制作工具和签名脚本等。

2. 自定义应用开发

        application 目录存放的是应用代码,那么我们自己的应用也建议放在这里,所以先在里面创建一个目录,我这里命名为“my_demo”。

2.1 CMakeLists.txt

        SDK是基于CMake构建的,所以应用目录内创建 CMakeLists.txt 作为构建脚本,内容如下:

        SDK 是基于组件进行构建的,组件的构建通过一系列的变量进行配置,如下: 

变量名说明
COMPONENT_NAME当前组件名称
SOURCES当前组件的源文件
PUBLIC_HEADER当前组件需要对外提供的头文件路径
PRIVATE_HEADER当前组件内部的头文件路径
PRIVATE_DEFINES当前组件内部使用的宏定义
PUBLIC_DEFINES当前组件需要对外提供的宏定义
COMPONENT_PUBLIC_CCFLAGS当前组件需要对外提供的编译选项
COMPONENT_CCFLAGS当前组件内部生效的编译选项

        这里只需要添加源文件的路径即可。 

2.2 Kconfig

        跟 ESP32 一样, SDK 通过 Kconfig 进行 SDK 配置、裁切内核等操作,为了演示我这里也创建一个 Kconfig 配置文件,具体的语法在这里就不赘述了。

        只有一个配置项,用于设置 demo 的名字。

2.3 my_demo.c

        接着就是创建一个源文件作为应用编译进代码里面,内容如下:

        上面的内容就是创建一个新的任务,这个任务会每隔1秒打印一段字符串,字符串包含了 Kconfig 中配置的 demo 名字。 

2.4 修改父级 CMakeLists.txt 

            项目目录的文件都准备好了后,还需要修改父级的 CMake 脚本,即 application 目录下的 CMakeLists.txt,使能例程的构建。

    2.5 修改父级 Kconfig

            同时还需要修改父级的 Kconfig 脚本,即 application 目录下的 Kconfig 文件,使能例程的配置。

    2.6 修改 config.py

            最后修改 build\config\target_config\bs21e 目录下的 config.py 文件,这个脚本是用来控制 SDK 编译的。在“ram_component”这个列表里面添加“my_demo”组件,名字一定要跟 CMakeLists.txt 配置的组件名一致。

    2.7 编译

            上面的操作做完我们就可以按照一般的步骤去编译应用了,首先打开 Kconfig 的配置。

            这时候可以看到 Demo Name 的设置,修改为自己喜欢的名字,点击保存然后退出,重编译 SDK,烧录固件,在串口助手如下:

    3. 应用启动流程

            从上面可以看到,例程与我们平时写的有很大不同,就是我们不需要写main函数也能启动应用,这是因为 SDK 已经把 main 函数给封装好了。所以下面就讲一讲 SDK 的是怎么引导应用启动的。

            真正的 main 函数其实在 application/bs21e/standard 目录的 main.c 文件内:

             main 函数内就调用了 main_init 函数,内容如下:

            这里面就是初始化硬件外设和 LiteOS 内核,比较关键的是 app_os_init 函数,它的实现如下:

            这个函数是带 __attribute__((weak)) 属性的,所以我们可以重定义这个函数,来实现我们自己的应用初始化流程。

            SDK 默认的实现主要就是创建一系列的任务,其中就包含一个很关键的 app_main 任务,它的实现如下:

            可以看到,这个任务函数也是可以重定义的。关键的是 app_tasks_init 函数,它就是负责调用我们的应用的。这个 app_main 任务还有一个作用是,它也作为系统中的空闲任务而存在;在主循环中 uapi_watchdog_kick 函数被定时调用,这是一个硬件看门狗的喂狗函数来的。

            看到 app_tasks_init 函数,它的实现如下:

            可以看到它做的就是遍历一段内存空间,依次调用指针指向的函数,很明显这段内存空间里面存的都是函数指针。这些指针就是通过 app_run 宏定义来注册的,实现如下:

    原文作者:马浩同学;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2019-03-15

    • 博文量
      12
    • 访问量
      92