配置
我们简称 Luban-Lite 原生开发的映像为 kernel
,使用 Dynamic Module
机制开发的应用为 dm-app
。目前仅在 Luban-Lite 内核为 rt-thread 时支持该特性。
aic-dm-apps
的目录结构如下所示:├── hello // hello 实例 │ ├── hello.mo // 'scons --app=hello' 命令生成的可执行文件 │ ├── hello.so // 'scons --lib=hello' 命令生成的库文件 │ ├── main.c // 可执行文件的 main 函数入口 │ ├── rtt_api_test.c // dm 中调用 rt-thread api 的函数实例 │ └── SConscript ├── LICENSE ├── README.md ├── SConstruct ├── toolchain // 自动解压后的工具链 ├── tools │ ├── env │ ├── host │ ├── onestep.sh │ ├── scripts │ ├── sdk // 所有的工程头文件 │ ├── toolchain │ ├── ua.def │ ├── ua.py │ └── ua.pyc ├── win_cmd.bat └── win_env.bat // 启动 windows 下的命令行
kernel 配置
要使用
Dynamic Module
功能,内核需要打开以下两项配置:Rt-Thread options ---> RT-Thread Components ---> C/C++ and POSIX layer ---> POSIX (Portable Operating System Interface) layer ---> [*] Enable POSIX file system and I/O [*] Enable dynamic module APIs, dlopen()/dlsym()/dlclose() etc
还可以选择 dm-app 动态加载时使用的内存 heap。具体的可选 heap
会随不同平台的配置有所不同:
Rt-Thread options ---> RT-Thread Components ---> C/C++ and POSIX layer ---> POSIX (Portable Operating System Interface) layer ---> [*] Enable dynamic module APIs, dlopen()/dlsym()/dlclose() etc Select dynamic module use mem (Prsam CMA heap) ---> (X) Sys Heap () Prsam CMA heap
符号导出
kernel 中被 dm-app 访问到的符号需要使用 RTM_EXPORT()
宏来进行声明,类似 linux 中的
EXPORT_SYMBOL()
宏。
对于一些标准的 c 库函数,kernel 已经定义好了
RTM_EXPORT()
声明,dm-app 可以直接使用。例如
luban-lite/kernel/rt-thread/components/libc/posix/libdl/dlsyms.c:RTM_EXPORT(strcpy); RTM_EXPORT(strncpy); RTM_EXPORT(strlen); RTM_EXPORT(strcat); RTM_EXPORT(strstr); RTM_EXPORT(strchr); RTM_EXPORT(strcmp); RTM_EXPORT(strtol); RTM_EXPORT(strtoul); RTM_EXPORT(strncmp); ...
对于 rt-thread api 函数,kernel 已经定义好了
RTM_EXPORT()
声明,dm-app
可以直接使用。例如
luban-lite/kernel/rt-thread/src/thread.c:RTM_EXPORT(rt_thread_create); RTM_EXPORT(rt_thread_yield); RTM_EXPORT(rt_thread_startup); RTM_EXPORT(rt_thread_detach); ...
可以在 Luban-Lite 的命令行下,使用
list_symbols
命令查看当前系统已经使用
RTM_EXPORT()
声明的符号:aic /> list_symbols rt_critical_level => 0x40013cc0 rt_exit_critical => 0x40014090 rt_enter_critical => 0x40013ce0 rt_device_set_tx_complete => 0x40014220 rt_device_set_rx_indicate => 0x40014200 rt_device_control => 0x400141f0 rt_device_write => 0x40014370 rt_device_read => 0x40014330 rt_device_close => 0x400143b0
重要:
没有使用 RTM_EXPORT()
声明的 kernel 函数是不能在 dm-app
中使用的。如果用户有自定义的 kernel 函数需要在 app 中使用,必须使用 RTM_EXPORT()
声明。
DM-APP
生成 sdk
dm-app 的开发目录在
luban-lite/packages/artinchip/aic-dm-apps
,首先确保
luban-lite/
根目录下的 kernel 工程被正确配置且编译通过后,然后生成对应的 dm-app
sdk:$ cd luban-lite/packages/artinchip/aic-dm-apps $ scons --target=sdk scons: Reading SConscript files ... Copy rtconfig.py... Copy rtua.py... Copy rt-thread/tools/... Copy project .h files... Copy tools/env/... Copy tools/scripts/... Copy onestep.sh... Copy win_env.bat... Copy win_cmd.bat... Build local sdk succeed!
dm-app sdk 创建完成以后, aic-dm-apps
就可以脱离 luban-lite sdk
进行开发了。 aic-dm-apps
文件夹可以被拷贝到任意 Linux/Windows 路径进行开发和编译。
也支持清理
sdk:
$ cd luban-lite/packages/artinchip/aic-dm-apps $ scons --target=c
=
目录结构
aic-dm-apps
的目录结构如下所示:├── hello // hello 实例
│ ├── hello.mo // 'scons --app=hello' 命令生成的可执行文件
│ ├── hello.so // 'scons --lib=hello' 命令生成的库文件
│ ├── main.c // 可执行文件的 main 函数入口
│ ├── rtt_api_test.c // dm 中调用 rt-thread api 的函数实例
│ └── SConscript
├── LICENSE
├── README.md
├── SConstruct
├── toolchain // 自动解压后的工具链
├── tools
│ ├── env
│ ├── host
│ ├── onestep.sh
│ ├── scripts
│ ├── sdk // 所有的工程头文件
│ ├── toolchain
│ ├── ua.def
│ ├── ua.py
│ └── ua.pyc
├── win_cmd.bat
└── win_env.bat // 启动 windows 下的命令行