eigen、g2o库在uitron实时操作系统上的移植

    最近由于项目开发需要,单核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的方式去链接

  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  1. #ifdef __cplusplus
  2. }
  3. #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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值