【发布时间】:2015-07-09 08:11:12
【问题描述】:
我们正在将嵌入式应用程序从 Windows CE 移植到不同的系统。目前的处理器是STM32F4。我们当前的代码库大量使用 TLS。新原型运行 KEIL CMSIS RTOS,其功能非常少。
http://www.keil.com/support/man/docs/armcc/armcc_chr1359124216560.htm 表示从 5.04 开始支持线程本地存储。现在我们使用的是 5.04。问题是,当链接我们的程序与__thread int a; 的变量定义时,链接器找不到__aeabi_read_tp,这对我来说是有意义的。
我的问题是:是否有可能实现 __aeabi_read_tp 并且它会起作用还是还有更多?
如果这对我们来说根本不可能:有没有办法仅在软件中实现 TLS?我们暂时不讨论那里的性能。
编辑
我尝试通过查看 freeBSD 的旧源和其他源来实现 __aeabi_read_tp。虽然该功能主要在汇编中实现,但我发现 C 中的一个版本归结为:
extern "C"
{
extern osThreadId svcThreadGetId(void);
void *__aeabi_read_tp()
{
return (void*)svcThreadGetId();
}
}
这基本上是给我当前正在执行的线程的 ID (void*)。如果我理解正确,这就是我们想要的。这可能行得通吗?
【问题讨论】:
-
我认为您提出的解决方案可能可行,但我认为符号 __aeabi_read_tp 应该由标准 C 库或编译器运行时库提供。
-
您基本上是对的,但是编译器和 RTOS 没有一起交付。我也将这个问题发布给了 KEIL 开发人员。我很高兴看到它是否有效。
标签: c++ multithreading