objloader是eCos系统提供的用于支持模块动态加载的组件,经过移植后,现已支持Cortex-M处理器架构。

eCos官网:​​http://ecos.sourceware.org​​​ eCos中文技术网:​​http://www.52ecos.net​​ eCos交流QQ群:144940146。

简介

objloader是eCos系统提供的用于支持模块动态加载的组件,经过多日的研究、移植、调试,现已支持Cortex-M处理器架构并通过测试,支持Cortex-M的长调用(BLX)和短调用(BL)。除了添加对Cortex-M处理器架构的支持外,还修补了官方版本的几个漏洞,一是当节名(Section Name)太长时导致缓存溢出的问题,二是对.bss节清零处理。另外,如果打开调试选项,那么在成功加载模块后将打印GDB的add-symbol-file命令参数,这个命令参数可以直接拷贝到GDB中执行以添加模块调试符号。

使用方法

点击​​这里​​下载objloader-zoomdy-1.zip,将内容解压,将 zoomdy-1目录拷贝到eCos源代码目录的packages/services/objloader目录下。

支持Cortex-M处理器的objloader组件_加载

 

通过eCos Configuration Tool选择Object file loader时,选择zoomdy-1版本。

 

支持Cortex-M处理器的objloader组件_动态加载_02

可以看到Object file loader组件增加了两个选项,一个是Support loading on Cortex-M processors,如果当前的目标机为Cortex-M架构,那么该选项自动选中;另一个是Object filename for load debug symbol,这个选项指定模块文件名,在自动生成add-symbol-file命令时作为<filename>参数,这个参数仅在Verbosity of debug output选项值大于0时有效。

支持Cortex-M处理器的objloader组件_Cortex-M_03

长调用和短调用

Cortex-M的函数调用分为长调用(long-calls)和短调用(short-calls),长调用使用BLX指令,首先将函数地址加载到寄存器,然后使用BLX Rd来调用,长调用可以在4G的存储空间内调用但是调用效率比较低;短调用使用BL指令,被调用函数的偏移地址被编码进BL指令中,只能在16M的空间内进行调用但是效率比较高。默认情况下使用短调用,一般情况下在嵌入式系统中不会有问题,但是如果需要动态加载模块,这将成为问题。如果需要动态加载模块,那么系统被分成两部分,一部分为静态编译存储在Flash,另一部分动态加载存储在RAM,Cortex-M的Flash和RAM通常不会在16M空间内,通常Flash位于0x00000000,而RAM位于0x10000000,这需要将模块编译成长调用的方式否则会导致模块加载失败。

编译成长调用的方式可以通过指定-mlong-calls编译开关实现,也可以在源代码中添加#pragma long_calls指定。更多关于长调用编译的用法,请参考GCC用户手册的ARM选项​​http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/ARM-Options.html​​的-mlong-calls选项部分。

更多内容

更多关于objloader的内容请参考《​​eCos模块动态加载支持——objloader组件​​》,此外还可以参考测试用例(tests子目录下)。