作者:tietao 前幾天,在以前的一個修改了一些電路的板子上編寫一段新的代碼的時候,發(fā)現以前正常運行的一段程序,竟然不能正常運行了。現象很像程序死掉了,卡在某處沒有運行。但是,在以前的沒有修改過的板子上運行一切正常。 于是檢查了板子上修改的部分,發(fā)現并沒有哪些地方會影響到單片機的正常工作,甚至于讓單片機死機。而外部電路的修改,也并沒有太多。實際測量發(fā)現,之前單片機IO口為高電平,板子修改后成為了低電平。而這個端口正好是,程序中的一個中斷口。因為這個端口是低電平,使用IDE調試發(fā)現,程序一直進入這個外部中斷服務程序,其他程序沒有時間執(zhí)行。 于是,邊修改了IO口的中斷模式設置,將原來的下降沿+低電平觸發(fā)中斷的方式,修改為下降沿觸發(fā)中斷。但是,奇怪的是,一開始的竟然沒有起到作用。 感覺這樣有些不應該,于是乎又準備開始懷疑編譯器了。便查看了匯編代碼,沒有什么問題。只好,再回去看看Datasheet。突然,Datasheet上有一段話,引起了注意,“這個寄存器,只有在中斷禁能情況下,才可以設置”。突然想到,是不是自己在不滿足這個情況的條件下設置了這個寄存器,才導致了失敗。 于是單步調試看看,發(fā)現在使能全局中斷后,修改中斷方式的寄存器的條件不成立了。于是將這個設置修改到,使能全局中斷之前。發(fā)現可以了。 同時借助于,這個過程也發(fā)現了以前在定時器上的一個缺陷。是在設置寄存器時,沒有注意先后順序造成的一個現象——每次設置時 ,會觸發(fā)一次定時器中斷。正常的是,應該先設置控制寄存器,之后再設置其他寄存器。否則,設置其他寄存器的時候,有些設置會導致觸發(fā)一次定時器中斷。 而能發(fā)現這些問題,很大一部分原因在于換了新的IDE。原來的程序在開發(fā)時,由于時間緊迫,直接找了以前公司在用的IDE,但是在用的過程中發(fā)現,修改代碼,調試下載,都很不方便。甚至于,很多時候修改一次代碼,按一個Ctrl+S保存就要等待將近30S。調試的時候,一個單步運行,能運行將近1min,才結束。雖然,那個時候感覺效率很低。但是由于不了解,有什么別的IDE可以替代當前用的。而當時趕著將項目做完,也沒有去找別的IDE。于是只能忍受著。 而再次,遇到問題要調試時。果斷先找了下,發(fā)現有其他IDE同樣可以開發(fā)這款單片機。于是先安裝試試,結果下載,安裝與熟悉新的IDE花了將近3個小時。距離下班只有一個小時多一些了。 馬上建立新的工程,導入原有的代碼,進行調試。發(fā)現新的IDE的編輯效率很好,而且調試速度也很快,下載調試都有快捷鍵,這樣整個效率就高了很多。結果在下班前十分鐘,將引起這次問題的原因都找到并修改完成。 這讓我想起了《代碼大全》里有一段描述“如果完成一個項目,需要五個小時,有些人,使用效率低下的編輯器工作了五個小時;有些人,先用了4.5個小時配置好一個高效的編輯器,然后花30分鐘將項目完成。大部分人,會選擇第一種”。 |