WinAVR(AVR-GCC)的奇怪問題

(這篇是從舊文章整理出來的)

GCC在compile的時候可以用-o的參數來設定optimize的程度,可設為不作最佳化(-○0),或是-o1~3和-os幾種最佳化的等級。-o0的時候是不會有什麼問題啦,不過程式不作optimize的話塞不進Tiny2313裏面。所以程式才寫到大概一半大小的時候就開始用最佳化compile,然後就發現有個地方一直很奇怪…..。
來看一小段程式:

tmp = RRR / 5 - 3; // tmp型別為int,所以不會取到小數部份
if (tmp > 5) {
  AAA = 5;
} else if (tmp < 1) {
  AAA = 1;
} else if (((RRR % 5) * 10 / 5) > 4) { // 手動四捨五入
  AAA = tmp + 1;
}

這段程式主要是要把RRR轉換成AAA 1~5的數值。RRR正常是20~40,有時會超出這個範圍,所以用了兩個判斷式去限制住讓AAA不會爆掉,就這麼簡單而已。
然後…我發現不管RRR的數值是多少,他在第一個else if的地方程式執行時總認為tmp=0,所以,判斷式就成立,結果就是AAA永遠=1。
怪吧?更怪的是在如果第一個if前面先去判斷tmp的值來看看,他會告訴你tmp不等於0…。然後才過了兩行程式,tmp就變0了。
裏面所有的變數都是宣告為signed int,跟其它變數也都沒有衝突的問題。而且只要compile的時候不要作optimize,就一切正常,所以程式本身應該是沒問題的。

結果怎麼解?我把tmp拿掉就好了…直接寫成:

AAA = RRR / 5 - 3;
if (AAA > 5) {
  AAA = 5;
} else if (AAA < 1) {
  AAA = 0;
} else if (((RRR % 5) * 10 / 5) > 4) { // 手動四捨五入
  AAA++;
}

這樣跑起來就正常了(?),看來大概這compiler討厭我的tmp吧?好吧,不去管原因了,就先加減用。結果過沒兩天我改了程式的其它不相干的地方之後,他又壞了。
這次一樣壞在第一個else if的地方,他總認為AAA = 0…最後又讓AAA變成永遠=1。 (你那麼愛讓AAA=1嗎?)

我只好再換另一種寫法:

AAA = RRR / 5;
if (AAA > 8) {
  AAA = 8;
} else if (AAA < 4) {
  AAA = 4;
} else if (((RRR % 5) * 10 / 5) > 4) { // 手動四捨五入
  AAA++;
}
AAA -= 4

把減4的動作移到最後面再作,這樣就又好了….這什麼道理?

所以…
有遇到程式跑起來很奇怪的時候,試試看先把compile optimize設成-o0吧

Initial D : Fourth Stage

最近又拿頭文字D出來複習。

話說..文太開二手Impreza去試車,在秋名巴掉86之後。
第四部第十集:

文太:「拓海,86就給你了。」
拓海:「可是老爸你要怎麼辦呢?」
文太:「我已決定要買別的車了,雖然只是輛二手的。」
拓海:「是輛怎樣的車?」
文太:「嗯,大致上算是實用又好開的吧…我也上了點年紀。」

實用又好開~讚啦!

讓多音源一起發聲的方法

如果你同時使用多台電腦,或是有像外接電視盒/MP3之類的音源設備,但只想用一組喇叭,那音源線該怎麼接?

一般都是接到切換器上…不管是多媒體喇叭上附的、KVM內建的、擴大機前級上的或是AV切換器之類的,通通都是在作切換的動作。意思就是你一次就只能聽到一個音源,這樣就不能邊看電視邊打電動,或是邊用一台電腦、邊聽另一台機器上播的音樂….。

那要讓聲音能一起發出來的話要怎麼辦?

技術很差的加油妹

早上去加油,油箱已經快到底了,平常大概得加個200左右吧。

加油妹:「120!」
丙:「怎可能120而已?」 (只加到跳槍也沒差那麼多的吧…)
加油妹:「….」(用力給他按下去)

加油機上的數字瞬間跳到200,然後….啪!…油噴的到處都是。
加油妹:「….」(拿布把油擦掉)
丙:「…..」 (算了..上天有好生之德…)
加油妹:「204!」
(拿五百給她找)
加油妹:「你有4塊嗎?」

4塊?….我還想找你要咧…

TeamSpeak Linux Server設定

.新建使用者teamspeak (login shell改為sbin/nologin)
.wget 下載teamspeak server
.解壓縮: tar –jxvf (壓縮檔名稱)
.使用teamspeak身份啟動server:
 sudo -u teamspeak /home/teamspeak/tss2_rc2/teamspeak2-server_startscript start
.查看server.log,裏面有預設的superadmin密碼
.使用web介面,登入superadmin進行設定,內定port為14534,如:
 http://team.speak.server:14534
.若要停止teamspeak server,指令為:
 sudo -u teamspeak /home/teamspeak/tss2_rc2/teamspeak2-server_startscript stop
.若要讓teamspeak於開機時自動啟動,編輯/etc/rc.local,加入啟動指令
.TeamSpeak Server內定port為8767

[電影]Epoch: Evolution

前兩天邊組電腦邊看電視,剛好在好萊塢電影台看到這部片。

Epoch: Evolution(異體大反撲 : 救亡圖存)是Epoch(異體大反撲)的續集,好像是2003年的片。劇情在演啥其實我不太清楚…..因為是邊組電腦邊看嘛,大致上就是說有個什麼外星物體跑來地球,然後各國在打仗之類的就是了。

我看的時候正好演到,中國不知道為什麼瞄準了美國的太空站,要發射三顆導彈進行攻擊。

這張截圖就是中國的飛彈系統操作介面:

好奇怪….明明是要打美國太空站,可是為啥是顯示「中國民國總統府」啊….XD
而且底下那是…寫詩嗎?
還有左邊那排MEMU…其實是職訓局派來的吧?

機車路邊攔檢

早上被路邊驗排氣的攔下來…

馬的,大爺要上班你攔個屁啊?
有種你去攔路上的汽車呀

Scroll to Top