【单片机经验】点滴积累
关于单片机使用mallco函数的问题:
(malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。
因此楼主请检查是否分配了heap空间以及heap是否足够大。)
1、嵌入式程序为什么不能用堆内存,个人觉得这是不可避免的啊?
a:嵌入式程序可以用堆内存,但与芯片有关,如果是ARM就可以。
如果是51,不止malloc不好用,很多C库函数都不好用。
b:我见过的嵌入式系统中,也只是操作系统用对内存,一般应用不提倡用的。。。。。
因为堆内存有不可预知性,比如万一申请不到内存怎么办,一般嵌入式系统资源有限。
有很多公司的设计基准明确规定不允许使用堆内存
2、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。
3、12月19日 全局变量的值会变的原因
定义了一个全局变量:char Chlchar[1]={0};
结果发现在程序的运行当中,即使没有对它进行赋值,它的值一样会变。
分析发现:原来是UART3_RX_BUF[UART3_RX_MAXLen] 填满后没有做UART3_RX_Len=0;处理,
导致其越界了依然继续填装,占用了Chlchar[1]的空间。
在程序中加了这一句后,问题解决:
if(UART3_RX_Len>=UART3_RX_MAXLen)
UART3_RX_Len=0;
接收程序:
UART3_RX_BUF[UART3_RX_Len] = UCA3RXBUF;
UART3_RX_Len++;
if(UART3_RX_Len>=UART3_RX_MAXLen)
UART3_RX_Len=0;
http://bbs.zlgmcu.com/dispbbs.asp?boardid=29&id=7077
2012.1.13
(以下总结不正确,INPUT_FP_CHCK()在下面的中断中无法正常工作,原因未明,2012.2.9)
在中断里面的程序,要注意打开程序需要的别的中断
例如:下面我在RTC中断中处理INPUT_FP_CHCK()程序,INPUT_FP_CHCK() 程序中涉及到串口UART1的发送和接收,所以我要在RTC程序中把收发中断 UCA1IE |= UCRXIE+UCTXIE; 打开,否则进入RTC中断后,UART1的收发中断均被禁止,无法收发。
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
INPUT_FP_CHCK()
munit=1;
RTCCTL01 &=~(RTCRDYIFG + RTCTEVIFG);
}
2012.2.9
在使用for 之前,一定要先定义i,否则极有可能出现i不确定数,甚至是负数:
如:
int i=0;
for(i=0;i<200000;i++)
{
if(strstr(UART0_RX_BUF,"+CCLK:")) break;//等待模块准备好“返回"+CCLK:"
}
上面还有一个地方错误,int 为60000多,一直小于200000。
2012.2.20 IAR 查看程序运行所花的时间
软件仿真设置:Project————Options————Debugger————Driver选Simulator就可以了。
然后View——Regstrers 的CPU Regstrers的CYCLECOUNTER 的值!