最近由于项目开发需要,单核linux运行slam性能有限,考虑将slam的g2o优化运算迁移到另外一颗单独运行uitron的arm-a53上,从而实现线程分离,orb-slam 的localmapping线程中的 local BA将在uitron上独立运行,并采用核间通信IPC+共享内存实现数据访问。
考虑到uitron是RTOS,而g2o是基于linux,其中类模板封装了相当多的与操作系统相关的系统调用,我们暂时把涉及到系统调用的函数注释掉,如read、write等。移植分以下几个部分:
a、C call c++ func
uitron是纯C的RTOS,势必要调用使用c++ 语言的g2o接口函数,具体可以在g2o函数前增加 extern “C”声明:
Yes, this is certainly possible. You will need to write an interface layer in C++ that declares functions with extern "C"
:
extern "C" int foo(char *bar)
{
return realFoo(std::string(bar));
}
Then, you will call
foo()
from your C module, which will pass the call on to the
realFoo()
function which is implemented in C++.
b、c++ call C func
修改普通的C头文件,使得在被C++包含时,可以按照C的方式去链接
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
c、C/C++ linking segment
__exidx_start = . ;
.ARM.exidx :
{
*(.ARM.exidx*)
. = ALIGN(4);
}
__exidx_end = . ;
__extab_start = . ;
.ARM.extab :
{
*(.ARM.extab*)
. = ALIGN(4);
}
__extab_end = . ;
#end
d、stdc++.a call libc
c++ 的很多特性的底层实现是依赖于c 的,如STL vector 在构造函数中使用malloc 预分配内存,此时会调用malloc,又如new关键字也会在底层call malloc,因此需要实现相关的libc函数
extern double atof (const char *__nptr);
extern void *calloc (size_t __nmemb, size_t __size);
extern div_t div (int __numer, int __denom);
extern void free (void *__ptr);
extern char *getenv (const char *__name);
extern long int labs (long int __x);
extern ldiv_t ldiv (long int __numer, long int __denom);
extern void *malloc (size_t __size);
extern int mblen (const char *__s, size_t __n);
extern size_t mbstowcs (wchar_t *__restrict __pwcs,const char *__restrict __s, size_t __n);
extern int mbtowc (wchar_t *__restrict __pwc,
const char *__restrict __s, size_t __n);
extern void *realloc (void *__ptr, size_t __size);
extern double strtod (const char *__restrict __nptr,
char **__restrict __endptr);
extern long int strtol (const char *__restrict __nptr,
char **__restrict __endptr, int __base);
extern unsigned long int strtoul (const char *__restrict __nptr,
char **__restrict __endptr, int __base);
extern int system (const char *__command);
extern size_t wcstombs (char *__restrict __s,
const wchar_t *__restrict __pwcs, size_t __n);
extern int wctomb (char *__s, wchar_t __wchar);