你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

SWstm32 转换c项目到c++,补遗

[复制链接]
hi201803 发布时间:2018-3-14 00:57
本帖最后由 hi201803 于 2018-3-19 21:44 编辑 & ?# k2 \" @% ?  o+ y. J6 q5 A0 p

, T. i7 c& c$ O6 e- v7 ~版本:   SWstm32 V2.4
& O1 b, }/ G4 }) C) i/ ]现象: 使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目。 c++虚函数执行 出错
: E7 O- o' w/ @. |       下面的代码,  无法正确运行:( 在keil 中可正确运行 ). 代码只是示例,非实际项目中遇错代码.( I! H3 ]0 X1 L) g5 C; V% T2 B6 B

3 I6 W/ }! H: Pclass  class_18 @  e4 f3 z9 Q% H; J) \
{
  @  S3 R: L+ [( K. Spublic:
$ m4 X. o$ a0 h- J; g    int a, b;
- E+ }) L' x9 v7 V9 a9 w  y" \- U$ y     virtual void send ( int , char*) =0;; N$ m" [- X' t# Z) o; ]
     void fun( int  i1 , char* cs1) {  send (i1,cs1); };( ]2 `% k; `8 t9 T/ b9 `
};; P* ?+ \0 `* L2 H  ]: E- X3 k
class  class_2 :  public class_14 T* L, J( o* |( H# Z
{
% S1 }& x2 [3 Y- Opublic:; y- u3 u4 E' d. `9 l& l
    int a1, b1;, a4 P, T0 _; |; q# H/ M
     virtual void send ( int , char*)  {     } ;
, p' |! b5 R1 `' x4 R1 ]& p% n+ ~6 W0 J}  aclass;
# R3 i* Y( d/ ]2 p) g
9 Z6 l# G# a* p! iextern "C" void fun1(void);% D5 i$ O0 \/ I  z+ b7 s3 i
void fun1(void): k2 L6 L* \8 l0 E
{; _" d% l% r: m5 }
    int i=1;
1 z- K# t- {% y, ]: a) U    char cs[8];
' G7 [% W) k7 P   aclass.fun( 1, cs);   //  函数fun  调用class_1::send , 应该变成调用 class_2:: send。 但调用一个莫名其妙的地址了.最后导致异常中断.  g' ^1 E" M4 c. G6 N( q0 x
}   
" L- w' @7 {) y, h====2018/03/14  增加:   测试以上代码  ==================================
! @4 t" l6 g& p0 w9 u4 w/ z; q8 N5 h: _6 w4 E+ h8 H  U
// 上面橙黄色代码是添加的,为了使编译通过. 不影响测试.
" `0 L* Y: I& c( B// 然后再 main 函数中调用 fun1.4 X8 r. N. X7 D) v9 m
extern void fun1(void);
. J( @( R" P, q+ x9 V4 c' v6 q# y. Ivoid main(void)
3 \8 v1 X$ ]$ n1 n# G{. ^5 b7 w. W( E8 q0 T) b
   fun1( );
/ _  @, q; @! Z2 L' U6 X7 k& Y5 z  while(1);
' `$ F+ y! l$ [7 U. i+ X}) }1 J( F7 |5 X+ s( u* o+ z9 h* |
测试结果:  
1 r  s3 q& ^2 E9 n- Z   1.  使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目,添加以上代码, 测试不通过 !!!! 。1 d2 |. H: y. V
   2.  如果直接使用 swstm32 生成 C++ 程序, 添加以上代码, 测试通过 !!!!!! 。-
! Z" ^; n, E9 o  ?) k. G-$ |0 F+ j/ p  Y+ b& U  ~# d7 I3 C
====2018/03/15  增加:  原因  ===================================
/ K; M. N) M+ W: v 原因:      SWstm32 把 c 项目转化为 c++ 时, 没有修改启动代码,全局变量 的类实例 没有初始化,类实例指向虚表的指针不正确。 6 d5 K/ }' _) X4 E  a2 ^, e& u
解决办法 1 :  在初始化代码中, 调用 main 函数之前, 执行:  bl __libc_init_array% k4 _2 a( |3 z, N! ]" `
解决办法 2 : 直接拷贝 使用 swstm32 生成 C++ 项目的初始化代码, 替换原启动代码。- a1 l% X7 M# s# u/ g
3 K$ l+ ]3 H  Z3 q/ C

/ u5 j) f  z2 Y. i8 H
2 D3 m  e& `" f% i9 m
2 \# T+ g# U, J  k3 l$ U: M
5 F' k1 `9 l: ~3 V; S
( _/ L' h6 {# r, b# j9 d* s: D" E
ac6版本.jpg
收藏 1 评论7 发布时间:2018-3-14 00:57

举报

7个回答
maxtch 回答时间:2018-3-14 05:51:42
vtable 在数据段里面吗?
Mandelbrot_Set 回答时间:2018-3-14 09:26:08
示例代码vs2015编译不过。。。
hi201803 回答时间:2018-3-14 16:05:37
本帖最后由 hi201803 于 2018-3-20 13:54 编辑 - L1 y9 v) Y3 w! u4 {
Mandelbrot_Set 发表于 2018-3-14 09:26
" c- ?) s, U* {2 H! `1 \; Z$ M% J示例代码vs2015编译不过。。。
4 P6 U# W- r8 Y$ u1 e. [1 u
我又测试了代码, 在swstm32 的开发环境中测试的。
) B6 f* U: c; ?! R在一楼中添加了测试结果。
hi201803 回答时间:2018-3-14 17:14:50
maxtch 发表于 2018-3-14 05:51
5 T; @8 U# f  T( y) t! o! rvtable 在数据段里面吗?
. m4 k7 |) b: K: d6 ?! f3 r* V
奇怪,5 W2 j7 \/ e4 Q" G# d9 t1 T, h
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.
- R' m: I6 `" t但  直接使用SWStm32 生成的项目中, map文件里面看到 class_1, 和class_2 的虚表, 运行正常./ P: G3 Q! D. M0 E) |' v

, n& C" f6 B9 g& v我对比两项目的c++ 编译,连接,及 链接文件, 居然没发现明显的不一样。 真是奇怪。
maxtch 回答时间:2018-3-14 21:00:51
hi201803 发表于 2018-3-14 17:142 x' z; z. {4 E) t
奇怪,& ]# ^$ X  }  r/ M0 Q
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.1 \+ P; B7 n. x  Z* h% Z. N; y
但  ...
& D3 a! z/ U3 o1 r* }" Y
把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7.2 换下 Ac6 的版本。
hi201803 回答时间:2018-3-14 22:33:26
maxtch 发表于 2018-3-14 21:00
' \% q7 M9 F2 U$ z把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...
/ G: n- F7 [* r
# ^( o2 C7 K# k9 e. o. ^
把链接脚本文件 都弄成一样的了,还是不行。
3 [1 s8 m; N- b% M1 W: N. D  n
hi201803 回答时间:2018-3-15 22:46:00
maxtch 发表于 2018-3-14 21:00* P, q; R  q( m! T
把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...

  w* I6 p" U! |" E% d原因找到了:  
" w) J6 Y. U1 L: ^. O  I' s9 j启动代码没有调用 全局变量 类实例 的初始化函数,造成类实例指向虚表的指针不正确.

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版