【单片机经验】点滴积累

关于单片机使用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 查看程序运行所花的时间

 

在软件仿真下,可以看到整个程序走的时间,当语言然能看到C语言的时间了,单步走,就知道一条C的CPU周期,乘周期时间125NS ,就是一条指令的周期了!


软件仿真设置:Project————Options————Debugger————Driver选Simulator就可以了。

然后View——Regstrers 的CPU Regstrers的CYCLECOUNTER 的值!

 

posted on 2022-10-04 01:31  bdy  阅读(55)  评论(0编辑  收藏  举报

导航