IAR for MPS430 V7.12.1 编程规范

2019年推出的升级版IAR for MSP430 v7.12.1编译器在编程上有了很大的完善,例如查询相同字符只需选择需要查询的字符,那么编译器自动查询整个文件所有的内容,并标注对应的字符。

当然,在编程过程中,这个版本也要有更加规范的编程习惯,否则,代码在调试过程中容易导致编译器崩溃而强制退出编程。下面举例说明可能会导致编译器崩溃的几行代码:

 unsigned char crc;
  s16 i,g_rx_index;
  unsigned char u8_tmp_buf[45];

   g_rx_buff[g_rx_index++]=DH_UART_Read_Char();
    if(g_rx_index>=90)
    {
      i=char_to_hex(g_rx_buff,u8_tmp_buf,g_rx_index);
      if(i!=0)
      {
        crc=cal_crc(u8_tmp_buf,44);
        if(u8_tmp_buf[44]==crc)
        {for(i=0;i<12;i++)
          {
            g_u8arr_fobid_buf[i]=u8_tmp_buf[i];
          }
          for(i=0;i<16;i++)
          {
            g_u8arr_pepskey_buf[i]=u8_tmp_buf[i+12];
            g_u8arr_rkeskey_buf[i]=u8_tmp_buf[i+28];
          }
          flag.flag2|=(f2IDESBECREATED_b11 | f2FobSignupRequest_b12);
        }
      }
      g_rx_index=0;
    }
int char_to_hex(unsigned char*input,unsigned char *output,int length)
{
    int result=1;
    int i;
    if(length%2)return 0;
    if(length==0)return 0;
    length>>=1;
.....
}

这些代码中有以下不良代码编写习惯:

  1. if(g_rx_index>=90)
        {
          i=char_to_hex(g_rx_buff,u8_tmp_buf,g_rx_index);.....} 这部分代码,我们不确定在调用函数char_to_hex(g_rx_buff,u8_tmp_buf,g_rx_index)后,g_rx_index的值是否会发生改变。
  2. 如果发生改变了,那么这段代码在执行过程中如果有中断触发结束中断处理后就会出现一个故障,即有可能if(g_rx_index>=90)这个条件就不再成立,致PC指针不确定,从而导致编译器崩溃而强制退出调试模式。
  3. 同样的道理,之后执行的i也是存在不确定,也是有可能导致编译器崩溃的。所以这段代码需更改如下:
  4.  1     unsigned char crc;
     2   s16 result,i;
     3   static s16 g_rx_index=0;
     4   unsigned char u8_tmp_buf[45];
     5 
     6     g_rx_buff[g_rx_index++]=DH_UART_Read_Char();
     7     if(g_rx_index>=90)
     8     {
     9       result=char_to_hex(g_rx_buff,u8_tmp_buf,g_rx_index);
    10       if(result!=0)
    11       {
    12         crc=cal_crc(u8_tmp_buf,44);
    13         if(u8_tmp_buf[44]==crc)
    14         {17           for(i=0;i<12;i++)
    18           {
    19             g_u8arr_fobid_buf[i]=u8_tmp_buf[i];
    20           }
    21           for(i=0;i<16;i++)
    22           {
    23             g_u8arr_pepskey_buf[i]=u8_tmp_buf[i+12];
    24             g_u8arr_rkeskey_buf[i]=u8_tmp_buf[i+28];
    25           }
    26           SRN_Init(3,BIBI_TYPE);
    27           flag.flag2|=(f2IDESBECREATED_b11 | f2FobSignupRequest_b12);
    28         }
    29       }
    30       g_rx_index=0;
    31     }
  5.  1 int char_to_hex(unsigned char*input,unsigned char *output,int length)
     2 {
     3     int result=1;
     4     int i,k;
     5         k=length;
     6     if(k%2)return 0;
     7     if(k==0)return 0;
     8     k>>=1;
     9 .....
    10 }
  6. 总结:编译器的更新,往往意味着之前编程不良习惯的急需变革,所以我们不管是使用旧的编译器还是新的编译器,良好的编程习惯是程序员应该具备的基本素质。屏蔽过去的错误思想,发掘自身的潜在技能,编程之路才会越走越远。

原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/11410680.html