找回密码
 立即注册
查看: 52|回复: 2

让AI来优化下I2C从机的过多的if else,改用switch

[复制链接]
  • TA的每日心情
    奋斗
    12 小时前
  • 签到天数: 166 天

    [LV.7]常住居民III

    3

    主题

    9

    回帖

    635

    积分

    高级会员

    积分
    635
    发表于 2024-5-8 15:45:49 | 显示全部楼层 |阅读模式
    1. //帮忙用switch优化下面代码
    复制代码
    1. 在优化中断服务程序(ISR)代码时,我们通常希望尽量减少在ISR中的执行时间,因为中断可能会阻塞其他中断的执行。使用`switch`语句可以提高代码的可读性,并且可能有助于减少一些不必要的条件判断。下面是使用`switch`语句优化后的代码示例:
    2. ```c
    3. void I2C_Isr() interrupt 24
    4. {
    5.     _push_(P_SW2);
    6.     P_SW2 |= 0x80;
    7.     switch (I2CSLST & 0xF0) // 只检查高四位,因为事件标志位都在高四位
    8.     {
    9.         case 0x40: // START事件
    10.             I2CSLST &= ~0x40;
    11.             break;
    12.         case 0x20: // RECV事件
    13.             I2CSLST &= ~0x20;
    14.             if (isda)
    15.             {
    16.                 isda = 0;
    17.             }
    18.             else if (isma)
    19.             {
    20.                 isma = 0;
    21.                 addr = I2CRXD;
    22.                 I2CTXD = buffer[addr];
    23.             }
    24.             else
    25.             {
    26.                 buffer[addr++] = I2CRXD;
    27.             }
    28.             break;
    29.         case 0x10: // SEND事件
    30.             I2CSLST &= ~0x10;
    31.             if (I2CSLST & 0x02)
    32.             {
    33.                 I2CTXD = 0xff;
    34.             }
    35.             else
    36.             {
    37.                 I2CTXD = buffer[++addr];
    38.             }
    39.             break;
    40.         case 0x08: // STOP事件
    41.             I2CSLST &= ~0x08;
    42.             isda = 1;
    43.             isma = 1;
    44.             break;
    45.         default:
    46.             // 可以在这里添加错误处理或者什么都不做
    47.             break;
    48.     }
    49.     _pop_(P_SW2);
    50. }
    51. ```
    52. 在这个优化版本中,我使用了`switch`语句来替代多个`if-else`语句。通过将`I2CSLST`的高四位与不同的值进行比较,可以快速地跳转到相应的代码块。这样,每个`case`块都只处理一种特定的事件,减少了代码的复杂性。
    53. 请注意,这个优化假设`I2CSLST`的事件标志位都位于高四位(即0xF0掩码)。如果这个假设不成立,你可能需要调整掩码值以匹配实际的硬件规范。
    54. 此外,我保留了原始代码中的`_push_`和`_pop_`宏,这些通常用于保存和恢复中断状态。如果你的编译器或硬件平台不使用这些宏,你可能需要替换为适当的方法来管理中断。
    复制代码
    1. switch (I2CSLST & 0xF0) 这个应该是switch (I2CSLST & 0xF8)吧
    复制代码
    1. 您是对的,我之前的代码示例中使用的掩码`0xF0`只考虑了`0x40`和`0x20`这两种情况,遗漏了`0x10`和`0x08`这两种情况。正确的掩码应该是`0xF8`,这样能够覆盖所有四种事件标志位。以下是修正后的代码:
    2. ```c
    3. void I2C_Isr() interrupt 24
    4. {
    5.     _push_(P_SW2);
    6.     P_SW2 |= 0x80;
    7.     switch (I2CSLST & 0xF8) // 使用0xF8掩码以检查START, RECV, SEND, STOP事件
    8.     {
    9.         case 0x40: // START事件
    10.             I2CSLST &= ~0x40;
    11.             break;
    12.         case 0x20: // RECV事件
    13.             I2CSLST &= ~0x20;
    14.             if (isda)
    15.             {
    16.                 isda = 0;
    17.             }
    18.             else if (isma)
    19.             {
    20.                 isma = 0;
    21.                 addr = I2CRXD;
    22.             }
    23.             else
    24.             {
    25.                 buffer[addr++] = I2CRXD;
    26.             }
    27.             break;
    28.         case 0x10: // SEND事件
    29.             I2CSLST &= ~0x10;
    30.             if (I2CSLST & 0x02)
    31.             {
    32.                 I2CTXD = 0xff; // 如果接收到NAK,发送0xff
    33.             }
    34.             else
    35.             {
    36.                 if (addr < sizeof(buffer)) // 确保没有超出buffer大小
    37.                 {
    38.                     I2CTXD = buffer[addr++];
    39.                 }
    40.             }
    41.             break;
    42.         case 0x08: // STOP事件
    43.             I2CSLST &= ~0x08;
    44.             isda = 1;
    45.             isma = 1;
    46.             break;
    47.         default:
    48.             // 可以在这里添加错误处理或者什么都不做
    49.             break;
    50.     }
    51.     _pop_(P_SW2);
    52. }
    53. ```
    54. 在这个修正后的版本中,我使用了`0xF8`作为掩码,这样可以确保所有相关的事件标志位都被检查到。同时,我添加了一个检查以确保在发送数据时不会超出`buffer`的大小。这样可以避免潜在的数组越界错误。
    55. 感谢您的指正,这有助于提供更准确的代码示例。
    复制代码


    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    12 小时前
  • 签到天数: 166 天

    [LV.7]常住居民III

    3

    主题

    9

    回帖

    635

    积分

    高级会员

    积分
    635
     楼主| 发表于 2024-5-8 16:01:23 | 显示全部楼层
    截图202405081600518318.jpg

    截图202405081601195811.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 171 天

    [LV.7]常住居民III

    10

    主题

    308

    回帖

    1140

    积分

    金牌会员

    积分
    1140
    发表于 2024-5-8 16:28:47 | 显示全部楼层
    保证可读性的话就是正向优化
    自信就会温和,温和就会坚定!
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-2 21:29 , Processed in 0.061119 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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