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

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

[复制链接]
hi201803 发布时间:2018-3-14 00:57
本帖最后由 hi201803 于 2018-3-19 21:44 编辑 . z% h' n+ i  y* Z, N3 [; |/ X. T( r+ X

, V4 Q/ t  B8 V! M版本:   SWstm32 V2.4% L4 A& m$ k2 |- y- k9 U
现象: 使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目。 c++虚函数执行 出错。
; _6 {8 `% O+ H- G- R       下面的代码,  无法正确运行:( 在keil 中可正确运行 ). 代码只是示例,非实际项目中遇错代码.4 g7 E3 H; v& G- o+ B. n. V% V
5 h, o$ j" Z, Z# r  x% E# ?
class  class_1
0 A/ F8 H' G* c0 q{4 l3 U, F; _. \; {+ Z
public:
3 ?# u% w! g* Z7 n! W, C    int a, b;
7 _2 J) p! h3 o5 U, }3 g5 x4 |     virtual void send ( int , char*) =0;
% V+ A7 n6 K4 E8 ~     void fun( int  i1 , char* cs1) {  send (i1,cs1); };3 G5 h$ n; Q: P. ]7 |0 U. y& k
};
0 Y1 r% J0 y# M' e/ p2 cclass  class_2 :  public class_1- B, Z, t! ^* B8 \4 k
{5 N4 @5 {5 U" g8 o, Y! W2 K
public:0 _( w  D: q$ M7 H
    int a1, b1;0 u7 u1 @8 L( j& o5 {
     virtual void send ( int , char*)  {     } ;- R6 `# Z( ?) ~. d/ D
}  aclass; % m  L% ?+ `/ n5 v$ n( I2 {
* m* p5 A5 }( _. o1 ^
extern "C" void fun1(void);' _% u; B# o) J0 G7 u& d
void fun1(void)
- Y. S# t8 L" W{
  |2 b: r* V  ?# Q    int i=1;' H  ~& B8 ^+ L" h& i
    char cs[8];0 b2 q5 {+ X$ i8 Y; G
   aclass.fun( 1, cs);   //  函数fun  调用class_1::send , 应该变成调用 class_2:: send。 但调用一个莫名其妙的地址了.最后导致异常中断.% h! T+ X$ u1 [; l" C- @4 f0 e5 R
}   " F( l, Y! d5 J
====2018/03/14  增加:   测试以上代码  ==================================: w& y: f6 |0 G: [0 K3 j" w' s
0 f" B$ m0 E2 l0 j5 F! h8 w2 F& b
// 上面橙黄色代码是添加的,为了使编译通过. 不影响测试.
; S- |* ~" X4 h# f// 然后再 main 函数中调用 fun1.2 l5 I9 C$ e/ o' j4 S; g) E
extern void fun1(void);$ f0 W1 m2 l) A+ l5 T" X; q# H8 w
void main(void)5 ^; ~5 ~% u$ A7 A; Y
{
5 Q) D- F: d/ I7 P  k   fun1( );
6 o" D! k! \. x' ^  while(1);
2 @1 h$ F9 h6 u( `) H& x}8 F, q4 u9 Y: @5 z  s6 X
测试结果:  # X6 O. N! E- a2 h
   1.  使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目,添加以上代码, 测试不通过 !!!! 。! t3 l- [* A1 ~. Z- }' I
   2.  如果直接使用 swstm32 生成 C++ 程序, 添加以上代码, 测试通过 !!!!!! 。-
7 m6 D$ ?8 `* r' K9 s; d-# U% t; b1 K  ]9 s' c
====2018/03/15  增加:  原因  ===================================; V1 [8 r# A/ x
原因:      SWstm32 把 c 项目转化为 c++ 时, 没有修改启动代码,全局变量 的类实例 没有初始化,类实例指向虚表的指针不正确。 $ d1 D* `# }; {* v
解决办法 1 :  在初始化代码中, 调用 main 函数之前, 执行:  bl __libc_init_array
9 u9 i4 j4 m8 ]解决办法 2 : 直接拷贝 使用 swstm32 生成 C++ 项目的初始化代码, 替换原启动代码。6 @' \% `  W  f8 p5 K1 w! z7 y

) S) l' C# }; U. `7 H" a2 E: Y# X0 r& W/ `. L7 _
2 q5 z% a% a1 [( r" }' c2 U

4 H7 E2 W3 B- l6 I* [/ W5 J5 v7 w
. _' u+ C8 _/ @. G8 q/ Q+ \7 u& h& p5 l" ~
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 编辑 2 N% G$ G# a: r4 t- [
Mandelbrot_Set 发表于 2018-3-14 09:26
9 r$ v" a1 A  X- t示例代码vs2015编译不过。。。

0 h3 v. s8 v0 K& n) r  p9 @8 F我又测试了代码, 在swstm32 的开发环境中测试的。
9 N: ]7 w6 S3 Z在一楼中添加了测试结果。
hi201803 回答时间:2018-3-14 17:14:50
maxtch 发表于 2018-3-14 05:51" ], o, f# ^7 ?' v- ^! A
vtable 在数据段里面吗?
$ ?" n3 e1 D9 S" d
奇怪,, j! T7 d$ E3 ]- C
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.
& m# y4 }: K, v% }$ y但  直接使用SWStm32 生成的项目中, map文件里面看到 class_1, 和class_2 的虚表, 运行正常.5 P8 ]5 Y( y: k. V! o
& i- E6 Y& q3 S. `; m% S
我对比两项目的c++ 编译,连接,及 链接文件, 居然没发现明显的不一样。 真是奇怪。
maxtch 回答时间:2018-3-14 21:00:51
hi201803 发表于 2018-3-14 17:14
. r2 C8 ?$ O4 y6 }8 t$ W& j: \& z奇怪,
# F5 l! h: w; l- O& E1 C' kc转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.* {2 r- L) i4 g+ a  l! ^) G; l
但  ...
5 F) Z* J% c, `2 v: u2 n" B3 i& ^7 ?
把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7.2 换下 Ac6 的版本。
hi201803 回答时间:2018-3-14 22:33:26
maxtch 发表于 2018-3-14 21:00+ X3 p8 Q0 ~* U9 D* D( Z
把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...

" d8 F+ Y9 x# ~3 y1 ]& ^6 Q
+ Z& Q8 T( A. X. S0 e# P, j把链接脚本文件 都弄成一样的了,还是不行。
0 I& L7 L, `& u9 H4 A$ K- D9 j
hi201803 回答时间:2018-3-15 22:46:00
maxtch 发表于 2018-3-14 21:00
# r, A- h) [/ D. A( G把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...
- L" m$ t% G7 X
原因找到了:  
; o. V3 E3 Y( `8 k4 P6 Q9 w# F启动代码没有调用 全局变量 类实例 的初始化函数,造成类实例指向虚表的指针不正确.

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版