科技

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吧

讓多音源一起發聲的方法

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

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

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

AMD Cool’n’Quite 無法降速的怪問題

這兩天把新的主機裝好,開始觀察工作的情況
卻發現AMD的Cool’n’Quiet ,CPU自動降速功能偶爾會不作動
硬體環境:
CPU: AMD Sempron X2 2100+
Chipset: AMD 780G (ATI HD3200)

稍微測試了一下之後,發現是只有在”播放影片”之後,CPU就會維持在最高速不肯降回來
其它軟體(就連3D遊戲)都很正常
不管用任何播放軟體都一樣,所以排除是播放軟體的問題
不管播任何類型影片都一樣,所以也排除是codec的問題
然後,只要進入Windows的桌面內容->電源管理的頁面,一進去什麼都不用按,瞬間就又正常了

問題是出在那?….猜猜看猜猜看

Winroute和NOD32衝突的問題

重裝系統才發現Winroute會和NOD32衝突…

症狀:
Client端和安裝Winroute的電腦都無法連線。
得把NOD32移除才能恢復(只停用NOD32沒用)。

發生原因:
NOD32認為Winroute是某種奇怪的瀏覽器,
會攔截掉Winroute的連線封包。

解決方式:
每個版本的NOD32介面不同,
基本上就是在NOD32裏面找到設定例外程式的地方,把Winroute設進去就行了。

Windows移機免重灌方法

Windows 2000/XP移機,如更換主機板、作Ghost的時候,會有幾個問題:

1.電源管理模式不同:
在裝置管理員 -> 電腦底下
可以是:
.標準PC — 適用於所有電腦,無電源管理
.Advanced Configuration and Power Interface (ACPI) PC — 約P III時期的電源管理
.ACPI Multiprocessor PC — P4之後新電腦應該都會是這個
移機前最好先設成”標準PC”,否則一開機可能會出現藍畫面,連安全模式也進不去。
確定可開機後再設回對應的類型

2.IDE型式不同:
不同主機板晶片的IDE驅動不同,也會造成移機後出現藍畫面
最理想的方式是使用”MergeIDE”這個小程式來處理
網路上可找到MergeIDE的下載和說明

3.SID的問題:
如果是要作Ghost複製系統到其它電腦的話
由於每台電腦的WIndows都有一個獨特的識別碼(security ID ,SID)
必需先執行微軟的「系統準備工具」(Sysprep)後再作Ghost
否則會造成區網上SID重覆的問題
執行Sysprep後的電腦會重設SID,並且下次開機時會有一些設定的動作
Sysprep在windows光碟\suport\tools\deploy.cab中
需注意每個版本的windows都應使用對應該版本的Sysprep才行

電腦語音通訊回音(回授)處理 – 下集

前情提要:先前講到了用軟體消除回授的想法….

既然我沒事會去想到這主意,那一定有別人也沒事會去想到,所以應該找的到相關的研究或產品才對。網路上搜尋了一下,果然有不少單位在搞這方面的演算法,也可以找到一些含有回授處理功能的IC和產品。音效卡的話,像是Realtek較新的onborad音效晶片,一些視訊會議/網路電話用的免持MIC/喇叭(很難確定是否有效)等等。除了這些以外我比較有興趣的,是羅技搭載在自家webcam上,叫作RightSound的技術。

電腦語音通訊回音(回授)處理 – 上集

乖孩子們都知道,用麥克風講話的時候,如果去收到喇叭的聲音,就會產生迴音,and換個有學問點的說法就是”回授”。這在平常唱歌或是電腦上對話的時候可能還好,可是很多人一起通話時就灰熊可怕了。

例如……四個人正在連線打電動,Kat突然大叫:「大丙我掛啦!」–>三個人聽到–>然後大丙的麥克風回授了,HALO不巧也回授,而Horo根本把麥克風放在喇叭前面—>Kat就聽到三個人用自己的聲音對自己大叫:「大丙我掛啦!」–>其它三人又聽到另外兩人用Kat的聲音大叫:「大丙我掛啦!」。更不幸的是,Kat的麥克風竟然也回授!三個人又聽到Kat大叫一次:「大丙我掛啦!」…..(無限迴圈地獄)….為節省篇幅,就請各位自行repeat吧。……(可是這時候Horo又丟了一顆手榴彈)「碰!」–> 「碰!大碰!丙我碰!掛啦碰!!」—> …….(請再自行混合repeat…)

所以為了連線打電動能講話,大家只好開始戴耳麥。用耳麥的話,喇叭不響也就沒有回授的問題了嘛。不過這樣就沒理由去敗那些(沒麥克風的)高檔耳機了,而且打電動長時間戴著耳麥其實還蠻不舒服的…..。於是有人就開始偷懶,又把喇叭聲音打開,然後把耳麥拿下來掛在脖子上只當麥克風用……「碰!大碰!丙我碰!掛啦碰!!」…….喂~這樣怎麼玩下去啊?

今天突然去想到….既然喇叭的聲音是電腦自己送出去的,那他應該能判斷麥克風收到的聲音是不是跟剛才一樣,搞不好用軟體就有辦法把回授處理掉啦?

LCD偏光片

LCD偏光片…用途是貼在LCD面板正反兩面讓他產生影像,
正常人應該一輩子也不會有機會用到這玩意。

那我這麼正常的人幹麻又跑去買了啊!?

Scroll to Top