本帖最后由 pzsh 于 2021-11-1 09:45 编辑
事情大概是这样的:有个新项目,涉及到OLED显示、串口接收数据及两路IIC通信等。刚开始为了能快速调通程序,选择了算是比较熟悉的PIC16F877A芯片,8K的程序空间,MPLAB X+PICC语言编写程序。
OLED根据串口接收的信息显示10个数字或26个字母中的特定每几个,涉及到8*8和16*16两种大小,查表的方式,数据表共占用了接近1K(1024)的空间。程序里大部分都是简单而复杂的运算以及两路IIC的控制。
刚开始程序运行一切都很正常,随着代码量越来越多,后来发现程序还没写完,空间就不够了,删掉部分程序后,查看程序空间也确实用到了98%。
以前知道PICC有优化级别一说,然后网上找了个大家都懂的PICC软件,然后优化级别调到PRO级,编译后程序空间确实缩小了40%,但是程序烧写进去后工作异常了:最直观的是按键乱跳了,串口接收数据异常了。为此我特意写了个简单的串口程序来测试: for(i=0x21;i<0x7f;i++){
TXREG=i++;
while(!TXIF);
TXIF=0;
TXREG=i;
while(!TXIF);
TXIF=0;
TXREG='\r';
while(!TXIF);
TXIF=0;
TXREG='\n';
while(!TXIF);
TXIF=0;
}
发送一次ASCII表,电脑上用串口助手观察数据。
结果PICC用LITE级优化时工作正常,用PRO级优化时总是丢失偶次发送的数据:!
#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
例如:数字部分就把02468给丢了。
跟码率无关,晶振是码率的整数倍,误码率为0,开始波特率是115200,降到14400也试过,结果一样。-----------------------------------------------------------------------------------------------------------------------
我特意对比了生产的HEX反汇编的结果,PRO级优化后程序也正常,而且也更接近按汇编思路写的程序。
但程序就是工作不正常。这是为什么?有哪位前辈遇到过类似的情况,大概是怎么解决的?谢谢!
|