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; ..... }
這些代碼中有以下不良代碼編寫習慣:
-
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的值是否會發生改變。
- 如果發生改變了,那么這段代碼在執行過程中如果有中斷觸發結束中斷處理后就會出現一個故障,即有可能if(g_rx_index>=90)這個條件就不再成立,致PC指針不確定,從而導致編譯器崩潰而強制退出調試模式。
- 同樣的道理,之后執行的i也是存在不確定,也是有可能導致編譯器崩潰的。所以這段代碼需更改如下:
-
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 }
-
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 }
-
總結:編譯器的更新,往往意味着之前編程不良習慣的急需變革,所以我們不管是使用舊的編譯器還是新的編譯器,良好的編程習慣是程序員應該具備的基本素質。屏蔽過去的錯誤思想,發掘自身的潛在技能,編程之路才會越走越遠。