我需要在VxWorks中运行C程序的多个实例(VxWorks具有全局命名空间)。问题是C程序定义了全局变量(在该程序的特定实例中使用),这些全局变量在全局名称空间中发生冲突。我想对程序进行微小的更改,以使这项工作成功。欢迎所有想法!
此致
顺便说一句......现在不是提及全局变量不是最佳实践的好时机!
答案 0 :(得分:1)
最简单的方法是使用任务变量(请参阅taskVarLib文档)。
使用任务变量时,该变量特定于上下文中的任务。在上下文切换中,存储当前变量并加载新任务的变量。
需要注意的是,任务变量只能是32位数字。 每个全局变量也必须独立添加(通过它自己调用taskVarAdd?),它还为上下文切换增加了时间。
此外,您将无法与其他任务共享全局变量 您不能将任务变量与ISR一起使用。
答案 1 :(得分:1)
另一种可能性:
如果您使用的是Vxworks 6.x,则可以创建实时流程应用程序
这遵循一个流程模型(类似于Unix / Windows),其中程序的每个实例都有自己的全局内存空间,独立于任何其他实例。
答案 2 :(得分:0)
另一种可能的解决方案是将应用程序的全局变量放在静态结构中。例如:
自:
int global1;
int global2;
int someApp()
{
global2 = global1 + 3;
...
}
TO:
typedef struct appGlobStruct {
int global1;
int global2;
} appGlob;
int someApp()
{
appGlob.global2 = appGlob.global1 + 3;
}
这简单地变成了搜索&替换您的应用程序代码。没有改变代码的结构。
答案 3 :(得分:0)
在集成来自同一供应商的两个第三方库时,我必须解决此问题。两个库都使用了一些相同的符号名称,但它们彼此不兼容。因为这些来自供应商,我们负担不起搜索和更换。并且任务变量也不适用,因为(a)可以从同一任务调用两个库,(b)一些欺骗符号是函数。
假设我们将app1和app2分别链接到lib1和lib2。两个库都定义了相同的符号,因此必须相互隐藏。
幸运的是(如果您使用的是GNU工具),objcopy允许您在链接后更改变量的类型。
以下是解决方案的草图,您必须根据需要对其进行修改。
首先,为app1执行部分链接以将其绑定到lib1。在这里,我假设您已经将app1中的* .o部分链接到app1_tmp1.o。
$(LD_PARTIAL) $(LDFLAGS) -Wl,-i -o app1_tmp2.o app1_tmp1.o $(APP1_LIBS)
然后,隐藏刚创建的tmp2对象中lib1的所有符号,为app1生成“真实”对象。
objcopymips `nmmips $(APP1_LIBS) | grep ' [DRT] ' | sed -e's/^[0-9A-Fa-f]* [DRT] /-L /'` app1_tmp2.o app1.o
对app2重复此操作。现在你已经准备好app1.o和app2.o链接到你的最终应用程序而没有任何冲突。
此解决方案的缺点是您无法从主机shell访问任何这些符号。为了解决这个问题,您可以暂时关闭隐藏一个或另一个库的符号以进行调试。