‘壹’ 单片机中数组超出范围会产生怎样的异常
可以正常读取数据,但数据非你想获取的内容,而且溢出部分内容不可控。
‘贰’ 一个单片机UART接收与内存的问题,如果我定义了数组UART[60]用于接收UART接收来的数据,每收一个数据.....
超过60以后,指针uart_point 会指向UART[59]的下一个连续内存地址。假设UART[0]的地址是0x0000,编译器会分配一个连续的内存块,即0x0000~0x0059,当指针的值是0x0059,即指向最后一个变量UART[59]时,再加1就指针值就变成0x0060了,这个内存地址不属于UART,可能会被编译器分配给其它的变量。如果你通过指针改变了它的值,很明显,当你的UART运行时就会发生一些若明其妙的问题,而且现象可能各式各样,无迹可循。解决的办法是定义一个全局变量,用来指示接收的字符数量,在串口接收中断中检测接收数量是否超规,当字符数量达到指定值时若还有数据则把多余的部份丢弃,如下:
1:定义串口缓存数量 #define UARTCHARNUM 60
2:定义UART[UARTCHARNUM]和字符数量指示变量inuartnum
3:定义一系列操作函数,如:返回当前接收字符数量、复位字符数量等函数
4:在串口接收中断中检查接收字符数量是否达到指定值,若有则多余字符丢弃
其它语句。。。
if(inuartnum<UARTCHARNUM )
{
UART[inuartnum]=SBUF;
inuartnum++;
}
我就是这么做的,使用内存变量指针一定要记得给它加个检测,防止出现不可预知的错误,这种错误Keil C等编译器暂时没法自动检测出来,只能自已想办法。
‘叁’ 怎么解决单片机数组占用太多内存的问题
把不用修改的数组设为code,放在ROM中;
开辟一块通用的数组,其他数组设为指针,指向通用数组中的地址,这样就省多了,当然,你要考虑好,在复用时不要互相干扰