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

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

[复制链接]
hi201803 发布时间:2018-3-14 00:57
本帖最后由 hi201803 于 2018-3-19 21:44 编辑 7 w6 y9 S- ?( |$ ]9 Z; x. N

. X  u3 x6 J* {- x6 Y版本:   SWstm32 V2.4
, v, K: w! f" L2 l( l" H现象: 使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目。 c++虚函数执行 出错: \2 v/ Q+ p) G, Y1 c0 r
       下面的代码,  无法正确运行:( 在keil 中可正确运行 ). 代码只是示例,非实际项目中遇错代码.
) S2 @! f8 f/ P9 \' s
( s3 V$ q+ Y, J9 S6 gclass  class_1
$ \% P' |) |' X0 E$ z7 U( ~" K{
) `6 g. U9 T( M+ X( j- i# ppublic:) R" `+ w0 W7 ?* f" p( i" }
    int a, b;
4 B4 T( \# w8 z: n  o+ ~     virtual void send ( int , char*) =0;+ ]- _6 u3 p" ?- D
     void fun( int  i1 , char* cs1) {  send (i1,cs1); };6 E9 ~# G' s  z" J) |  Y
};
% B: B' N/ U/ |0 v! R6 Cclass  class_2 :  public class_1
0 Y0 A- V; n0 I9 X) d! v{: P: d+ c/ X' W4 P$ m$ [, z
public:
" v6 Z0 |( T: t; y# r    int a1, b1;
% \) d( D- E* q8 |     virtual void send ( int , char*)  {     } ;
! I1 O% j  Y  ]0 k3 M& e}  aclass;
( D) m* N% V$ Y& C; ]8 D& s# s9 j9 l; p$ S# l) x5 ]# `" s6 j
extern "C" void fun1(void);
1 h1 j- ?$ H- f' r& p, b) s# \4 avoid fun1(void)* ]% s4 j7 z" t9 k
{
. {) f5 y0 o: [2 L    int i=1;
* b5 e. ?; ^" Q, Q# y7 {# [    char cs[8];" a2 L/ z% b4 U  r) w& i- ~
   aclass.fun( 1, cs);   //  函数fun  调用class_1::send , 应该变成调用 class_2:: send。 但调用一个莫名其妙的地址了.最后导致异常中断.+ Q9 R9 z0 Z/ a4 u2 U/ i- {
}   ( W1 K* R7 T* G/ p$ ~# B9 p
====2018/03/14  增加:   测试以上代码  ==================================
3 g7 r2 u0 X# s5 L6 _# K$ d! n/ Q  W
// 上面橙黄色代码是添加的,为了使编译通过. 不影响测试.) c. x' N1 f% Q! _3 ^2 z$ a
// 然后再 main 函数中调用 fun1.' A, C+ z2 ?9 I& b8 p% }/ U
extern void fun1(void);
' x( v$ i! d3 D5 v8 _. A( `void main(void)2 {6 R. w8 V6 A% m# R" E; Q- x
{
$ F4 [1 l/ }: g; U, H* d   fun1( );
. C& K% F6 ]0 t  while(1);
- E5 j6 {7 m) q8 P& a}7 d' \! f; _& F5 ]; e% a4 y! H3 f
测试结果:  
2 D9 @6 Z. S- x8 {# \$ t: E   1.  使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目,添加以上代码, 测试不通过 !!!! 。0 e/ A# a  D3 n
   2.  如果直接使用 swstm32 生成 C++ 程序, 添加以上代码, 测试通过 !!!!!! 。-
: I" N! e5 H7 U4 r# A# H' F-8 C8 j9 m5 S5 P8 f% y& J6 W8 I
====2018/03/15  增加:  原因  ===================================1 d4 [, F6 o( Q; W) H* `
原因:      SWstm32 把 c 项目转化为 c++ 时, 没有修改启动代码,全局变量 的类实例 没有初始化,类实例指向虚表的指针不正确。 1 d1 `4 C) U& X/ D7 g6 t
解决办法 1 :  在初始化代码中, 调用 main 函数之前, 执行:  bl __libc_init_array2 F0 s8 d) s) T& p
解决办法 2 : 直接拷贝 使用 swstm32 生成 C++ 项目的初始化代码, 替换原启动代码。
. x0 Y5 V; B5 s* R- Z
  a. z2 w& M$ M2 c9 z$ R
) R, T% T( o- s& S4 r% |5 |5 t- A8 I, J* o
- j+ H% l$ a5 R+ k- V. }3 _2 B( }

+ F1 V( s/ ^; g7 t
) j/ _( o2 w, I' n
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 编辑
+ A" R" l  s; g; S% J+ u
Mandelbrot_Set 发表于 2018-3-14 09:26: K2 F1 h( D: f' U+ {- `/ s7 P
示例代码vs2015编译不过。。。
8 N8 e7 \2 c5 Z) U
我又测试了代码, 在swstm32 的开发环境中测试的。
* U  B1 Y1 g1 o在一楼中添加了测试结果。
hi201803 回答时间:2018-3-14 17:14:50
maxtch 发表于 2018-3-14 05:514 C! N/ c3 B' s' K) w, I! J/ D
vtable 在数据段里面吗?

7 i8 L$ K& m! G奇怪,3 V7 {% {( A3 c+ \
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.; K( a, e" U6 m, x9 A5 R& J( |3 {
但  直接使用SWStm32 生成的项目中, map文件里面看到 class_1, 和class_2 的虚表, 运行正常./ w% p* k* ~) U7 T
8 J- M0 r$ S! j& o- ^
我对比两项目的c++ 编译,连接,及 链接文件, 居然没发现明显的不一样。 真是奇怪。
maxtch 回答时间:2018-3-14 21:00:51
hi201803 发表于 2018-3-14 17:14
$ T8 ]* j+ K. k, d6 M奇怪,* Y% ?% v* O9 E( L
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.6 T  N4 r+ y" Y1 r# P
但  ...

3 ?% o' ~  y& H4 H把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7.2 换下 Ac6 的版本。
hi201803 回答时间:2018-3-14 22:33:26
maxtch 发表于 2018-3-14 21:007 p- D! `3 F: S& c! j! f! C2 o
把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...
7 ?( q, D! s3 a8 T  D! S
7 ^- D- k0 r/ y# Q1 w+ g7 v( J0 a
把链接脚本文件 都弄成一样的了,还是不行。
) A* O8 F, {; r3 M
hi201803 回答时间:2018-3-15 22:46:00
maxtch 发表于 2018-3-14 21:00
& u( c5 M8 E% `5 C# L- ~把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...
  N6 u, B* _5 l' I3 U; G5 N
原因找到了:  / U3 z. a/ D  Y( L6 {
启动代码没有调用 全局变量 类实例 的初始化函数,造成类实例指向虚表的指针不正确.

所属标签

相似分享

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