一:平台
硬件:c6678、xds560v2 仿真器、xds100v1 仿真器
软件:ccs5.4、 Ti simulator软件仿真
我们的软件分为两个工程,一个是主程序,负责程序的主流程,一个工程是动态库工程,这个工程由于要编译动态库而不是可执行文件,所以不能使用cfg文件进行配置,只能是普通的工程。
问题描述:
目前我们想做的是一个动态重构软件,也就是需要在运行时实时load加载和unload从网络传输过来的动态库文件dynamic library,并且在主程序中像调用普通函数一样调用动态库中的入口函数,从而实现动态重构的目的。目前已经实现了加载和卸载的代码。现在我们已经完成的内容和遇到的问题是:
已经完成的进度
- 我们已经能够load和unload动态库文件,并且可以运行动态库文件的入口函数entry_point。
- 我们已经能够正常编译并使用ccs5.4来编译动态库文件,并且设置入口函数entry_point来在主程序中调用这个入口函数。
- 如果在动态库中不使用与BIOS相关的函数,例如task_create等函数的话编译是没有任何问题的。
- 但是如果我们想在动态库中使用BIOS相关的函数,例如创建task,使用信号量等功能则会出现符号未定义的问题,即使我们在ccs中设置了相关的头文件和链接库路径。
- 为了解决4的问题,我们目前采用的方法是,我们在动态库中使用了任何BIOS相关的函数,在主程序工程中也要进行相应的函数调用。并且使用这个工程编译出来的可执行文件out文件作为动态库编译时候的依赖文件,这样就可以解决符号未定义问题,这也是我们目前使用的最好的方法。
现在我们遇到的问题
我们觉得上面的第5点提到的方案即使用主程序的out文件作为依赖的方式很不方便,因为如果我们修改了主程序工程,那么所有的动态库工程都需要使用这个out文件重新编译一遍。
查阅了e2e论坛,我们目前正在尝试使用xdc命令行编译的方式来解决动态库编译过程的符号未定义问题。
但是现在发现用命令行编译的方式下,我们虽然可以使用bios并且成功编译动态库而不出现符号未定义的问题。但是当我们尝试在主程序工程中加载这个动态库文件时却发现程序在进入entry_point入口函数后运行不正常。具体表现为:
1. 动态库中的printf都失效了
2. 如果在动态库中不使用task_creat而只使用Task_Params_init()函数的话入口函数是可以正常返回的。
3. 但是如果在动态库中使用task_create或者创建信号量的问题,那么入口函数不能返回(或者是调用入口函数后的打印都无法输出),console也没有打印输出。使用ROV进行观察发现系统中只有一个任务,这个任务是IDLE任务,系统中再没有别的任务。
由于我们无法判断入口函数有没有正常返回,可能是调用入口函数返回了了,但是后续的printf输出都失效了导致我们认为其没有正常返回。
目前我们想知道的是
- 我们使用命令行编译来解决符号未定义(在动态库中使用BIOS导致符号未定义,链接失败)的问题是否可行?为什么可以正常编译出来却无法正常运行?
- 是否有更好的方法解决符号未定义的问题,为什么ccs5.4中动态库工程无法链接bios的库,如果ccs中无法链接,那么用命令行来编译是否就能够解决呢?
- 我们目前的方案,使用命令行编译动态库文件上遇到的问题如何解释?为什么程序会进入IDLE中无法继续运行,打印为什么会失效?
附我们的动态库工程: