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