VxWorks上的STL错误

我在程序中使用了STL,但是下载时,出现了链接错误:

Errors while downloading PPCEC603gnu/Project1.out: clone__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i03Rep eos__t18string_char_traits1Zc replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0UiUiPCcUi _t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0$nilRep __dl__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i03RepPv length__t18string_char_traits1ZcPCc assign__t18string_char_traits1ZcRcRCc

程序代码如下:

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cstdio>

using namespace std;


int main(void)
{
	map<int, int> mapInt;
	mapInt[12] = 1222;
	mapInt[13] = 1333;

	if (1222 == mapInt[12])	cerr << "Right!/n";
	if (1333 == mapInt[13]) cerr << "Right!/n";

	string str = "hello";
	printf("%s/n", str.c_str());

	vector<int> arrInt;
	arrInt.push_back(2);
	arrInt.push_back(3);

	vector<int>::iterator itArrInt;
	for (itArrInt = arrInt.begin(); itArrInt != arrInt.end(); ++itArrInt)
	{
		cerr << *itArrInt << "/t";
	}
	cerr << endl;

	return 0;
}
但是, VxWorks是支持STL的。在 VxWorks Programmer's Guide中有明确表明STL:

Standard Template Library (STL) For both toolchains, the Standard Template library consists entirely of a set of header files. There is no special run-time component that must be included in a VxWorks system.

STL for GNU The GNU STL port for VxWorks is thread safe at the class level. This means that the client has to provide explicit locking, if two tasks want to use the same container object (a semaphore can be used to do so; see 2.3.3 Semaphores). However, two different objects of the same STL container class can be accessed concurrently.

The C++ Standard Template Library can be used in client code compiled with exception handling turned off. In our implementation this has the following semantics:

For all checks that could reasonably be made by the caller, such as bounds checking, no action is taken where an exception would have been thrown. With optimization on, this is equivalent to removing the check. For memory exhaustion where bad_alloc would have been thrown, now the following message is logged (if logging is included): "STL Memory allocation failed and exceptions disabled -calling terminate" and the task calls terminate. This behavior applies only to the default allocators; you are free to define custom allocators with a different behavior.

在FAQ上也发现,它是支持STL的,只不过会使代码显得比较大:

Q. When compiling C++ code (STL) the object size explodes

A: People are confusing C++ with STL. They are not the same. There is an embedded C++ standard that will significantly reduce the size of an executable if you follow the restrictions.

Compile with "-fno-exceptions". If you are using templates that require exceptions handling, i suggest you don't. Alternatively, you can look that the offending vxWorks STL file (maybe stl_alloc.h) and there is an "if 0" condition that should be changed to "if 1". Also disable RTTI with "-fno-rtti" as the another poster noted. You might also consider using "-fno-volatile", etc.

If you don't use templates, but just classes and polymorphism, you can make your own collections that are significantly smaller than STL. (even when you do use templates).

Other alternatives might be to look at PJ Plaugher's STL.

(From: Bill Pringlemeir, spam_account@sympatico.ca)

而且,对于set, map, vector,都没有报错,只有string报错。经过反复查找资料,才确定只与string无关,与STL有关,并且在programmer's guide中以下描述:

7.2.2 Adding Support Components By default, VxWorks kernels contain only minimal C++ support. You can add C++ functionality by including any or all of the following components:

Basic Support Components ...

C++ Library Components Several C++ library components are also available.

GNU-Specific Library Support Components For the GNU compiler, these are:

INCLUDE_CPLUS Includes all basic C++ run-time support in VxWorks. This enables you to download and run compiled and munched C++ modules.

INCLUDE_CPLUS_STL Includes support for the standard template library.

INCLUDE_CPLUS_STRING Includes the basic components of the string type library.

这时候,再去查看configAll.h,才发现确实未定义INCLUDE_CPLUS_STRING宏。

结论:对编译过程、库、gcc了解太少了,查起这种问题,根本没有头绪。

### VxWorks 系统中错误代码 4147 的解决方案与解释 在 VxWorks 操作系统中,错误代码 4147 通常与任务管理或内存分配相关。根据系统的具体实现和上下文环境,此错误可能表示任务创建失败、资源不足或内存分配异常等问题[^3]。以下是关于该错误的详细分析及解决方法: #### 错误原因 1. **任务堆栈大小不足** 在创建任务时,如果指定的堆栈大小不足以支持任务的运行需求,VxWorks 将返回错误代码 4147。这通常发生在任务需要较大的局部变量或函数调用栈深度较大时[^3]。 2. **系统资源耗尽** 如果系统中的可用内存资源已被其他任务或模块占用完毕,尝试分配新任务或内存时将导致错误代码 4147。这种情况下,需要检查系统资源使用情况并优化资源分配策略[^3]。 3. **任务优先级冲突** 在某些版本的 VxWorks 中,错误代码 4147 可能与任务优先级配置不当有关。例如,尝试创建的任务优先级超出了系统允许的范围,或者与其他任务的优先级设置存在冲突[^3]。 #### 解决方法 1. **调整任务堆栈大小** 根据任务的实际需求,增加任务堆栈的大小。可以通过修改 `taskSpawn` 函数中的堆栈参数来实现。例如: ```c int taskId = taskSpawn("myTask", 100, VX_FP_TASK, 8192, (FUNCPTR)myTaskFunction, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); ``` 在上述代码中,`8192` 表示任务堆栈大小为 8KB。如果任务运行时仍报错,可以逐步增大该值[^3]。 2. **检查系统资源状态** 使用 VxWorks 提供的调试工具(如 `sysMemPartInfoGet` 或 `taskInfoGet`)检查系统内存和任务资源的使用情况。确保有足够的空闲内存供新任务分配[^3]。 3. **优化任务优先级配置** 确保任务优先级设置合理,避免过高或过低的优先级配置。例如,在多任务环境中,应根据任务的重要性和实时性要求分配适当的优先级[^3]。 4. **启用调试模式** 在开发阶段,建议启用 VxWorks 的调试模式以捕获更多错误信息。通过分析调试输出,可以更准确地定位问题根源[^3]。 #### 示例代码 以下是一个简单的任务创建示例,展示如何正确配置任务堆栈大小和优先级: ```c #include "vxWorks.h" #include "taskLib.h" void myTaskFunction(void) { // 任务逻辑 while (1) { printf("Task is running...\n"); taskDelay(10); // 延迟 100ms } } int main() { int taskId; taskId = taskSpawn("myTask", 100, VX_FP_TASK, 16384, (FUNCPTR)myTaskFunction, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (taskId == ERROR) { printf("Task creation failed with error code %d\n", errnoGet()); } else { printf("Task created successfully with ID %d\n", taskId); } return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值