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

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

[复制链接]
hi201803 发布时间:2018-3-14 00:57
本帖最后由 hi201803 于 2018-3-19 21:44 编辑
4 H. I" R7 g0 s9 u9 b3 x$ H
$ P2 u* ~6 c1 N3 O. m( T版本:   SWstm32 V2.40 `5 y* g+ i3 Q# T: C2 }/ ?7 x$ F6 r" e
现象: 使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目。 c++虚函数执行 出错
* O% {2 n! m3 D, ~( p8 X       下面的代码,  无法正确运行:( 在keil 中可正确运行 ). 代码只是示例,非实际项目中遇错代码.
" O/ ~8 y4 N5 c
+ c0 f( ^6 ]$ G+ ]( p" V4 aclass  class_17 h6 w$ f' v1 |4 X+ t# ~
{
  b% ?4 V0 C* S/ a( D! W6 y, }public:
7 ]& T) k. Q1 }$ \# V) _2 l; ]    int a, b;, P. k$ d5 q) S, s% Q  {
     virtual void send ( int , char*) =0;% a4 o7 V: a) G& q/ l  c
     void fun( int  i1 , char* cs1) {  send (i1,cs1); };* h# F6 v3 |: r- C5 u5 ^+ N* O" L7 S
};- i6 p' ]+ R) i2 r
class  class_2 :  public class_1
- g4 q( n) H; }, `{
0 l7 u8 u" @0 K' P+ D/ D3 opublic:
+ x6 D' w+ c& n7 O8 [: L    int a1, b1;
8 b% M8 G% l7 e8 ]+ Y9 M  a( y     virtual void send ( int , char*)  {     } ;( _/ q3 W" t; K, w" H
}  aclass;
/ D8 N. `7 f; m  m- e- Z' P, Z9 s
1 _2 m" W' X' e* iextern "C" void fun1(void);
  u6 Y% U: Z" K9 U/ V6 Rvoid fun1(void)* M$ V/ ^$ u$ v+ C( B& J9 v/ c
{6 M% Z, |' R* y  Z: X
    int i=1;( O, I8 _, a/ U' i
    char cs[8];
/ I! v: z- |! d8 f/ V1 @   aclass.fun( 1, cs);   //  函数fun  调用class_1::send , 应该变成调用 class_2:: send。 但调用一个莫名其妙的地址了.最后导致异常中断.
& C$ @1 ^! o, K7 i}   
+ T2 i6 I+ f5 J( j. O4 \2 B& ~' p====2018/03/14  增加:   测试以上代码  ==================================
% N) z6 h: E9 o+ G
" l9 v9 ^2 o" P, Z. p# b; D4 R// 上面橙黄色代码是添加的,为了使编译通过. 不影响测试.
: g2 x  W+ u5 D// 然后再 main 函数中调用 fun1.
# y4 z: u; z6 [6 x/ h) J5 W: z- h5 ]extern void fun1(void);
7 q6 B$ {- i8 o& w, x6 g1 ]void main(void)+ \9 S3 h- A1 k9 C& }
{
( F! @; X' Q, F% w. y7 h; F   fun1( );
9 f9 W' p0 r6 \3 j  b. w8 J) v2 o  while(1);
+ i0 x9 ^) c/ c6 b}
# f/ q7 i$ {) ~0 q5 m$ x测试结果:  
9 n/ L, `( @* B# q   1.  使用stm32cubeMX 生成 代码, 然后再 SWstm32 中转换成 c++ 项目,添加以上代码, 测试不通过 !!!! 。( o) b5 b& |) H7 o
   2.  如果直接使用 swstm32 生成 C++ 程序, 添加以上代码, 测试通过 !!!!!! 。-
7 j; e0 N' ^/ f/ \-
/ L# z* P& L! {4 J2 }4 v====2018/03/15  增加:  原因  ===================================
- A" ?5 T5 b" b2 h+ } 原因:      SWstm32 把 c 项目转化为 c++ 时, 没有修改启动代码,全局变量 的类实例 没有初始化,类实例指向虚表的指针不正确。 . M. `$ ^6 }) J& A7 E6 E2 Y
解决办法 1 :  在初始化代码中, 调用 main 函数之前, 执行:  bl __libc_init_array
! J# W& {; T/ T- O! c解决办法 2 : 直接拷贝 使用 swstm32 生成 C++ 项目的初始化代码, 替换原启动代码。
6 D6 J: S* P! `9 R% ~3 N* G
2 W1 v# ]% u0 a* W% S$ b' i1 x: z- g* E+ P# a
( ]2 I4 e" |; f+ T" h

* i5 d. S; X# B- S& d4 O- z  \# h( w7 q6 a+ I5 `4 a. ^+ P/ {5 S8 _
5 Q: k$ ?  t9 w# ~
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 编辑
( g# l* ^( f9 i; F0 ?; j3 Z
Mandelbrot_Set 发表于 2018-3-14 09:266 [! E' A# ~9 u2 [% D% R4 i
示例代码vs2015编译不过。。。
7 E3 T6 j9 k5 t4 i
我又测试了代码, 在swstm32 的开发环境中测试的。
/ m  V% [: c- t+ y8 H0 p+ B" Y/ D7 {/ K在一楼中添加了测试结果。
hi201803 回答时间:2018-3-14 17:14:50
maxtch 发表于 2018-3-14 05:51
+ q- t  K4 P% i5 b' T# w- Cvtable 在数据段里面吗?
$ w# k' A  z8 Z! c
奇怪,. E+ t7 }8 g* @
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.! R/ `+ {! U$ v" p
但  直接使用SWStm32 生成的项目中, map文件里面看到 class_1, 和class_2 的虚表, 运行正常.
  h/ j1 |& P* @$ ]  t9 ~3 ^$ e
0 f& T' o2 T4 X" x我对比两项目的c++ 编译,连接,及 链接文件, 居然没发现明显的不一样。 真是奇怪。
maxtch 回答时间:2018-3-14 21:00:51
hi201803 发表于 2018-3-14 17:143 r7 R  j, U+ }- U- }& q$ s
奇怪,% x$ H6 ^7 Q9 M/ C. U8 m3 i
c转换成c++项目中, 在map文件里面只看到 class_2 的虚表, 没有class_1的虚表。 运行不正常.: O1 I7 s, S$ R! `' C& q/ }0 f4 s
但  ...

8 }. X' ^' q" B8 Z把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7.2 换下 Ac6 的版本。
hi201803 回答时间:2018-3-14 22:33:26
maxtch 发表于 2018-3-14 21:00
6 c& ?3 s/ x8 i6 O# t. ?' x把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...
8 ?) k1 O. `5 U# |2 }; r
  `  T0 ?* y0 V% Q0 V9 B$ e. ]4 }: k
把链接脚本文件 都弄成一样的了,还是不行。 ( F! E. }- V5 W/ T3 q- z/ w& a
hi201803 回答时间:2018-3-15 22:46:00
maxtch 发表于 2018-3-14 21:00
% M2 ?& N! ^$ b: l, z) D8 L把两个链接脚本文件 diff 一下,某处细节肯定有差异。还有,可以尝试一下替换 GCC,用 Arm 打包的 GCC 7. ...

* ]. j: ?3 s1 i3 Z8 U+ o原因找到了:  
: ~, q: _8 x  g- q启动代码没有调用 全局变量 类实例 的初始化函数,造成类实例指向虚表的指针不正确.

所属标签

相似分享

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