功能和限制
动态模块为RT-Thread提供了动态加载程序模块的机制,因为也独立于内核编译,所以使用方式比较灵活。从实现上讲,这是一种将内核和动态模块分开的机制,通过这种机制,内核和动态模块可以分开编译,并在运行时通过内核中的模块加载器将编译好的动态模块加载到内核中运行。
在RT-Thread的动态模块中,目前支持两种格式:
- .mo 则是编译出来时以.mo做为后缀名的可执行动态模块;它可以被加载,并且系统中会自动创建一个主线程执行这个动态模块中的main函数;同时这个main(int argc, char** argv)函数也可以接受命令行上的参数。
- .so 则是编译出来时以.so做为后缀名的动态库;它可以被加载,并驻留在内存中,并提供一些函数集由其他程序(内核里的代码或动态模块)来使用。
当前RT-Thread支持应用模块的架构主要包括ARM类架构,未来会扩展到x86,MIPS,以及RISC-V等架构上。RT-Thread内核固件部分可使用多种编译器工具链,如GCC, ARMCC、IAR等工具链;但动态模块部分编译当前只支持GNU GCC工具链编译。因此编译RT-Thread模块需下载GCC工具,例如CodeSourcery的arm-none-eabi工具链。一般的,最好内核和动态模块使用一样的工具链进行编译(这样不会在libc上产生不一致的行为)。另外,动态模块一般只能加载到RAM中使用,并进行符号解析绑定到内核导出的API地址上,而不能基于Flash直接以XIP方式运行(因为Flash上也不能够再行修改其中的代码段)。