[开发工具] MDK3.80,C++局部对象可以,全局对象跑飞

[复制链接]
4291|2
 楼主| kevin_ares 发表于 2010-7-12 11:19 | 显示全部楼层 |阅读模式
MDK, C++, ST, TE, ov
本帖最后由 kevin_ares 于 2010-7-12 11:22 编辑

  1. #include "ctest.h"
  2. Ctest::Ctest(void)
  3. {
  4. }
  5. Ctest::~Ctest(void)
  6. {
  7. }
  8. int Ctest::add(int a,int b)
  9. {
  10. return a+b;
  11. }
  12. extern "C" init()
  13. {
  14. Ctest test;
  15. test.add(4,5);
  16. }


然后在main.c里调用 init(),一切正常,怀疑编译器已经优化掉生成对象的代码了

改成

  1. #include "ctest.h"
  2. Ctest test;

  3. Ctest::Ctest(void)
  4. {
  5. }
  6. Ctest::~Ctest(void)
  7. {
  8. }
  9. int Ctest::add(int a,int b)
  10. {
  11. return a+b;
  12. }
  13. extern "C" init()
  14. {

  15. test.add(4,5);
  16. }
编译通过,用jlink调试,一开始就卡在

  1.                  __use_no_semihosting_swi:
  2. 0x08000456 4770      BX       lr
  3.                  __sig_exit:
  4. 0x08000458 2800      CMP      r0,#0x00
  5. 0x0800045A D001      BEQ      0x08000460
  6. 0x0800045C F000B828  B.W      _sys_exit (0x080004B0)
  7. 0x08000460 4770      BX       lr
  8. 0x08000462 0000      MOVS     r0,r0
  9.                  __rt_SIGRTMEM_inner:
  10. 0x08000464 2100      MOVS     r1,#0x00
  11. 0x08000466 B510      PUSH     {r4,lr}
  12. 0x08000468 2801      CMP      r0,#0x01
  13. 0x0800046A D100      BNE      0x0800046E
  14. 0x0800046C A102      ADR      r1,{pc}+4  ; @0x08000478
  15. 0x0800046E A008      ADR      r0,{pc}+2  ; @0x08000490
  16. 0x08000470 F000F828  BL.W     __default_signal_display (0x080004C4)
  17. 0x08000474 2001      MOVS     r0,#0x01
  18. 0x08000476 BD10      POP      {r4,pc}
  19. 0x08000478 203A      MOVS     r0,#0x3A
  20. 0x0800047A 6548      STR      r0,[r1,#0x54]
  21. 0x0800047C 7061      STRB     r1,[r4,#0x01]
  22. 0x0800047E 6D20      LDR      r0,[r4,#0x50]
  23. 0x08000480 6D65      LDR      r5,[r4,#0x54]
  24. 0x08000482 726F      STRB     r7,[r5,#0x09]
  25. 0x08000484 2079      MOVS     r0,#0x79
  26. 0x08000486 6F63      LDR      r3,[r4,#0x74]
  27. 0x08000488 7272      STRB     r2,[r6,#0x09]
  28. 0x0800048A 7075      STRB     r5,[r6,#0x01]
  29. 0x0800048C 6574      STR      r4,[r6,#0x54]
  30. 0x0800048E 0064      LSLS     r4,r4,#1
  31. 0x08000490 4953      LDR      r1,[pc,#332]  ; @0x080005E0
  32. 0x08000492 5247      STRH     r7,[r0,r1]
  33. 0x08000494 4D54      LDR      r5,[pc,#336]  ; @0x080005E8
  34. 0x08000496 4D45      LDR      r5,[pc,#276]  ; @0x080005AC
  35. 0x08000498 203A      MOVS     r0,#0x3A
  36. 0x0800049A 754F      STRB     r7,[r1,#0x15]
  37. 0x0800049C 2074      MOVS     r0,#0x74
  38. 0x0800049E 666F      STR      r7,[r5,#0x64]
  39. 0x080004A0 6820      LDR      r0,[r4,#0x00]
  40. 0x080004A2 6165      STR      r5,[r4,#0x14]
  41. 0x080004A4 2070      MOVS     r0,#0x70
  42. 0x080004A6 656D      STR      r5,[r5,#0x54]
  43. 0x080004A8 6F6D      LDR      r5,[r5,#0x74]
  44. 0x080004AA 7972      LDRB     r2,[r6,#0x05]
  45. 0x080004AC 0000      MOVS     r0,r0
  46. 0x080004AE 0000      MOVS     r0,r0
  47.                  _sys_exit:
  48. 0x080004B0 4903      LDR      r1,[pc,#12]  ; @0x080004C0
  49. 0x080004B2 F04F0018  MOV      r0,#0x18
  50. 0x080004B6 BEAB      BKPT     0xAB
  51. 0x080004B8 4770      BX       lr
  52. 0x080004BA 0000      MOVS     r0,r0
  53. 0x080004BC FF9BFFFF  DCD      0xFF9BFFFF   ; ? Undefined
  54. 0x080004C0 0026      MOVS     r6,r4
  55. 0x080004C2 0002      MOVS     r2,r0
  56.                  __default_signal_display:
  57. 0x080004C4 B570      PUSH     {r4-r6,lr}
  58. 0x080004C6 4604      MOV      r4,r0
  59. 0x080004C8 460D      MOV      r5,r1
  60. 0x080004CA 200A      MOVS     r0,#0x0A
  61. 0x080004CC E000      B        0x080004D0
  62. 0x080004CE 1C64      ADDS     r4,r4,#1
  63. 0x080004D0 F000F811  BL.W     _ttywrch (0x080004F6)
  64. 0x080004D4 B134      CBZ      r4,0x080004E4
  65. 0x080004D6 7820      LDRB     r0,[r4,#0x00]
  66. 0x080004D8 2800      CMP      r0,#0x00
  67. 0x080004DA D1F8      BNE      0x080004CE
  68. 0x080004DC E002      B        0x080004E4
  69. 0x080004DE 1C6D      ADDS     r5,r5,#1
  70. 0x080004E0 F000F809  BL.W     _ttywrch (0x080004F6)
  71. 0x080004E4 B115      CBZ      r5,0x080004EC
  72. 0x080004E6 7828      LDRB     r0,[r5,#0x00]
  73. 0x080004E8 2800      CMP      r0,#0x00
  74. 0x080004EA D1F8      BNE      0x080004DE
  75. 0x080004EC E8BD4070  POP      {r4-r6,lr}
  76. 0x080004F0 200A      MOVS     r0,#0x0A
  77. 0x080004F2 F3AF8000  NOP.W   
  78.                  _ttywrch:
  79. 0x080004F6 B508      PUSH     {r3,lr}
  80. 0x080004F8 4669      MOV      r1,sp
  81. 0x080004FA 9000      STR      r0,[sp,#0x00]
  82. 0x080004FC 2003      MOVS     r0,#0x03
  83. 0x080004FE BEAB      BKPT     0xAB //卡在这
  84. [/color]0x08000500 BD08      POP      {r3,pc}

 楼主| kevin_ares 发表于 2010-7-12 14:31 | 显示全部楼层
最新情况,

我把这两个函数,强制改成这样后,程序能跑进main函数了,

  1.         void _ttywrch(int  ch)
  2.         {
  3.         //        sendchar(ch);
  4.         }


  5.         void _sys_exit(int  return_code)
  6.         {

  7.         }

但是,随后会卡在
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
 楼主| kevin_ares 发表于 2010-7-12 14:54 | 显示全部楼层
最新进展

发现是卡在这句话,导致HardFault_Handler

0x0800250A F7FDFEA2  BL.W     __rt_memclr (0x08000252)NDING; 02)

memset(buff,0,MSG_DATA_LEN);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

47

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部