硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7091|回复: 10
收起左侧

[开发工具] 实战经验分享之切换不同优化等级导致程序异常的解决思路

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2020-5-13 08:41:48 | 显示全部楼层 |阅读模式
一个好的工程,基本可以做到IDE所有优化等级通吃。

很多时候我们都希望将程序开到最高优化等级,如果开启后能够正常运行,则万事大吉。如果不能正常运行或者程序异常就比较闹心。

排查起来也挺闹心的,这里分享一种实战的方式,昨晚就用这种思路解决了一个问题。

这种方法之前也为大家推荐过:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=89057

分两个方向:
1、开启优化话后,部分功能不正常

这种的解决思路是把这部分的文件继续设置为低优化等级,整体工程设置为高优化等级。

2、开启优化后,直接整体卡死

这种的解决思路是整体工程设置为低优化等级,逐步开启工程文件的优化等级。

具体到某些函数的优化也是可以单独开启测试的。



对一些函数做优化也是可以的。

  1. #if defined   (__CC_ARM) /*!< ARM Compiler */
  2. #pragma O0
  3. #elif defined (__GNUC__) /*!< GNU Compiler */
  4. #pragma GCC optimize ("O0")
  5. #endif /* __CC_ARM */
  6. HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma)
  7. {
  8.   uint8_t  is_oddframe = 0;
  9.   uint16_t len_words = 0;   
  10.   uint16_t num_packets = 0;
  11.   uint16_t max_hc_pkt_count = 256;
  12.   uint32_t tmpreg = 0;
  13.    
  14.   if((USBx != USB2_OTG_FS) && (hc->speed == USB_OTG_SPEED_HIGH))
  15.   {
  16.     if((dma == 0) && (hc->do_ping == 1))
  17.     {
  18.       USB_DoPing(USBx, hc->ch_num);
  19.       return HAL_OK;
  20.     }
  21.     else if(dma == 1)
  22.     {
  23.       USBx_HC(hc->ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM);
  24.       hc->do_ping = 0;
  25.     }
  26.   }
  27.   
  28.   /* Compute the expected number of packets associated to the transfer */
  29.   if (hc->xfer_len > 0)
  30.   {
  31.     num_packets = (hc->xfer_len + hc->max_packet - 1) / hc->max_packet;
  32.    
  33.     if (num_packets > max_hc_pkt_count)
  34.     {
  35.       num_packets = max_hc_pkt_count;
  36.       hc->xfer_len = num_packets * hc->max_packet;
  37.     }
  38.   }
  39.   else
  40.   {
  41.     num_packets = 1;
  42.   }
  43.   if (hc->ep_is_in)
  44.   {
  45.     hc->xfer_len = num_packets * hc->max_packet;
  46.   }
  47.   
  48.   /* Initialize the HCTSIZn register */
  49.   USBx_HC(hc->ch_num)->HCTSIZ = (((hc->xfer_len) & USB_OTG_HCTSIZ_XFRSIZ)) |\
  50.     ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |\
  51.       (((hc->data_pid) << 29) & USB_OTG_HCTSIZ_DPID);
  52.   
  53.   if (dma)
  54.   {
  55.     /* xfer_buff MUST be 32-bits aligned */
  56.     USBx_HC(hc->ch_num)->HCDMA = (uint32_t)hc->xfer_buff;
  57.   }
  58.   
  59.   is_oddframe = (USBx_HOST->HFNUM & 0x01) ? 0 : 1;
  60.   USBx_HC(hc->ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM;
  61.   USBx_HC(hc->ch_num)->HCCHAR |= (is_oddframe << 29);
  62.   
  63.   /* Set host channel enable */
  64.   tmpreg = USBx_HC(hc->ch_num)->HCCHAR;
  65.   tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
  66.   tmpreg |= USB_OTG_HCCHAR_CHENA;
  67.   USBx_HC(hc->ch_num)->HCCHAR = tmpreg;
  68.   
  69.   if (dma == 0) /* Slave mode */
  70.   {  
  71.     if((hc->ep_is_in == 0) && (hc->xfer_len > 0))
  72.     {
  73.       switch(hc->ep_type)
  74.       {
  75.         /* Non periodic transfer */
  76.       case EP_TYPE_CTRL:
  77.       case EP_TYPE_BULK:
  78.         
  79.         len_words = (hc->xfer_len + 3) / 4;
  80.         
  81.         /* check if there is enough space in FIFO space */
  82.         if(len_words > (USBx->HNPTXSTS & 0xFFFF))
  83.         {
  84.           /* need to process data in nptxfempty interrupt */
  85.           USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM;
  86.         }
  87.         break;
  88.         /* Periodic transfer */
  89.       case EP_TYPE_INTR:
  90.       case EP_TYPE_ISOC:
  91.         len_words = (hc->xfer_len + 3) / 4;
  92.         /* check if there is enough space in FIFO space */
  93.         if(len_words > (USBx_HOST->HPTXSTS & 0xFFFF)) /* split the transfer */
  94.         {
  95.           /* need to process data in ptxfempty interrupt */
  96.           USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM;         
  97.         }
  98.         break;
  99.         
  100.       default:
  101.         break;
  102.       }
  103.       
  104.       /* Write packet into the Tx FIFO. */
  105.       USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0);
  106.     }
  107.   }
  108.   
  109.   return HAL_OK;
  110. }
复制代码







回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2020-5-13 09:08:37 | 显示全部楼层
多谢分享,困扰好久的问题,有时候需要减少代码空间采取开优化,但开优化后又会出现莫名其妙的问题,反汇编查看代码让人摸不着头脑,搞不清楚为什么会被优化成这样
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2020-5-13 09:59:29 | 显示全部楼层
遇到过高优化等级可以用,低优化反而不行。。。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
 楼主| 发表于 2020-5-13 10:15:57 | 显示全部楼层
byccc 发表于 2020-5-13 09:59
遇到过高优化等级可以用,低优化反而不行。。。

之前二代示波器的uCOS版使用优化等级1不行,其它都可以,后来发现是某个变量初始化有问题,解决了。
回复

使用道具 举报

0

主题

59

回帖

59

积分

初级会员

积分
59
发表于 2020-5-13 10:49:45 | 显示全部楼层
函数优化等级作用范围是一个函数吗?看你的例子好像只有函数头有声明,函数尾并没有标志,它不会影响其他函数吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
 楼主| 发表于 2020-5-13 11:13:17 | 显示全部楼层
zhousun 发表于 2020-5-13 10:49
函数优化等级作用范围是一个函数吗?看你的例子好像只有函数头有声明,函数尾并没有标志,它不会影响其他函 ...

对,貌似没有结束。
回复

使用道具 举报

19

主题

310

回帖

367

积分

高级会员

积分
367
发表于 2020-5-27 20:29:51 | 显示全部楼层
问题是程序很复杂,编译文件都有900KB,
怎么知道有没有问题?可能某些地方有问题,但看不出来?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
 楼主| 发表于 2020-5-27 20:41:48 | 显示全部楼层
hpxzw_foxmai 发表于 2020-5-27 20:29
问题是程序很复杂,编译文件都有900KB,
怎么知道有没有问题?可能某些地方有问题,但看不出来?

网络出问题了,USB出问题了还是显示屏出问题,这个你总可以观察出来吧。

然后在进一步锁定。如果直接无法运行,那就是前面就卡死了。
回复

使用道具 举报

19

主题

310

回帖

367

积分

高级会员

积分
367
发表于 2020-5-28 09:37:03 | 显示全部楼层
eric2013 发表于 2020-5-27 20:41
网络出问题了,USB出问题了还是显示屏出问题,这个你总可以观察出来吧。

然后在进一步锁定。如果直接 ...

就怕是都没出问题,只是影响了其中的一些判断条件,导致有些if会进不去。。。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2020-5-28 11:05:12 | 显示全部楼层
受教了。
回复

使用道具 举报

0

主题

43

回帖

43

积分

新手上路

积分
43
发表于 2020-11-25 21:20:06 | 显示全部楼层
学习了 啊哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 11:58 , Processed in 0.343215 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表