问题:
利用CCS软件将代码烧入430之后,在还没有点击开始运行时,程序就已经开始自动运行了如下图所示,在点击暂停之后,程序就报错了。在把那个数组元素个数改的很小之后,程序就正常了。所以可以断定,是由于定义大数组产生的问题。
问题分析:
通过查找资料,发现产生这个问题的原因是因为全局数组定义过大时,系统一上电,需要对这些数组初始化,初始化的时间过长,导致看门口溢出,从而一直进不了主函数,导致程序跑飞了。
解决方案:
(1)编写C启动函数
在TI官网找了有关CCS的资料之后,找到了解决方案。
除了主函数之外,我们需要再定义一个函数,函数名为的_system_pre_init(),在CCS编译器中,这是一个C启动函数,是在主函数开始执行之前执行的,所以在该函数里,加入关闭看门口的代码就可以解决这个问题了~
在IAR编译器中,也有类似的函数,为__low_level_init(),使用方法与上文提到的相同。
(2)将大数组放在RAM的不初始化区域
既然已经知道是初始化时间过长导致这个问题,我们可以把大数组定义在RAM的不初始化区域就行了。
在IAR编译器中,在定义变量之前,加上__no_initm命令即可,如__no_init char a; 即把a这个字符型变量放在RAM的不初始化区域。
在CCS编译器中,没有这样的命令,需要做类似的操作的话,有些繁琐,需要自己改写CMD文件,这里就不再赘述了。大家有兴趣的话,可以到TI官网下载相应的文档看一下。
关键字:MSP430 全局数组
引用地址:
MSP430中定义大数组存在的问题及解决方案
推荐阅读最新更新时间:2024-10-24 19:47
MSP430中定义大数组存在的问题及解决方案
问题: 利用CCS软件将代码烧入430之后,在还没有点击开始运行时,程序就已经开始自动运行了如下图所示,在点击暂停之后,程序就报错了。在把那个数组元素个数改的很小之后,程序就正常了。所以可以断定,是由于定义大数组产生的问题。 问题分析: 通过查找资料,发现产生这个问题的原因是因为全局数组定义过大时,系统一上电,需要对这些数组初始化,初始化的时间过长,导致看门口溢出,从而一直进不了主函数,导致程序跑飞了。 解决方案: (1)编写C启动函数 在TI官网找了有关CCS的资料之后,找到了解决方案。 除了主函数之外,我们需要再定义一个函数,函数名为的_system_pre_init(),在CCS编译器中,这是一个C
[单片机]
MSP430定义超大数组的问题
IAR编译的方法,导致看门狗溢出了。 单片机上电的时候看门狗已经启动, 但是在进入main函数之前,软件会首先去初始化你用到的一些数据,比如数组之类的, 如果你的数组定义的比较大, 那么初始化的时间就会很长,当然在这过程中,看门狗的时间就到了,单片机复位,然后在启动,在初始化 ,这样循环。 解决方法是,使用低级初始化函数, IAR编译的时候,会自动把低级初始化的函数放在程序的最开始处,这样你可以在低级初始化函数里面先把看门狗关掉, 等低级初始化函数执行完了,才会进行数据初始化的处理,在然后才执行main函数, 详细解决方法参考IAR的这篇文档: http://supp.iar.com/Support/?note=37778&f
[单片机]
MSP430中定义大数组存在的问题及解决方案
这两天利用MSP430做一个小系统,需要定义一个很大的全局数组,编译之后没有问题,但是调试的时候却遇到了问题。下面我们先来看下遇到的问题。 问题: 利用CCS软件将代码烧入430之后,在还没有点击开始运行时,程序就已经开始自动运行了如下图所示,在点击暂停之后,程序就报错了。在把那个数组元素个数改的很小之后,程序就正常了。所以可以断定,是由于定义大数组产生的问题。 问题分析: 通过查找资料,发现产生这个问题的原因是因为全局数组定义过大时,系统一上电,需要对这些数组初始化,初始化的时间过长,导致看门口溢出,从而一直进不了主函数,导致程序跑飞了。 解决方案: (1)编写C启动函数 在TI官网找了有关C
[单片机]
STM8 定义大数组 报错 #error clnk Debug\demo.lkf
今天再编写STM8的时候发现定义大数组编译无法通过,通过网上查询终于编译通过了,再次方便自己记录,写得有问题或者不好的不好请指教。 1.错误示例: 2.打开对话框 3.修改project settings - C Compiler - General - Memory Models :选择Long Stack ; 4.重新编译通过
[单片机]
使用KEIL、Atmel studio将数组定义在Flash区
简介:在进行51或AVR单片机程序开发时如果需要定义较大的数组或字符串时,一般定义将会把这些占用内存较大的变量放置到RAM中,因此RAM吃紧,严重的话将导致程序崩溃,面对这种情况我们可以将这些占用内存较大的变量定义到Flash中以释放一定的RAM空间,保障程序的流畅运行。 在进行51或AVR单片机程序开发时如果需要定义较大的数组或字符串时,一般定义将会把这些占用内存较大的变量放置到RAM中,因此RAM吃紧,严重的话将导致程序崩溃,面对这种情况我们可以将这些占用内存较大的变量定义到Flash中以释放一定的RAM空间,保障程序的流畅运行。 方法/步骤1——51单片机KEIL编译环境 一、很多单片机爱好者都知道“摇摇棒”和“
[单片机]
关于STM32中定义数组的问题
功能描述:今天做数据采集,TIM2定时中断20ms采集一次数据,并存入一个数组中。采集完4000个数据后,用串口将这4000个数据依次发送给上位机。 问题描述:DEBUG中对数组指针add watch,发现指针由0增加至1后就不再增加,怀疑TIM2配置有问题,只进了一次中断。于是查了半天关于定时中断配置及清除中断标志位的问题,一直得不到解决。 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update); Read_Vel_Puls
[单片机]
STM32—数组作为被调用函数的入口参数时定义成指针
STM32—数组作为被调用函数的入口参数时,要两个条件, 1:数组首地址 2:数组长度 在被调用函数中,比如把数据保存到数组pbuffer 中,那么在入口参数定义时要定义成指针u8 *pbuffer, 1 而在调用时,比如要保存到tab 中,要在入口参数处强制转换成(u8 *)tab,
[单片机]
STM32将常量数组定义到FLASH固定地址
方法:static const uint8_t s_acBmpLogo030 __attribute__((at(0X800F000)))={0x80,0xC0,0xC0,0xC0,0xC0,0x80,xxxxxxx} 编译之后可在.map文件看到其分配到的地址 0x0800f000 0x0000005c Data RO 4013 .ARM.__AT_0x0800F000 main.o 这是从调试窗口查看的flash数据
[单片机]