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

application 目录存放的是应用代码,那么我们自己的应用也建议放在这里,所以先在里面创建一个目录,我这里命名为“my_demo”。
SDK是基于CMake构建的,所以应用目录内创建 CMakeLists.txt 作为构建脚本,内容如下:
SDK 是基于组件进行构建的,组件的构建通过一系列的变量进行配置,如下:
| 变量名 | 说明 |
|---|---|
| COMPONENT_NAME | 当前组件名称 |
| SOURCES | 当前组件的源文件 |
| PUBLIC_HEADER | 当前组件需要对外提供的头文件路径 |
| PRIVATE_HEADER | 当前组件内部的头文件路径 |
| PRIVATE_DEFINES | 当前组件内部使用的宏定义 |
| PUBLIC_DEFINES | 当前组件需要对外提供的宏定义 |
| COMPONENT_PUBLIC_CCFLAGS | 当前组件需要对外提供的编译选项 |
| COMPONENT_CCFLAGS | 当前组件内部生效的编译选项 |
这里只需要添加源文件的路径即可。
跟 ESP32 一样, SDK 通过 Kconfig 进行 SDK 配置、裁切内核等操作,为了演示我这里也创建一个 Kconfig 配置文件,具体的语法在这里就不赘述了。
只有一个配置项,用于设置 demo 的名字。
接着就是创建一个源文件作为应用编译进代码里面,内容如下:
上面的内容就是创建一个新的任务,这个任务会每隔1秒打印一段字符串,字符串包含了 Kconfig 中配置的 demo 名字。
项目目录的文件都准备好了后,还需要修改父级的 CMake 脚本,即 application 目录下的 CMakeLists.txt,使能例程的构建。
同时还需要修改父级的 Kconfig 脚本,即 application 目录下的 Kconfig 文件,使能例程的配置。
最后修改 build\config\target_config\bs21e 目录下的 config.py 文件,这个脚本是用来控制 SDK 编译的。在“ram_component”这个列表里面添加“my_demo”组件,名字一定要跟 CMakeLists.txt 配置的组件名一致。

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

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

从上面可以看到,例程与我们平时写的有很大不同,就是我们不需要写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 宏定义来注册的,实现如下:
原文作者:马浩同学;如有侵权,请联系管理员删除。