本人有一个问题想请教一下Peter_zheng,可苦于没联系方式,有知道者,请留下他的联系方式。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
嗯好滴。
这个图是我用IARforMSP430的反汇编对话框中的。我调试的程序开始就在进入了_data16_memzero这个函数了,在地址为00CEF6到00CEFE中死循环了。
我知道什么原因,是我初始化了TIMB时钟的,但是没编写中断函数,当我把中断使能取消了就通过了。但是我一直不明白他为什么会进入这个死循环,不知道原理。
还有就是程序开始是从汇编_Programm_start开始的吧,资料上说他开启的时候自己开启了看门狗,我怎么没看到汇编代码开启看门狗那?在Cstartup.s43里找了一段代码:
// --------------------
// Turn off the watchdog.
//
// Note: This is excluded by default. Please define
// DISABLE_WATCHDOG to include it.
//
#ifdef DISABLE_WATCHDOG
MOV #WDTPW + WDTHOLD, &WDTCTL
#endif
这是关闭看门狗,而不是开启看门狗啊。所以一直很郁闷!!!
我用的MSp430G2553,在IAR for 430上调试,反汇编窗口输出的信息如图所示。
在调试中出的问题是,程序进入了反汇编对话框中的_data16_memzero这个函数,在地址为00CEF6到00CEFE中死循环,跳不出来。
我知道原因在那里,是我在程序中使能了TIMB时钟的溢出中断,但是没有编写中断函数。网上资料说在Cstartup.s43这个文件里,说看门狗在430启动的时候自动开启,但是我看了里面的相关代码:
_program_start:
PUBLIC ?cstart_begin
?cstart_begin:
// --------------------
// Turn off the watchdog. 关闭看门狗
//
// Note: This is excluded by default. Please define
// DISABLE_WATCHDOG to include it.
//
#ifdef DISABLE_WATCHDOG
MOV #WDTPW + WDTHOLD, &WDTCTL
#endif
// --------------------
// Initialize SP to point to the top of the stack.
//
MOV #SFE(CSTACK), SP
//
// Ensure that main is called.
//
REQUIRE ?cstart_call_main
// -----------------------------------------------
// Call __low_level_init to perform initialization before initializing
// segments and calling main. If the function returns 0 no segment
// initialization should take place.
//
// Link with your own version of __low_level_init to override the
// default action: to do nothing but return 1.
//
XRSEGCSTART
PUBLIC ?cstart_call_low_level_init
EXTERN __low_level_init
?cstart_call_low_level_init:
XCALL #__low_level_init
CMP #0, W0
JEQ ?cstart_call_main
// -----------------------------------------------
// Segment initialization:
//
// xxx_Z -- uninitialized data that are filled with zeros.
// xxx_I -- initialized data that gets the values from the corresponding
// xxx_ID segment.
//
#ifndef IGNORE_SEG_INIT
// --------------------
// Initialize code for __ramfunc functions.
//
XRSEGCSTART
PUBLIC ?cstart_init_copy_ramfunc
?cstart_init_copy_ramfunc:
#ifndef IGNORE_RAMFUNC_INIT
#ifndef REGISTER_MODEL_REG20
MOV #SFB CODE_I, CW0
MOV #SFB CODE_ID, CW1
MOV #sizeof CODE_I, CW2
XCALL #__data16_memcpy
#else // MSP430X with 20 bit pointers.
EXTERN __data20_memcpy
MOVA #SFB CODE_I, CW0
MOVA #SFB CODE_ID, CW1
MOV.W #LWRD(sizeof CODE_I), L1L
MOV.W #HWRD(sizeof CODE_I), L1H
XCALL #__data20_memcpy
#endif // REGISTER_MODEL_REG20
#endif // IGNORE_RAMFUNC_INIT
// --------------------
// Initialize data16
//
#ifndef IGNORE_DATA16_DATA
//
// Clear DATA16_Z.
//
XRSEGCSTART
PUBLIC ?cstart_init_zero
EXTERN __data16_memzero 找到了函数
?cstart_init_zero:
MOV #SFB DATA16_Z, CW0
MOV #sizeof DATA16_Z, CW1
XCALL #__data16_memzero
//
// Copy DATA16_ID to DATA16_I
//
XRSEGCSTART
PUBLIC ?cstart_init_copy
EXTERN __data16_memcpy
?cstart_init_copy:
MOV #SFB DATA16_I, CW0
MOV #SFB DATA16_ID, CW1
MOV #sizeof DATA16_I, CW2
XCALL #__data16_memcpy
#endif // IGNORE_DATA16_DATA
// --------------------
// Data20
//
#if __CORE__==__430X_CORE__
#ifndef IGNORE_DATA20_DATA
//
// Clear DATA20_Z.
//
XRSEGCSTART
PUBLIC ?cstart_init_zero20
EXTERN __data20_memzero
?cstart_init_zero20:
MOVA #SFB DATA20_Z,W0
MOV.W #LWRD(sizeof DATA20_Z), L1L
MOV.W #HWRD(sizeof DATA20_Z), L1H
XCALL #__data20_memzero
//
// Copy DATA20_ID to DATA20_I
//
XRSEGCSTART
PUBLIC ?cstart_init_copy20
EXTERN __data20_memcpy
?cstart_init_copy20:
MOVA #SFB DATA20_I, CW0
MOVA #SFB DATA20_ID, CW1
MOV.W #LWRD(sizeof DATA20_I), L1L
MOV.W #HWRD(sizeof DATA20_I), L1H
XCALL #__data20_memcpy
#endif // IGNORE_DATA16_DATA
#endif // MSP430X
#endif // IGNORE_SEG_INIT
// -----------------------------------------------
// Call constructors of static objects.
//
RSEG DIFUNCT:CONST:NOROOT(1)
XRSEGCSTART
PUBLIC ?cstart_call_ctors
EXTERN __call_ctors
?cstart_call_ctors:
#ifdef REGISTER_MODEL_REG20
MOVA #SFB DIFUNCT, CW0
MOVA #SFE DIFUNCT, CW1
#else /* REGISTER_MODEL_REG20 */
MOV.W #SFB DIFUNCT, CW0
MOV.W #SFE DIFUNCT, CW1
#endif /* REGISTER_MODEL_REG20 */
XCALL #__call_ctors
// -----------------------------------------------
// Call main() with no arguments and then exit using the return value
// of main as the parameter.
//
XRSEGCSTART
PUBLIC ?cstart_call_main
EXTERN main
EXTERN exit
?cstart_call_main:
XCALL #main
XCALL #exit
PUBLIC ?cstart_end
?cstart_end:
// Note: "ENDMOD label" means code that this module is the
// start of the application.
ENDMOD __program_start
我在里面找到了关闭看门狗的函数,怎么没有初始化开启看门狗的程序那?
还有我还找到了_data16_memzero 这个标志,但是声明的是全局标志,他的具体指向代码在IAR for 430的那个文件夹里,我一直没找到,所以一直没从原理上明白为什么进入了死循环,只是知道了原因。
你有这方面的相关资料吗?
还有就是关于IARfor 430\430\src\lib\430文件夹里的几个文件(cexit.s43, cstartup.s43, epilogue.s43, setjmp.s43 termio.s43)的具体解释资料有吗?
一直在_data16_memzero里死循环可能是因为程序最开始初始化变量的时候有大数组需要初始化。导致看门狗不断复位。这个初始化的过程是在进入main之前,有2种方式你可以尝试:
1.对你的数组用 __no init_定义,上电编译器不产生特殊的附加函数去初始化RAM
2. B修改IAR中Cstartup.S43文件中__program_start子程序,增加一个关闭WDT的操作或者设置WDT时间长度超过32MS
C在Project--Options--Linker--Config中选择 Override default programe,并将
Entry lib 设置成 __program_start
另外G2553没有timerB,我想你说的可能是TA1。由于缺少中断向量入口,导致复位。
有啥问题,咱再交流
我还有2个问题。
1.你说的设置wdt看门狗时间长度是在main.c函数里那?还是在Cstartup.s43里? 如果在Cstartup.s43里,我怎么只在那里面看到了关闭看门狗啊,没看到开启关门狗的程序。
// System initialization.
//
XRSEGCSTART
PUBLIC __program_start
EXTERN ?reset_vector
REQUIRE ?reset_vector
__program_start:
PUBLIC ?cstart_begin
?cstart_begin:
// --------------------
// Turn off the watchdog. //
// Note: This is excluded by default. Please define
// DISABLE_WATCHDOG to include it.
//
#ifdef DISABLE_WATCHDOG 关闭看门狗
MOV #WDTPW + WDTHOLD, &WDTCTL
#endif
2.这个_data_memzero子程序 在那个文件夹里?你能提供一下这方面的资料吗?
按照您的,Cstartup.s43文件中 加了 #define DISABLE_WATCHDOG //关闭狗 ,还是不行?
后面我对 数组用 __no init_定义了,才行;
单独 关看门狗 不行啊?
求解,万分感谢