hujj 发表于 2019-1-13 22:00

【ST NUCLEO-G071RB评测】+ 程序移植运行出现错误

    这是向LCD5110写字符的函数,在SMT32F103下能够正常运行,可是在STM32G071下编译能够通过,下载到开发板运行则出错,调试发现,在执行循环时第一遍能通过,第二遍开始时就出现系统错误,跳到错误处理函数里。请教各位是什么原因,该如何解决

/*********************************************
* 函数名称:LCD_write_ASCII
* 函数功能:显示字符串5*7(8)
* 入口参数:x,y,cid :显示ASCII字符
* 出口参数:无               编号(行号)32~127
* 备注:ASCII码表的数组ASC_5来寻址
*********************************************/
void LCD_write_ASCII(u8 X,u8 Y,u8 *stru)
{
    u8 i;

    LCD_set_XY(X,Y);                        //定位(左上角)
    while (1)
    {
      for ( i=0; i<5; i++)      //输出一个5*7字符
      {
            LCD_write_byte(ASC_5[*stru-32],1);
      }
      stru++;
      
      if(*stru == '\0') break;    //在每个字符串的最后,会有一个'\0'
      LCD_write_byte(0x00,1);   //插入空列
    }
}



运行第一遍时正常:



运行第二遍在循环开始时就出错:



出错后跳到错误处理函数里:




hujj 发表于 2019-1-14 08:37

从调试情况看,似乎是循环的下标出错引起的,但看不明白的是第一遍执行前和执行后,i的值是不在范围内(not in scope),进入第二遍出错后,i的值变成了0x00000000。

hujj 发表于 2019-1-14 19:17

    排查了一天,推断可能还是指针运算时出错,造成数组下标越界。就是不明白在STM32F103下面正常运行的程序,移植到STM32G071下面就不能运行。有哪位坛友能解释一下吗?

littleshrimp 发表于 2019-1-14 22:43

调试模式下监视一下各个变量,重点看一下*stru-32有没有超出aASC_5的范围

littleshrimp 发表于 2019-1-14 22:49

hujj 发表于 2019-1-14 08:37
从调试情况看,似乎是循环的下标出错引起的,但看不明白的是第一遍执行前和执行后,i的值是不在范围内(not ...

i的问题把编译优化去掉看看

hujj 发表于 2019-1-14 23:02

谢谢版主关注!应该不是i变量的问题,是指针*stru的问题。这是在屏幕上输出字符串的函数,将接收到的字符串逐个输出到屏幕上,由于时间紧,目前暂时直接在程序中调用单个字符输出函数来解决,待以后有空时再慢慢调试。

damiaa 发表于 2019-1-17 14:30

<div class='shownolgin' data-isdigest='no'>十有八九是指针的值算出的结果超出数组下标问题。</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

hujj 发表于 2019-1-18 09:56

<div class='shownolgin' data-isdigest='no'>damiaa 发表于 2019-1-17 14:30
十有八九是指针的值算出的结果超出数组下标问题。

但我就是不明白这段程序在STM32F103能正常运行,我是原封不动复制过来的。</div><script>showreplylogin();</script>
页: [1]
查看完整版本: 【ST NUCLEO-G071RB评测】+ 程序移植运行出现错误