PIXNET Logo登入

傑克的下午茶

跳到主文

把手放在我手上,讓我帶妳找到一生的幸福

部落格全站分類:生活綜合

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 10月 03 週五 200810:53
  • 變更網路卡IP for WinCE

想要用程式來變更WinCE的網路卡IP,微軟可能認為嵌入式系統的網卡IP在設備安裝後就不會更動,原因未知,但就是未提供方便API方便修改,因此想要更改IP就必須從修改Registry註冊表下手。

首先,要修改網卡IP就必須先知道網卡資訊在註冊表的位置與CreateFile時需要用的設備名稱。對於「設備名稱」,若系統只有單一網卡通常都會是"NDS0:",若是多張網卡就要找該網卡的Index了,沒錯,就是到BuiltIn區找驅動程式的設定,到下面位置取得下列兩參數:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\網卡名稱]
   "Prefix"="NDS" 
   "InstanceIndex"=dword:1 

NDS代表的是網路設備,例如串列設備是COM,不同的網卡是用不同的InstanceIndex做區隔,此兩參數組起便是設備名稱,此範例為NDS1:。找到設備名稱同時也會確定網卡名稱,這裡稍為提點一下,網卡名稱有可能會多層,如"CS89001"、"PCI\RTL81391"。

 

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(4) 人氣(3,561)

  • 個人分類:系統開發經驗與心得
▲top
  • 10月 02 週四 200817:16
  • 嵌入式系統之WatchDog Timer

【簡介】嵌入式系統應用很廣泛,無論家庭生活至工業生產都能有其應用範圍,對於家用而言,系統正常工作並非必要,不穩至停板只要一個Reset紐就可以解決,但對於工業應用而言,任何不正常的控制命令都可能導致重大損失。因此以「正常工作」是首要條件,「WatchDog Timer」這無時無刻監視著系統的小狗便是一個直接有效的工具,當系統遲緩或停擺時,可立刻發現並執行必要的工作。

【觀念】從軟體開發者的角度而言,「WatchDog Timer」就是一個倒數裝置,當時間倒數至0就會執行一內定工作,一般是給予Reboot,所以,程式必須在倒數結束內必須給予Strobe,告知狗狗程式還正常運行,狗狗將會恢復倒數時間重新倒數,如此週而復始的監視系統。

【實現】當然WatchDog這樣簡單的程式邏輯用一個高優先的執行緒便可搞定,但對於「監視」這樣重要的工作我是比較喜歡硬體中斷,在硬體上能選擇有此功能最好。在此以硬體WatchDog Timer為範例。

控制命令相當簡單,只需用CreateFile與DeviceIOControl配合IOCTL code即可,開啟方式:

m_hWDT = CreateFile(_T"WDT1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(3) 人氣(17,309)

  • 個人分類:系統開發經驗與心得
▲top
  • 9月 28 週日 200815:09
  • [吃]豐原‧梨子咖啡館

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(0) 人氣(2,610)

  • 個人分類:休閒與攝影
▲top
  • 9月 27 週六 200823:54
  • 東豐綠色走廊

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(0) 人氣(1,124)

  • 個人分類:休閒與攝影
▲top
  • 9月 26 週五 200819:22
  • 遭遇0xC0000005錯誤

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(2) 人氣(20,976)

  • 個人分類:系統開發經驗與心得
▲top
  • 9月 25 週四 200811:13
  • 多執行緒之死結(DeadLock)問題與避免

當多個執行緒在共用變數的時候,首要小心遇到死結問題,基本發生原因為其一執行緒Lock住變數,導致其他執行緒無窮境的等待,想起來似乎不容易發生,確實當整個程式只共用一組變數,這種問題很容易避免,但若在同一時間內到兩個以上的變數,這種死結是很容易發生的,以下簡單的範例 。

範例:

下兩個執行緒的程式碼,其中含有兩個將共用的物件 Object_A 和 Object_B:

 

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(2) 人氣(6,756)

  • 個人分類:系統開發經驗與心得
▲top
  • 9月 23 週二 200810:31
  • 開發WinCE的偵錯方法

連接至WinCE偵錯方法:

WinCE設備的設定

  1. 到安裝VS.NET的電腦中的 C:\Program Files\Common Files\microsoft shared\CoreCon\1.0\Target\wce400 裡面,選擇你用的CPU,如x86,到該資料夾裡面,將相關檔案複製一份到WinCE裝置任意資料夾下。
  2. 開啟你的Windows CE裝置,用「檔案總管」到複製檔案的地方,先執行"ConmanClient2.exe",之後執行"CMAccept.exe",這兩個直行後都是沒有介面會跑出來的,所以確定有去執行它就可以了。

 

VS.NET的設定

(繼續閱讀...)
文章標籤

傑克鼠 發表在 痞客邦 留言(0) 人氣(1,278)

  • 個人分類:系統開發經驗與心得
▲top
  • 9月 22 週一 200811:12
  • .NET資源回收IDisposable介面

最近敝人在WinCE-based上開發的模組越來越龐大,另一方面是IO處理頻繁,執行一兩天就會因資源不足導致Shutdown。沒錯,資源對於WinCE而言一直都是相當棘手的問題,畢竟WinCE的記憶體和虛擬記憶體空間都不像桌上型電腦龐大,可以想怎麼用就怎麼用。因此,當我們針對WinCE模組設計時,除了程式資源分配盡量優化外,更重要的是需考慮其模組資源上的使用與釋放,如此的系統才能經的起長時間的考驗。以下是網路一篇文章,我覺得很淺顯易懂,在此就暫時引用一下這位高手的文獻,供大家參考:

 

(作者:史帝芬)


    .Net framework和Java VM一樣針對一般資源會自動回收,對於
unmanaged的資源,Java會於finalize
做處理,語法上C#和C++相同,作法上則和Java相同,都是交給VM處理。
事實上,C#也有個Finalize method,這個method與Java的finalize相同,於物件將被回收時會被
VM呼叫。C#的編譯器在編譯時實際上會將解構子轉換成Finalize的覆載method,如下所示。


class MyClass
{
~MyClass() { ... }
}
會轉換成:
class MyClass
{
protected override void Finalize()
{
try { ... }
finally { base.Finalize(); }
}
}



  • 解構子


        C#提供了與C++一樣語法的解構子,當object消失時,.Net framework
    會執行解構子,我們可於此時加入程式進行資源回收,與Java相同的是,什麼時候object會消失?
    這由VM決定,並非在object變成null時,VM即會立刻執行解構子並回收object。底下範例程式1.1可以看出,.Net framework
    會先建構父類別再建構子類別,解構時則會以反方向,先解構子類別,再解構父類別,特別注意的
    是,解構子不需由程式呼叫,.Net framework會自動執行。

        如果要強迫.Net framework資源回收,可以使用如範例程式1.2的方法,
    以GC指令強迫.Net framework資源回收,並使用WaitForPendingFinalizers method等到確實回收後
    再繼續執行,因為資源回收時是在另一個thread之故。



    * 範例程式 1.1


    using System;

    namespace Garbage
    {
    class Father
    {
    public Father()
    {
    Console.WriteLine("建構 Father");
    }

    ~Father()
    {
    Console.WriteLine("解構 Father");
    }
    }

    class Son : Father
    {
    public Son()
    {
    Console.WriteLine("建構 Son");
    }

    ~Son()
    {
    Console.WriteLine("解構 Son");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("程式開始");
    Son me = new Son();
    me = null;
    Console.WriteLine("程式結束");
    }
    }
    }

    * 執行結果 1.1


    程式開始
    建構 Father
    建構 Son
    程式結束
    解構 Son
    解構 Father




    * 範例程式 1.2


    using System;

    namespace Garbage
    {
    class Father
    {
    public Father()
    {
    Console.WriteLine("建構 Father");
    }

    ~Father()
    {
    Console.WriteLine("解構 Father");
    }
    }

    class Son : Father
    {
    public Son()
    {
    Console.WriteLine("建構 Son");
    }

    ~Son()
    {
    Console.WriteLine("解構 Son");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("程式開始");
    Son me = new Son();
    me = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Console.WriteLine("程式結束");
    }
    }
    }

    * 執行結果 1.2


    程式開始
    建構 Father
    建構 Son
    解構 Son
    解構 Father
    程式結束



  • 實作IDisposable介面

        IDisposable介面僅有一個method -- Dispose,實作IDisposable
    介面後,在using中.Net framework將會自動呼叫Dispose method回收資源,如範例程式 2.1
    所示。但是由執行結果2.1各位是否看出端倪? .Net framework只呼叫子類別的Dispose method
    卻沒有呼叫父類別的Dispose method,所以,實作IDisposable介面時,父類別的資源回收要
    由子類別呼叫,請看範例程式2.2。


        範例程式 2.3是讓各位了解,實作IDisposable介面在using中.Net
    framework會自動呼叫Dispose method進行資源回收,但是在一般狀況下並不會。需要程式自行
    呼叫Dispose method或是改成如範例程式 2.4所示,其中GC.SuppressFinalize(this)是通知
    .Net framework不要再對這個object進行資源回收,如果不這麼做,當主程式中自行呼叫Dispose method,
    .Net framework又於object消失後執行解構子,會造成Dispose method重複執行。



    * 範例程式 2.1


    using System;

    namespace Garbage2
    {
    class Father : IDisposable
    {
    public Father()
    {
    Console.WriteLine("建構 Father");
    }

    public void Dispose()
    {
    Console.WriteLine("解構 Father");
    }
    }

    class Son : Father, IDisposable
    {
    public Son()
    {
    Console.WriteLine("建構 Son");
    }

    new public void Dispose()
    {
    Console.WriteLine("解構 Son");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("程式開始");
    using (Son me = new Son())
    {
    Console.WriteLine("程式執行中");
    }
    Console.WriteLine("程式結束");
    }
    }
    }

    * 執行結果 2.1


    程式開始
    建構 Father
    建構 Son
    程式執行中
    解構 Son
    程式結束

    * 範例程式 2.2


    using System;

    namespace Garbage2
    {
    class Father : IDisposable
    {
    public Father()
    {
    Console.WriteLine("建構 Father");
    }

    public void Dispose()
    {
    Console.WriteLine("解構 Father");
    }
    }

    class Son : Father, IDisposable
    {
    public Son()
    {
    Console.WriteLine("建構 Son");
    }

    new public void Dispose()
    {
    Console.WriteLine("解構 Son");
    base.Dispose();
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("程式開始");
    using (Son me = new Son())
    {
    Console.WriteLine("程式執行中");
    }
    Console.WriteLine("程式結束");
    }
    }
    }

    * 執行結果 2.2


    程式開始
    建構 Father
    建構 Son
    程式執行中
    解構 Son
    解構 Father
    程式結束


    * 範例程式 2.3 (僅有主程式,其餘請參考2.2)


    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("程式開始");
    Son me = new Son();
    me = null;
    Console.WriteLine("程式結束");
    }
    }

    * 執行結果 2.3



    程式開始
    建構 Father
    建構 Son
    程式結束


    * 範例程式 2.4


    using System;

    namespace Garbage2
    {
    class Father : IDisposable
    {
    public Father()
    {
    Console.WriteLine("建構 Father");
    }

    public void Dispose()
    {
    Console.WriteLine("解構 Father");
    GC.SuppressFinalize(this);
    }

    ~Father()
    {
    Dispose();
    }
    }

    class Son : Father, IDisposable
    {
    public Son()
    {
    Console.WriteLine("建構 Son");
    }

    new public void Dispose()
    {
    Console.WriteLine("解構 Son");
    GC.SuppressFinalize(this);
    }

    ~Son()
    {
    Dispose();
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("程式開始");
    Son me = new Son();
    me = null;
    Console.WriteLine("程式結束");
    }
    }
    }

    * 執行結果 2.4


    程式開始
    建構 Father
    建構 Son
    程式結束
    解構 Son
    解構 Father




  • (繼續閱讀...)
    文章標籤

    傑克鼠 發表在 痞客邦 留言(0) 人氣(2,826)

    • 個人分類:系統開發經驗與心得
    ▲top
    • 9月 21 週日 200811:01
    • 維繫感情的觀念

    這篇是生活網看到的,我是覺得有些觀念滿值得彼此學習的
    就轉貼一下摟:


    你發覺到了嗎?
    愛的感覺,總是在一開始覺得很甜蜜,
    總覺得多一個人陪、多一個人幫你分擔,你終於不再孤單了,
    至少有一個人想著你、戀著你,不論做什麼事情,只要能在一起,就是好的..........
    但是慢慢的,隨著彼此的認識愈深,你開始發現了對方的缺點,
    於是問題一個接著一個發生,你開始煩、累甚至想要逃避,
    有人說愛情就像在撿石頭,總想撿到一個適合自己的,
    但是你又如何知道什麼時候能夠撿到呢?她適合你、那你又適合她嗎?

    其實,愛情就像磨石子一樣,或許剛撿到的時候,你不是那麼的滿意,
    但是記住人是有彈性的,很多事情是可以改變的,
    只要你有心、有勇氣,與其到處去撿未知的石頭,
    還不如好好的將自己已經擁有的石頭磨亮磨光,你開始磨了嗎?

    很多人以為是因為感情淡了,所以人才會變得懶惰。
    錯!其實是人先被惰性征服,所以感情才會變淡的。 

    在某個聚餐的場合,有人提議多吃點蝦子對身體好,這時候有個中年男人忽然說: 
    「十年前,當我的老婆還是我的女朋友的時候,她說要吃十隻蝦,我就剝二十隻給她!
    現在,如果她要我幫她剝蝦殼,開玩笑,我連幫她脫衣服都沒興趣了,還剝蝦殼咧!」

    聽到了嗎?難怪越來越多人只想要談一輩子的戀愛,卻遲遲不肯走入婚姻。
    因為,婚姻容易讓人變得懶惰。
    如果每個人都懶得講話、懶得傾聽、懶得製造驚喜、懶得溫柔體貼,
    那麼夫妻! 或是情人之間,又怎麼會不漸行漸遠漸無聲呢?

    所以請記住:有活力的愛情,是需要適度殷勤灌溉的,談戀愛,更是不可以偷懶的喔!

    有一對情侶,相約下班後去用餐、逛街,可是女孩因為公司會議而延誤了,
    當她冒著雨趕到的時候已經遲到了30多分鐘,他的男朋友很不高興的說:
    「妳每次都這樣,現在我甚麼心情也沒了,我以後再也不會等妳了!」
    剎那間,女孩終於決堤崩潰,她心裡想:或許,他們再也沒有未來了!

    同樣的在同一個地點,另一對情侶也面臨同樣的處境;
    女孩趕到的時候也遲到了半個鐘頭,
    他的男朋友說:「我想妳一定忙壞了吧!」
    接著他為女孩拭去臉上的雨水,並且脫去外套蓋在女孩身上,
    此刻,女孩流淚了!但是流過她臉頰的淚卻是溫馨的,
    你體會到了嗎?其實愛、恨往往只是在我們的一念之間!
    愛不僅要懂得寬容更要及關心,很多事可能只是在於你心境的轉變罷了!你懂了嗎?

    當有個人愛上你,而你也覺得他不錯。那並不代表你會選擇他。
    你說:你要找一個你很愛很愛的人,你才會談戀愛。
    但是當對方問你:怎樣才算是很愛很愛的時候,你卻無法回答他,因為你自己也不知道。

    沒錯,我們總是以為,我們會找到一個自己很愛很愛的人。
    可是後來,當我們猛然回! 首,我們才會發覺自己曾經多麼天真。
    假如從來沒有開始,你怎麼知道自己會不會很愛很愛那個人呢?
    其實,很愛很愛的感? 情A是要在一起經歷了許多事情之後才會發現的。
    或許每個人都希望能夠找到自己心目中百分之百的伴侶,
    但是你有沒有想過:在你身邊會不會早已經有人默默對你付出很久了,只是你沒發覺而已呢?

    如果你也正在為愛迷惘,或許下面這段話可以給你一些啟示:

    愛一個人!要了解,也要開解;要道歉,也要道謝;要認錯,也要改錯;要體貼,也要體諒;

    是接受,而不是忍受;是寬容,而不是縱容;是支持,而不是支配;是慰問,而不是質問;

    是傾訴,而不是控訴;是難忘,而不是遺忘;是彼此交流,而不是凡事交代;

    是為對方默默祈求,而不是向對方諸多要求;
    可以浪漫,但不要浪費;可以隨時牽手,但不要隨便分手

    如果你都做到了,即使你不再愛一個人,也只有懷念,而不會懷恨。

    你懂得如何去愛了嗎?試試看吧!

    (繼續閱讀...)
    文章標籤

    傑克鼠 發表在 痞客邦 留言(3) 人氣(417)

    • 個人分類:心靈補帖
    ▲top
    • 9月 18 週四 200816:00
    • 組語基礎篇-Lea與Mov

    這兩天為了替同事上課,整理一些基礎的組合語言資料,本來想說用google大神剪剪貼貼就搞定,但發現一件十分有趣的事,就是這lea與mov兩個指令,似乎都說是「近似」的指令,讓人非常傻眼,還很少人更正,是這種低級語言....不不低階語言已經乏人問津了還是忽視,反正我也在整理資料,順便寫一下,這兩個天壤之別的指令到底差在哪裡。

    • Lea傳遞變數位置
    • Mov傳遞變數數值

    學過C++的,應該很容易了解吧~~就是指指標的 *X1 語 &X1。我也很納悶為什麼那麼多人會說兩者差不多,我想,可能為誤會的原因應該是組語「字串」傳遞所害的,舉例來講:

    lpCaption="Caption"
    lpText="Hello World!"

    _asm
    {
    push MB_OK
    lea eax,lpCaption
    push eax
    lea eax,lpText
    push eax
    push NULL
    call dword ptr [MessageBoxA]
    }

    假定我有兩個字串lpCaption與lpText,要傳遞給MessageBoxA來彈出一個視窗,我必須將MessageBoxA所需的三個變數MB_OK、lpCaption、lpText三個參數依序push入堆疊再call MessageBoxA,此時再傳遞lpCation會用到 lea eax,lpText,不懂原由的人就會以為mov和lea是差距不大,但事實上換用mov一定是出現亂碼,因為傳遞字串與陣列是必須傳遞字串或陣列的起始位置。

    (繼續閱讀...)
    文章標籤

    傑克鼠 發表在 痞客邦 留言(2) 人氣(9,273)

    • 個人分類:系統開發經驗與心得
    ▲top
    «1...34514»

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    熱門文章

    • ()WinCE核心Coredll.dll函數列表
    • ()組語基礎篇-Lea與Mov
    • ()多執行緒之死結(DeadLock)問題與避免
    • ()遭遇0xC0000005錯誤
    • ()嵌入式系統之WatchDog Timer
    • ()變更網路卡IP for WinCE
    • ()重力訓練基本觀念
    • ()Linux Driver基礎篇-編譯與掛載
    • ()蛋白質補充
    • ()肌肉的興奮劑:肌酸

    文章分類

    • 雲端技術 (2)
    • Android (4)
    • 系統開發經驗與心得 (26)
    • 心靈補帖 (14)
    • 休閒與攝影 (26)
    • 生活手紀 (65)
    • 未分類文章 (1)

    近期文章

      Google Analytics