2013年11月9日 星期六

[馬達控制] 200watt 的馬達控制器: drv8432

前陣子一直在忙著做一個馬達控制器。 目標是24V,10~12A。 之前最常使用的是LMD18200 這顆motor driver, 可惜這顆只有3A的驅動能力。 索性就找了一下市面上的Driver,發現TI出了一顆DRV8432, 這顆是dual H-Bridge。


這顆Driver 最大的特色是,還可以把2 channel 並聯成1個channel。 好處就是可以讓驅動能力加大。 也就是最大可以由單軸7A,並聯後可以到14A。 只要額外的電感,就可以搞定這件事了,記得要挑選合適的電感,以免電感飽和造成無法達到需求。
當然,一開始也是先製作一塊驅動板,先做測試, 好大一片。

接著就要設計屬於自己的控制器了:

有趣的是,  在還沒有送洗前,可以先變成3D,先做確認一下,真是不錯,現在的軟體愈做愈方便了。
PCBA的樣子:
因為DRIVER 需要散熱, 這次就設計了屬於我們自己的散熱片。 其實他最麻煩的因為driver IC,電感的高度並不相同,所以還要請別人CNC 、拋成可以放上去可以很合適。另外為了固定會有掉落的風險,我們還設計了一片固定座,以加強固定的強度。
最後是整個完成品的控制器。
這是配合控制器所製作的GUI 視窗介面
驗証電流的時候,  就用功率電阻來做抽載, 因為瓦數很大,所以搞得電阻都會發燙,如果沒有散熱片+風扇的話, 竟然會溫升到快200度C, 真是可怕
可惜最後實測我們的控制器只能連續載抽6~7A,  最大抽載12A 可以撐約1分鐘,但很快就會溫升,達到過溫保護了, 分析的結果就是因為板子太小,散熱的空間有限,如果還需要抽載更高的電流,就需要提供更好的散熱面積,和良好的layout,好讓driver IC的熱能可以導出來。

另外我們還製作了一台測試的機構平台,好測試控制的效果

最後,實際上整個案子大概做了半年, 加上之前的study 和討論, 大概是1年的時間。 不過這真的是一個不錯的經驗, 因為這個控制器可以讓我學到很多。

在這個案子上除了以前的控制系統之外, 還有一些新嘗試的功能。  另外把工作上學到的一切程式技巧加上專案管理, 真的是一個不錯的磨練。

2013年10月26日 星期六

[TIVA] 第一次接觸TI 的 TIVA - STELLARIS - 8組UART

最近因為一個案子的需求,需要8組的UART。 找了一下市面上有這麼多組的UART,其實不多。 目前有找到幾家:
1、 Renesas RX63N, 可惜這個UART 只有support 到100Mhz / 16 。  不然最多好像是11~12組。
2、ST STM32F4, 一開始出的MCU 只有到6組UART, 但支援到8組的 要到2013 Q3才量產,呵,來不及使用。
3、TI TIVA

因為我們需要高速的UART(5~6Mhz/bps)最後就選用了TIVA來當作解決方案了了。

首先,當然是買了一塊TIVA板子回來。



不過因為不會使用,好心的TI有課免費的課程,那我們就去上課吧。

本來以為要用CCS,結果發現因為是ARM 系列,又有支援MDK,那就選用MDK為發展的系統了。其實還滿好上手的。

研究了一下TIVA的架構,發現他的8組UART分佈如下


再來要找出在這塊開發板上面的腳位分佈了


因為手上已經沒有成品了。請見諒, 只好放成組裝完後的成品了:


不過因為這樣的板子有點大,最後只好再做一次整理了,不過後來發現,TIVA這顆IC有個地方要注意一下,他的VDDC是要接電容穩定的,這個要小心一下,如果接了VCC進去的話,可是會short的,這組電壓是要給MCU 的core使用的,大約是1.2V左右:


終於是完成品了,大約5cm x 5cm:
(因為當初把產品給了客戶了,只剩下這張照片了)

謝謝觀看。


2013年6月21日 星期五

[STM32F3 教學] USB sample code

在ST 網頁改版後,找資料就變得很麻煩,  其實就是把一堆不相關的資料擺在一起。而真正想要找到的資料又需要在其他地方找, 今天終於找到STM32F 的USB 的範例程式了。  原來是和STM32F1 擺在一起。 這樣就不用辛苦的整合程式了,  就可以直接拿現在的USB 範例來做實驗就好了。


 


以下是範例聯結:


 


 



http://www.st.com/web/en/catalog/tools/PF257434


 


 


最近想弄個SD Card的應用,  不過必需要整合 USB(mass storage)/SDIO(SD card)/FFS(FAT file system),目前卡在FFS,等成功後再和大家分享。   然後再弄一個LCD的話,  就真的可以考慮做一台簡單的示波器了。


 


B/R


2013年6月10日 星期一

[C語言] GOOGLE CODE

最近筆者發現GOOGLE CODE ,應該是一個不錯的程式控管中心。


以後就可以靠著Google code 與大家來分享程式


不然google drive 早晚會有空間不足的危機。


 


這邊有一個簡單的教學


 


還記得之前有介紹過SVN的文章嗎?


 


測試專案:


 


http://afrodevices.googlecode.com/svn/trunk


 


希望大家玩的愉快。


 


我們以這個專案來說:


https://code.google.com/p/maze-solver/

 


除了擁有Project 的介紹: 還可以下載/wiki/issue 討論,


最後還可以連結到ohloh的資料統計頁面上:


 


 


 


http://www.ohloh.net/p/MicroMouseSim

 


這實在是太強大,且好用了。


2013年6月7日 星期五

[STM32F3 教學] USB CDC(Virtual COM port) 測試/範例程式

終於把STM32F3的 virtual COM port 搞定了。


 


有興趣的話可以下載範例程式回家玩一下:


https://docs.google.com/file/d/0B2FFxTDyyRQAX3ZmaEszT0xCZ0U/edit

 


 


driver:


https://docs.google.com/file/d/0B2FFxTDyyRQAcWZidFNWNTB0Ulk/edit

 


 


目前是使用PA9 --> TX  ,  PA10--> RX 。  最簡單的測試就是把TX/RX 短路就行了


 



 


如果不想要這樣的應用,只想把資料做處理的話。 


 


傳到電腦端的資料要call 這幾個副程式:


    UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
    SetEPTxCount(ENDP1, USB_Tx_length);
    SetEPTxValid(ENDP1);


 


從電腦端的資料要從EP3_OUT_Callback() 這裡找。


電腦端的資料下來會由USB_SIL_Read() 這支副程式在幫忙處理。


 


 


希望對大家有幫助。


2013年5月30日 星期四

[文章文享] 有生產力的人會做的8件事

早上筆者看了一篇文章,覺得很值得拿來和大家分享:商業週刊 - 有生產力的人會做的8件事


裡面有些事筆者非常的認同:


1、休息: 筆者是標準的作息正常的人,熬夜真的做事沒有比較有效率, 也會讓之後的幾天造成困擾,作息正常是很重要的。


2、代辦清單: 這件事也滿重要的, 因為要列出To do list,才知道到底有多少事要做, 而先後順序應該也要列一下。 


3、80/20法則: 這件事和寫程式是一樣的,程式有時候為了讓維護方便,寫了很多看似不必要的部分,但這往往都是維謢程式上,非常方便的。  而有些簡單的動作, 就花一些精力寫點簡單的tool來幫助自己,不過往往寫tool是要花時間的,但長久來看,利絕對大於弊。


 


給大家做參考。


 


專業很重要,不過做人處事更重要的。


[C#] ZedGraph 外掛模組

筆者有時也會寫簡單的人機介面如VB/VC++/VC#,但後來覺得可能會盡量的轉到C#這邊。 其實因為範例C#有愈來愈多的趨勢,所以會以這個為主。 介紹大家一個繪圖上好用的外掛模組, 使用方式可以參考國外網址:How to use ZedGraph, 筆者很多人機介面都是利用這個模組來實現的。


 


以下就是一個未來打算製作一個簡單的示波器所做的人機介面: 敬請期待。


 


 


 





 


2013年5月29日 星期三

[C語言] code review

最近筆者的朋友在分享一篇文章 - 我的code review 經驗談


平常筆者的工作上也不常有code 的review這件事,其實平常的工作就很忙了,真的沒有空做這件事。


不過因為上班常常需要接觸別人寫的code,所以常常可以接觸廠商或是其他人寫的code,所以常常可以比較不同寫法所造成的效果,或是別人寫這些code背後的想法。雖然都是做類似的事,但工作如果可以在其中找到樂趣,其實也比較不會那麼的枯燥乏味。


不過以前筆者的實驗室常常因為要考量到整體演算法的效率,所以常常在檢討如何寫code才會最有效率,雖然那時候可能在已知的範圍內做到效率最高,但有做過這件事,在寫程式的思考模式真的就不太一樣。至少會考慮程式應該怎麼寫才會比較「好」 -  不管是效率就是易閱讀。


 


以前實驗室的boss常常說:優化,也必需知道有多少種方法,當你知道愈多,做的優化才會是極大值。


還是鼓勵大家,多多閱讀別人的專案(程式),多多和別人討論,這絕對是進步的不二法門。


 


希望對大家有幫助。


2013年5月28日 星期二

[STM32] 資料整理/分享

在ST的網頁大改版後,有些資料真的不太好取得,也不知道要去那裡找。還好平常筆者有做備份的習慣,不然這一個大改版後,還真的不太習慣那些資料應該去那裡下載了。  因為現在有了GOOGLE DRIVE,所以就把資料整理整理, 上傳上雲端,分享給有需要的人使用。


裡面有放上幾個ST的STM32系列的MCU常用的SPEC與Discovery 的範例程式,通常都是SPEC/User manual/ Programming manual 相關的資料。


 


 另外在外面的幾個執行檔就是ST/LINKER和KEIL 的安裝檔。


 


路徑:


https://drive.google.com/?usp=chrome_app#folders/0B2FFxTDyyRQAbTNmclU0OXlFeUk

 


希望對大家有幫助。


2013年5月25日 星期六

[工商時間] 簡易電源供應器 power supply

        因為筆者平常在家做的實驗都是興趣外加part time 但有時候需要一些工具,但又覺得很不方便,因為控制馬達需要比較大的電源輸出,所以當只有電腦USB 5V就顯得不是很夠力了,突然筆電的變壓器從眼中一閃而過,所以設計了一個簡單使用的電源供應器模組,只要配合NB的電源供應器,就可以做輸出了。










出貨時,板子上會提供2DC母座,筆者的經驗是都插得進去,只是鬆和緊的問題。至於留了3DC母座,是因為有些舊型的NB電源供應器是更小的DC母座,保留給其他人做DIY使用。










這是機構圖:













 


單純電源模組






電源模組 +  NB 變壓器



2013年5月24日 星期五

[電腦鼠/自走車] 第9屆人工智慧電腦鼠研習營講議聯結

這個比賽不知不覺已經來到了第9屆了。雖然筆者都有去參加,但後來一直沒有分享在我的blog上,幫忙追蹤一下進度,分享給有興趣的人知道。 雖然我的blog 已經很久沒有更新電腦鼠/自走車的文章了,但筆者仍舊是莫莫的關心這個賽事,也希望大家可以繼續保持對這個比賽的熱忱。


 


在去年第8屆的時候,台灣的電腦鼠/自走車,其實都已經算是世界上的佼佼者了, 在大家的切磋努力下,慢慢的進入佳績了。也希望後進者不要太喪氣,「堅持」,成功是是需要有信念的, 要有永不放棄的精神,相信每個人都可以在自己的領域下,得到一片天空的。  雖然比賽是很殘酷的,但在比賽中的酸甜苦辣是沒有辦法用名次可以形容的。  就讓大家好好品嘗一番。


2012 日本電腦鼠大賽:


文章分享


佳績


 


 


 


在此祝大家電腦鼠/自走車可以順利完成比賽,也能有所收獲。


最後附上講議聯結:


第9屆人工智慧電腦鼠研習營講議


 


更多資料可以上官方FB粉絲團:


人工智慧單晶片電腦鼠暨機器人競賽 Taiwan micromouse and intelligent robot contest


 


論文參考:


 


電腦鼠的設計與實作


迷宮電腦鼠硬體設計


電腦鼠迷宮演算法


智慧型機器人教學平台-以四輪電腦鼠為例


高速電腦鼠機器人之設計與實作


 


 


2013年5月23日 星期四

[書籍分享] Make Taiwan 國際中文版

最近同事拿了一本Make Taiwan的書籍給筆者參考看看。本來還以為這是在玩樂器, 結果內容是DIY動手做,而控制器是用arduino , 這本書是季刊,筆者覺得這本是一錯不錯的靈感來源


  國際中文版  -  FB粉絲團


 


因為是季刊,1年期4本約1200元。  心動ing~


 





2013年5月22日 星期三

[STM32F3 教學] (MDK)Keil option 巨集



因為上一篇有在教大家使用多重專案的建構方式。這次要教大家,巨集的使用方式, 當我們把多重專案建立完成後,可以如下圖的設定方式,在option加入一個巨集,這樣我們程式在操作的時候,其實也會滿有彈性的。















      #ifdef PROJECT_UART



      printf("This is UART for
Project\n\r");



      #else



     printf("This
is RS232 for Project\n\r");



      #endif







大家可以比較看看,rs232」和「uart」這2個專案,所跑的程式為何,當大家學會了一些小技巧後,在維護專案上,應該就可以更得心應手了。



範例程式下載:

https://docs.google.com/file/d/0B2FFxTDyyRQAaVFyQWhhMzZyMTA/edit

2013年5月16日 星期四

[STM32F3 教學] USB HID 測試/範例程式



由於這次的ST網頁大幅度的改版,所以有些資料也就還沒有辦法在ST的網路上找到,這次的STM 32F 3一直找不到USB的範例程式,所以只好拿出從STM 32F 10xUSB HID範例,外加MicrochipPC端的範例程式,簡單做出一個可以利用USB HID來做通訊的範例,希望對大家有幫助。




 




PC端範例程式來源Microchip total solution: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784


 




 




筆者整理的STM 32F 3
Discovery USB HID Costumer
範例網址:




https://docs.google.com/file/d/0B2FFxTDyyRQAMXM2SVluVzU4djA/edit


 




 




範例說明: 利用TOGGLE LEDBUTTON來改變STM 32F 3DEMO模式。 GET BUTTON STATUS用來取得USER BUTTON是否有被壓下。




 


PS: 下次有空來做看看HID的簡易示波器, 不知道效果如何……  有好消息再和大家分享。





2013年5月14日 星期二

[STM32F3 教學] (MDK)Keil 多重目標設定方法



現在MCU的進步實在是太快了,常常一年出了數十套MCU也不是很奇怪的事,但有沒有一個好方法,讓我們可以快速的抽換MCU的底層而不要更改應用層呢?



Keil其實就有這種貼心的方法,只是因為現在很少人在教keil的設定了,所以只好花點時間來研究一下。 筆者以8051為範例,記得要使用uVision2或是uVision3的版本來做實驗。 uVision其實設定是一樣的,但因為build的問題,所以筆者才選擇了8051做為範例。



選擇「setup file expantions。











新增一個target,並更改名稱。並加入另一個檔案,uart.c









選擇檔案的屬性。






include target build」和「always build」不要打勾。








我們會看到這個file,就會出現以下特殊的符號。代表這個target並不會build這個file





知道設定的方法後,我們如法泡製「RS232」這個Target,將UART.C 設定成不自動BUILD








這樣我們就可以很容易的操作2FILE在同一個KEIL下,以後自己的專案就設定成不同的MCU設定和相關檔案,這樣就可以很容易的抽換整個LIBRARY或是MCU底層了。值得注意的是,當產生了新的Target後,記得要去對這個Target重新設定所有相關的屬性(Options for target),包含:device/target/ouput……等。




以下是聯結,有興趣的話,可以下載回家玩一下。

https://docs.google.com/file/d/0B2FFxTDyyRQASHpqUjQzOTgzaTg/edit


再次強調:記得要使用uVision2或是uVision3的版本來做實驗

2013年5月13日 星期一

[Renesas] 62N開發板



最近有人贊助了一塊Renesas RX26N的開發板給我,簡單的看了一下,這一塊板子似乎功能還滿強的,找個時間有機會再來玩看看吧。聽說Renesas在某些領域還滿吃重的。不過對於喜歡DIY的人來說,容易取得的IC/開發板和Sample code,才是最另人心動的。




如果有興趣這塊板子的話,可以找我討論看看,或許可以幫大家購買看看,不過代理商似乎覺得這塊板子量不多,「交朋友」的心態居多。


 






[C語言] 工具的準備



通常寫簡單的小程式,用原廠提供 IDE tools 就會很好用了, 但當今天要維護大專案或是閱讀別人的程式時,這時候簡單的IDE就顯得不太夠用,或者是不太好用……




 




以筆者為例,大概會準備幾套常用的軟體,大概就可以通殺所有的專案了:




 




一、檔案/檔案夾比對軟體,Beyond Compare 這是一套用來比較2個檔案或是2個資料夾內,不同之處。 常常我們需要比對此版韌體和上一版韌體有什麼不同,用這個軟體來幫忙,就可以很快的找出差異性了。




 




二、程式編輯軟體,Source Insight 這是一套非常方便閱讀程式的軟體,他可以自動找出變數/副程式相關的地方,並可以整出結構來,方式編輯與閱讀。




 




三、程式編輯軟體,Ultra Edit 這是一套強大的文字編輯軟體,有些binary和大量的文字要處理的話,也可以利用此套軟體來幫忙。




 




四、版本控制軟體,Mercurial 這是一套分散控制的版本控制軟體,如果習慣了SVN(中央控制版本控制軟體),也可以試著改換這一套,筆者我覺得這對小型的專案來說,非常好用。




 




其他推薦軟體:




 




一、              
數學運算軟體,Freemat 一套相容於matlab的免費軟體,有在使用matlab的可以考慮使用。




二、              
版本控制軟體,GIT 一套比mercurial 更強大的版本控制,大型的專案就會使用這套軟體。




三、              
IDE軟體,Eclipse 一套整合非常多功能IDE軟體,很多開發商也慢慢加入Eclipse的行列。




四、              
專案管理軟體,Trello: 一個線上專管管理的軟體。滿適合meeting使用的。




 




如果有什麼也是不錯的軟體的話,也可以推薦給我做參考。





2013年5月11日 星期六

[C語言] 簡單的程式技巧 - 4



        今天碰巧有人分享了一個邪惡C語言寫法,坦白說,做為一個優秀的程式工程師是要讓程式寫得好維護,而非把程式寫得像神一般另人無法抓摸才是,也就是今天就算寫出一個執行效率一百分的程式,但卻沒人看得懂的程式,那也是枉然,所以當今天遇到了執行效率和維護上(好不好懂)的取捨上, 筆者一定盡量的選擇後者,畢竟現在不管是CPU或是MCU的效能都愈來愈好了,有時候損失一點效率換來維護上的彈性和閱讀性,那麼也是值得的。




 




如果有興趣的話,可以參考一下以下的網址:「http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/」。 最後,這也是告訴大家,把程式寫得屌很帥,事實上反而是另人困擾的,而寫得淺寫易懂的程式,這也是筆者一直在努力研究的方向。



2013年5月10日 星期五

[C語言] 簡單的程式技巧 - 3



        其實做一個寫程式的人,除了自己動手「寫」程式以外,閱讀別人的程式也是常常需要的,所以在閱讀程式之前,如果可以事先知道一些隱藏式的規則的話,這樣在閱讀上是可以達到事半功備的。




        有一派人很喜歡使用匈牙利命名法「http://www.csie.nctu.edu.tw/~skyang/simonyi.zhtw.htm」來取變數名稱:


這樣的命名法是有好處的,就是當今天我們在看變數時,只需要看到他的prefix前綴詞時,你就可以知道這個變數的型態了,但缺點是當你在維護專案時,需要變更一個變數的型態,通常就覺得這個命名規則很麻煩。




 




舉例來說:




 




unsigned char bTest;




 




當我們在看bTest 時,就知道這是一個BYTE的型態了。




 




筆者我不是很喜歡用匈牙利命名法,因為要修改變數時,就會很痛苦了,但有2prefix前綴詞還滿推薦使用的。




 




m/m_: class/struct 內的member 成員。




g/g_ global變數




 




舉例:




 




int gTest;




 




當我們在看gTest時,就知道這是一個全域式變數了。




 




如果可以了解一些特定的潛規則的話,在閱讀程式上是非常有幫助的。還是老話一句,多聽多看多寫,經驗就會愈來愈老道了。




 




 





2013年5月8日 星期三

[C語言] 簡單的程式技巧 - 2



筆者以前寫程會在沒有規劃好就開始寫了,所以就需要寫很多註解來幫助自己的記憶,當然,沒有寫註解的下場就是每次遇到問題時,就還要再「複習」一次。




舉個例子來說:




 




int test_a, test_b, test_c;




if ( test_a == 1)




{




        test_c
= 1; // go to eat




}




else if ( test_b == 1)




{




        test_c
= 2;       //
go to drink




}




else




{




        test_c
= 0;       //
to do something




}




 




        其實這樣寫並沒有問題,只是說程式寫完後,需要額外的註解,但如果我們在一開始就設定好了有意義的名稱,這樣就可以省下一些註解的說明了。




 




#define BEHAVIOR_TO_DO_SOMETHING     0




#define BEHAVIOR_GO_TO_EAT                    1




#define BEHAVIOR_GO_TO_DRINK                2




 




int Hunger, Thirsty, Behavior;




 




if ( TRUE == Hunger)




{




        Behavior
= BEHAVIOR_GO_TO_EAT;




}




else if ( TRUE == Thirst)




{




        Behavior
= BEHAVIOR_GO_TO_DRINK;




}




else




{




        Behavior
= BEHAVIOR_TO_DO_SOMETHING;




}




 




原則上就是養成習慣,把寫程式當作是在寫作文的話,那麼寫起來的程式就會比較有人性化一點,也不需要寫一大堆的註解,導致整個版面非常的「擁擠」,讓真正的註解,可以一目了然。




 




有人問我,寫程式的技巧如何才會進步,其實這個答案是沒有絕對對與錯的,但方法是有的,就是多看看別人寫的code,對自己總是有幫助的,建議可以去MCU廠所提供的範例程式,好好參透一番,這樣肯定會有收獲的。





2013年5月7日 星期二

[C語言] 簡單的程式技巧



筆者在就學時,讀的是電子工程而不是資訊工程,所以在寫程式上,其實還是和所謂資工系的高手有一段落差,這在上班時,會有很明顯的認知,尤其是在分工清楚的公司,更甚明顯。不過畢竟術業有專攻,大家也別太枉自匪薄,只要多看,注意一些小細節,總是會有機會的。




以寫程式為例,電子工程相關的人的心態是:
可以動就好。而資訊工程講求的是程式的高閱讀性和維護性。所以今天我們要探討的就是如何讓程式保有高閱讀性和維護性。




以下是一個非常簡單的程式,或許compiler 不會過,但只要抓到重點就可以了:




if(test_flag1==1){




        test_data=1;




}




else if(test_flag2==0){




        test_data=2;




}




else{




        test_data=0;




}




 




        以上的程式,盡可能的讓程式碼「擠」在一起,雖然版面可以塞得下較多的程式,但因為都滿擠的,當程式看久了,常常會讓眼精非常的吃力。而且如果不了解數值的內容的話,閱讀上就會很辛苦。大家不仿可以試試看下面的寫法:




 




        #define
TRUE                1




        #dfeine
FALSE              0




 




        #define
FRUIT_APPLE         0




        #define
FRUIT_BANANA    1




        #define
FRUIT_GRAPAS     2




 




        if ( TRUE == test_flag_1)




        {




                test_data
= FRUIT_BANANA;




        }




        else if ( FALSE == test_flag_2)




        {




                test_data
= FRUIT_ GRAPAS;




        }




        else




        {




                test_data
= FRUIT_ APPLE;




        }




 




 




        不知道個位客倌有沒有覺得上面的寫法比較容易閱讀且容易維護,(謎之音: 你虎爛。) 沒關係,
就讓筆者慢慢解說上面的程式有幾件事的差別。




 




 


 





差別1:擠在一起常常會有搞混的情況發生,盡可能的讓程式中間穿插空白,增加閱讀的方便性。






差別2 盡可能的讓常數使用巨集(#define)的方式,定義一個有意義的名稱。


        這邊要有2個地方值得注意:




(a)常數最好使用大寫的英文,因為這是一個不成文的規定,所以以後你在閱讀別人的程式時,遇到大寫時,第一直覺就可以知道這是「常數」。




(b)相同的巨集,最好前面帶有一個表示相同類型使用到的英文,以避免亂用巨集的情況發生,導致閱讀的混亂(就是呼叫到不該呼叫的巨集)




差別3,大括號({ }  最好分2行, 因為有專案開發時,常常會遇到需要把判斷式省略或是做測試使用。
舉個簡單舉子:如果我要讓test_data
永遠都只會是” FRUIT_
APPLE”
的話, 那麼這時候我會這樣做:




 




        #if 0




if ( TRUE == test_flag_1)




        {




                test_data
= FRUIT_BANANA;




        }




        else if ( FALSE == test_flag_2)




        {




                test_data
= FRUIT_ GRAPAS;




        }




        else




        #endif




        {




                test_data
= FRUIT_ APPLE;




        }




 




這樣的好處就:




(a)   
非常好加入巨集的維護,而且可以很方便的啟用(enable)與關閉(disable)




(b)  
如果有版本控制軟體的話(SVN/Mercurial/GIT),在比較程式不同時,只會發現多出來的巨集(#if 0/ #endif),這在專案維護上非常重要。




 




差別4 
判斷式的寫法:




 




        if (
TRUE == test_flag_1)
if (test_flag_1 == TRUE)




建議遇到常數時,盡可能的養成常數寫在判斷式的左側,以防止筆誤造成的除錯上的困難。




(a)                 
if (test_flag_1 0 = TRUE)
ç 筆者不小心寫錯,但這樣compiler會過,而且會永遠成立,因為判斷式非0即真。




(b)                 
( TRUE = test_flag_1)
ç 筆者不小心寫錯,但這樣compiler會出現錯誤。因為常數沒有辦法被設定成另一個數值。




 




這個是一個非常重要的小技巧,可以防止筆誤的機率。




 




以上分享給大家知道,並且歡迎大家討論。


 


 


 





感謝沒事才做木工大大的提醒,在寫這篇文章的時候,到是沒有認真思寫這裡的變數使用方式,假設變數都只有TRUE或是FALSE的話,那麼到是可以換個方式寫:





if ( test_flag_1)


        {


                test_data
= FRUIT_BANANA;


        }





        else if ( !test_flag_2)


        {


                test_data
= FRUIT_ GRAPAS;


        }


        else


        {


                test_data
= FRUIT_ APPLE;


        }




其實有時候在寫程式時,也是希望可以讓程式短一點,這樣可以少寫一點或是讓版面可以更精簡一點。