环境:STM32设备上的Linux-4.19。
有3个src文件。
main()在第一个文件中。
thread_client_r()是pthread-start_routine-function,在第二个文件中定义。
device_getData()是要调用的目标函数,在3rd文件中定义。
int main() {
// Some initialization ...
pthread_t tid_client_read;
pthread_create(&tid_client_read, NULL, &thread_client_r, NULL);
pthread_join(tid_client_read, NULL);
return 0;
}
void* thread_client_r(void *arg)
{
while(1)
{
sleep(1);
printf(" thread_client_r \n"); // this can be printed
device_getData();
}
}
int device_getData()
{
printf(" device_getData\n"); // this can't be printed while called in subthread.
// Do something (call ModbusTcp read API in .so library)
}
1.在main()中调用pthread_create & pthread_join,然后在subthread的thread_client_r()中调用device_getData(),接收信号11;
2.直接在main()中调用device_getData(),没有问题。
有任何解决问题的想法PLZ?
1条答案
按热度按时间1l5u6lss1#
所以我看了一下你面临的这个问题。
从***thread_client_r()***函数调用***device_getData()***函数似乎会导致分段错误(信号11)。当直接从main()函数调用***device_getData()***时,不会发生此行为。
我会尝试:
检查空指针:确保**device_getData()函数中使用的所有指针都已正确初始化,且不为NULL。当通过NULL指针访问内存时,经常会出现分段错误。
验证线程安全:确保device_getData()函数是线程安全的。如果它不是为多个线程并发使用而设计的,则可能需要同步机制(如锁或信号量)来防止竞争条件。
**检查堆栈大小:检查线程的默认堆栈大小是否足够执行device_getData()***函数。如果函数需要较大的堆栈,则可能需要在创建线程之前使用pthread_attr_setstacksize()***增加堆栈大小。
开启调试:使用调试符号编译代码并启用核心转储。这将允许您获得有关崩溃的更多信息。当发生分段错误时,使用调试器(如gdb)检查核心转储,以确定崩溃的确切位置。
**查看外部库:如果*device_getData()**函数依赖于外部库(例如提到的ModbusTcp读取API),请确保您使用的库版本正确,并且与您的STM32设备兼容。
**检查编译器和编译器标志:检查编译器及其用于构建代码的标志。确保指定了正确的体系结构、优化选项和必要的库。
内存损坏:代码中的其他地方可能会出现内存损坏,从而在从单独的线程调用device_getData()***函数时会受到影响。检查代码中是否存在任何潜在的与内存相关的问题,如缓冲区溢出、无效内存访问或未初始化的变量。
我希望在这之后你能缩小问题的范围。