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.

程序只使用部分功能时能下载进去并正常运行,使用全部功能则能下载完全不运行。

Other Parts Discussed in Thread: MSP430F2618

问题: 这个应用程序只使用部分功能(各个部分分别都是)时能下载进去并正常运行,

使用全部功能则能下载但完全不运行。而且我确定开启全部功能不会冲突。

不知道什么原因,望赐教!。

OS:WIN7 32bit

编译环境: IAR FOR MSP430 5.10(破解版)

 IAR FOR MSP430 5.30(破解版) (两个版本下同样问题)

器件: MSP430F2618,RAM 8k,FLASH 116K

(最小系统板)

工程大小(编译链接后):

              只使用部分功能  使用全部功能

CODE(bytes)     9136             10580

DATA(bytes)     2421              3941

CONST(bytes)    2286              7045  

以前代码量都较少,没遇到过这个问题,使用都很顺利。这次做的是TFT液晶屏的程序。

  • 楼主你好!

    1、请使用正版软件进行开发;

    2、TI提供30天免费的全功能开发软件CCSv5;

    3、请将报错的图截个屏上传看一下。

  • 看你代码生成使用了大约4K的RAM 如果下载进去不能运行是不是某个函数定义的变量太多造成了单片机堆栈溢出 单片机发生复位,你可以用仿真器单步执行你的程序看看在哪个程序导致单片机跑飞,或者你尝试修改一下IAR 堆栈的大小,设置增大堆栈,看看能不能解决问题~

  • 首先感谢TI的工程师热情帮助!

    我编译、调试工程时的截图如下:

    1.图片1-1到1-3是不使用“欢迎界面”功能时的截图。能下载并调试运行

    2.图片2-1到1-4是基本只使用“欢迎界面”功能时的截图。能下载并调试运行

    3.图片3-1到1-5是使用全部功能时的截图。能下载,但下载完后调试按钮为灰色,掉电重启程序也完全不运行。

    下过N次结果都一样。

    这个问题很难见到,因为工程较小时是不会出现的,我头一次碰到。F2618的最小系统板使用过多次,应该没问题。

    也许正如Billy所说是破解软件的问题。碰到过这个问题的朋友指点一下咯。

  • 临时安装了CCS5.4,下载时发现下载器需要升级才能下载的。很苦逼啦。请问哪个版本的CCS支持旧的下载器呢?

  • 你把堆栈改大点看看怎么样,看上去像是下载完程序就直接跑飞了,

  • Xutong Han2 你好!我在map文件里查了最大堆栈是00000084即132Byte.于是我在设置里把堆栈大小改成了256.但出现的结果依然相同。谢谢!

  • 问题解决了!首先看这段话:

    该问题是由于WDT造成的(RAM的初始化时间大于WDT默认的32MS时间,因此MSP复位),根本原因是初始化的时间过长,超过了看门狗的时间,初始化完成以后才能进入main函数,这时关狗已经来不及了。

    解决方法:

    修改IAR 的cstartup.s43 程序,具体方法如下:
    1 将cstartup.s43 程序加载到用户自己的项目中,cstartup.s43在iar310a的路径如下$TOOLKIT_DIR$\src\LIB\
    2 修改cstartup.s43 中的__program_start子程序,加入关闭看门狗的命令MOV#0x5A80,&0x0120
    3 在Project->Options->Linker->Config 页中选择Override default programe ,并将Entry lib 设置成
    __program_start

  • 楼主,

    你好!看了你的问题和解决方法,其实就是由于在数据初始化完成之前,看门狗就引起系统复位了。针对IAR,有个更简单的办法,就是将下列程序放在main之前即可,在初始化数据之前,会先进入下列程序把看门狗关掉。你可以设断点试试。O(∩_∩)O~

    int __low_level_init(void)
    {
      // stop WDT
      WDTCTL = WDTPW + WDTHOLD;
     
      // Perform data segment initialization
      return 1;
    }
  • Lina Lian的方法很好,也很简单,是最好的选择。非常感谢!TI真心给力!

  • Lina Lian,我现在正遇到上述的问题,加了您给的函数后就可以了。不过我想请教一下,为什么写成这样一个函数然后再调用它来关闭看门狗就能防止程序跑飞?之前遇到这种情况我是加大了stack问题就解决了,但这次无论怎加都无效果,能否麻烦您稍微解释一下,谢谢。

  • Xiaoqin Zhang,

    这个是与程序在进入main之前干了什么相关的,一般程序的入口函数是从_c_int00地方开始的,在进入main之前还会进行一些系统初始化工作,对于IAR而言,其实在进入main之前,其需要执行startup code, 其在cstartup.s43,你可以从C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.4\430\src\lib\430路径下找到它。如果在用户程序中有大量数据需要初始化(其初始化是在startup code中完成的,即进入main之前完成的),需要的时间超过了看门狗默认时间,那么在数据初始化完成之前,看门狗就引起系统复位了,即永远进不去用户程序main。而函数

    int __low_level_init(void)是在初始化数据之前进行的,可在此路径下找到:C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.4\430\src\lib
    故如果在
    int __low_level_init(void)中将看门狗关掉,再进行长时间的数据初始化,就可以顺利进入main了。
    希望讲的够明白。O(∩_∩)O~
  • 像我之前建的工程里main()函数一般这样写道:

    void main(void)

    {

        WDTCTL = WDTPW + WDTHOLD;

        //接下来就是各项初始化了,如系统时钟,I/O口,某些寄存器之类......

    }

    这样应该是先关闭看门狗然后再进行各项初始化吧,这种情况下如果初始化量大了为啥会导致程序跑飞?

  • Xiaoqin Zhang,

    在startup code中所要执行的 “数据初始化”和你所谓的用户自己定义的初始化不是同一个,

    Xiaoqin Zhang 说:
    //接下来就是各项初始化了,如系统时钟,I/O口,某些寄存器之类......

    在main之前执行的“数据初始化”,其实是所谓的static C/C++ initialization, 包括:

    Static variables are initialized; this includes clearing zero-initialized memory and
    copying the ROM image of the RAM memory of the rest of the initialized variables。

    譬如说你的程序中有大量的static变量,以及一些带有初始化值的全局变量等,均是在main之前初始化的。如果这个初始化占用的时间超过看门狗复位时间的话,即在进入main之前,你没有来得及关闭看门狗之前,系统已经复位了。

    而 __low_level_init是startup code留出来给用户的入口,以便在数据初始化之前,做一些前期的初始化。

    The function __low_level_init is called if you have defined it, giving the
    application a chance to perform early initializations.

    这些内容,在IAR compiler文档中都有讲,你可以参考参考。O(∩_∩)O~

  • Lina Lian

    这下明白了,非常感谢!!!