msp430在加入温度传感器测温后出现复位怎么回事
用的msp430f437,用到了12路ad通道测量电压,利用flash信息段存储PT变比,id号,电压计算系数等装置参数,精度校准后参数写入flash信息段保存,可以比较准的测量工频电压,但是现在我在这个基础上加入了温度补偿程序,即增加一个ad通道利用430的温度传感器测温,结果平时运行正常,但是在校准精度时(利用uart通信校准,9600bps)有时候就会出现复位情况,不是每次都这样,请问可能是什么原因呢?
有没有打开看门狗?如果打开了,在校准时注意周期性清除或关闭
在中断里有清楚看门狗计数器
程序中在timerA中断里(1ms)有清看门狗计数器,写flash信息段时是要关闭中断的,而且我加入测温程序和之前程序比较,只是多了1个AD通道采集温度传感器值,多定义了几个全局变量,结果就出现复位情况,而且不是每次都复位,会不会是堆栈不够用?
开始就有写flash
我用两个程序作比较,都含有flash写操作(校准后肯定要写入msp的flash信息段保存参数),区别在于:后面一个程序多了1个AD通道采集温度,于是也多了几个变量(static变量,全局变量),这个两个程序就一个不复位,一个复位,我怀疑是我的堆栈什么的设小了,不知道有没道理。我用的IAR3.41,编译后下面说:xxxxcode,xxxxdata,(80absolute),后面这个是什么意思?80表示什么?然后我jtag调试时,设置断点后在断点处暂停后下面指出:the stack is filled to 100% (80 bytes used out of 80),the warning threshhold is set to 90%,这个有什么影响吗?
另外,用flash保存参数感觉会影响中断执行(毕竟flash写操作要关闭中断的),导致我的led不是等间隔定时轮询显示(我的led显示靠1ms中断来进行段选),所以会有明暗变化。请问有什么好方法改善吗?
知道你问题所在了,你用的是默认80BITS堆栈,而你写FLASH时是不是有个大数组临时变量呀?
你在选项里把堆栈设大点就没事了!
确实是和堆栈有关,上面的朋友说的对
我使用的是 默认的 80字节,但是在写flash信息段里面有个128字节的临时数组,这样会导致堆栈溢出,其实堆栈溢出没有问题,只要总的RAM足够也不会复位,关键是我的RAM只有1K,所以我在多定义了几个全局变量后导致RAM空间不够而溢出,请问我这个分析对吗?因为如果单纯是堆栈溢出的话,我以前的程序也是默认80字节,程序运行时堆栈在flash操作时早就溢出了,但没出现复位及其他问题,只是在我现在加入了2个全局变量后才产生复位的。
请问我如何改进呢?去掉不必要的全局变量?我发现如果只定义了 全局变量但在程序里没有使用的话那么编译结果不会把此全局变量计算在DATA空间里。HEAP的大小好像也不影响DATA容量,有哪位能够详细讲解一下堆栈,堆和变量的 关系呢 ?
还有,楼上说的LED静态显示时怎么实现呢?我是用IO口控制LED显示的,动态扫描方式
全局变量有先后顺序关系的!嘿嘿!注意CHAR INT不同类型的变量不要交叉!这样不会让费空间!
HEAP是动态内存管理区域大小,这个你写的程序应该没用到这么高级功能吧!跑OS系统可能需要
全局变量但在程序里没有使用的话那么编译结果不会把此全局变量计算在DATA空间里,是的这个IAR编译器会编译时会自动搜索的
堆大小计算可以看。MAP文件,怎么生成。MAP,计算等文件具体看IAR手册去吧!
1K RAM还不够用吗?
所谓静态显示是需要锁存器如373,595!把你显示电路副上就好说了!
again是高手啊 ,厉害!
以后多指教了,还有一个问题是,我的堆栈现在改为180字节,怎么还是不够用?(JTAG调试时设置断点后提示180 bytes used out of 180),不过这个只在我精度校准时出现,一般情况下我的装置运行时暂停后不会提示堆栈用完,精度校准里有把参数写入FLASH的过程,这个过程 用到了128字节的局部数组。我怀疑即使我的堆栈大小设为300字节,还是会如此,只是程序并没有出现异常。
我的全局变量很多 ,三相电量,系统参数等,soe记录等,所以差不多就用了1k。
显示部分由于硬件设计已经固定,不能再修改了,只好如此了呵呵。硬件不是我负责,好像是通过IO口加了三极管驱动的,具体原理我也不是很清楚。
感觉flash操作要关中断这个太不好了,在精度校准时装置显示闪得厉害,而且也会影响我电量得 测量精度吧,先只好这样了