Windows Device – Power Management

[2023/01/13 再更新]

從 Device Manager 確認 Device 的設定

我們知道從 Device Manager (DevMgmt.msc) 可以確認各個 Device 的狀態與設定等資訊,有些設定可以給使用者決定開或關,那它們都儲存在哪裡呢?

例如:使用者可勾選

“Allow the computer to turn off this device to save power"

有些是存在 Windows Registry 中,那要如何去確認 Registry 的位置呢?

1. 開啟 Device Manager 裡點選你要確認的裝置,按右鍵看內容 Properties。

這裡以在 Windows 10 下檢視

Intel USB 3.1 eXtensible Host Controller 為例。

2. 切換到 Details 那頁,找出 Driver key,按右鍵做 Copy 。

3. 叫出 regedit,從 HKEY_LOCAL_MACHINE\SYSTEM\ 進行搜尋剛剛複製的 Driver key。

可以看到 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_8086&DEV_06ED&SUBSYS_098D1028&REV_00\3&11583659&0&A0] 裡的 Driver 是符合的,那麼這組就是我們的目標。

4. 接下來可以檢視裡面的項目,可以推測

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_8086&DEV_06ED&SUBSYS_098D1028&REV_00\3&11583659&0&A0\Device Parameters\WDF]

IdleInWorkingState“=dword:00000001

對應到

“Allow the computer to turn off this device to save power"

IdleInWorkingState 這個鍵值可儲存該設定。

1 為勾選,0 為取消。

使用者看到的 Power Management 三個開關

從 Device Management 找到 Device 後點出 Property,找出 Power Management 的頁面,可以看到三個開關:

□ Allow the computer to turn off this device to save power
□ Allow this device to wake the computer
□ Only allow a magic packet to wake the computer

Network Adapter 的秘密在 “PnPCapabilities"

此篇 [January 15] Allow the computer to turn off this device to save power is grayed out

提到"Allow the computer to turn off this device to save power" 是由 DWORD registry “PnPCapabilities" 來控制:

當值為24時,該選項會灰底。
當值為0,表示允許在Idle時關閉裝置。

但僅在 Network Device 找到,推測:
“PnPCapabilities" 似乎僅為 Network Device 所用?

微軟怎麼說…

參考這篇 https://learn.microsoft.com/en-US/troubleshoot/windows-client/networking/power-management-on-network-adapter

裡面詳述關於 networking 有三種選項:

□ Allow the computer to turn off this device to save power
□ Allow this device to wake the computer
□ Only allow a magic packet to wake the computer

對照 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0010]

(注意:0010為Device Number,各機台不同)

當三個選項勾選狀況為以下:

  • VVX – PnPCapabilities = 0 (預設)
  • VVV – PnPCapabilities = 0x100 (256)
  • VXX – PnPCapabilities = 0x110 (272)
  • X– – PnPCapabilities = 0x118 (280)

微軟文件也指出,有些操作會導致矛盾的值產生,例:

  1. 先開三個勾勾 VVV – PnPCapabilities = 0x100 (256)
  2. 取消第一個勾勾 Xvv – PnPCapabilities = 0x118 (280)
  3. 再勾第一及第二,第三不勾 VVx – PnPCapabilities = 0
  4. 再重覆第二步(取消第一個勾勾) Xvx – PnPCapabilities = 0x18 (24)

這樣的操作後竟然和前面說明的不同結果??其中邏輯真的是讓人一頭霧水…

實際還是得依歸微軟黑盒子的內部邏輯…。

[程式C] 記憶體對齊單位

#pragma pack(1) 用來表示記憶體對齊單位

1 表示以 BYTE 作 align

4 表示以 DWORD 作 align

() 裡可選擇的是 1,2,4,16

#pragma pack 會要求compiler 使用特別的對齊方式來包裝 Structure Member . 大多數的compilers, 當你宣告一個結構時, 將會在彼此成元之間插入 padding 來確保他們在記憶體中的對齊。

範例程式:

#pragma pack(1)
typedef struct _TEST_PACK_1 {
  char AAA;
  short BBB;
  __int32 CCC;
} TEST_PACK_1;
#pragma pack()

#pragma pack(2)
typedef struct _TEST_PACK_2 {
  char AAA;
  char BBB;
  __int32 CCC;
} TEST_PACK_2;
#pragma pack()

#pragma pack(4)
typedef struct _TEST_PACK_4 {
  char AAA;
  char BBB;
  __int32 CCC;
} TEST_PACK_4;
#pragma pack()

#pragma pack(16)
typedef struct _TEST_PACK_H {
  char AAA;
  short BBB;
  __int32 CCC;
  __int32 CCC;
} TEST_PACK_H;
#pragma pack()

typedef struct _TEST_PACK_F {
  char AAA;
  short BBB;
  __int32 CCC;
} TEST_PACK_F;

    printf("sizeof char %X \n", sizeof(char));
    printf("sizeof short %X \n", sizeof(short));
    printf("sizeof __int32 %X \n", sizeof(__int32));
    printf("sizeof TEST_PACK_1 %X \n", sizeof(TEST_PACK_1));
    printf("sizeof TEST_PACK_2 %X \n", sizeof(TEST_PACK_2));
    printf("sizeof TEST_PACK_4 %X \n", sizeof(TEST_PACK_4));
    printf("sizeof TEST_PACK_H %X \n", sizeof(TEST_PACK_H));
    printf("sizeof TEST_PACK_F %X \n", sizeof(TEST_PACK_F));

   

輸出結果:

sizeof char 1
sizeof short 2
sizeof __int32 4
sizeof TEST_PACK_1 7
sizeof TEST_PACK_2 6
sizeof TEST_PACK_4 8
sizeof TEST_PACK_H C
sizeof TEST_PACK_F 8

如何利用 CTags 來快速檢索程式碼?

## 什麼是 CTags?

在程式碼變得龐大時,各種變數與函數的搜尋與快速定位變得好重要,而 CTags 工具就是用來解決這種困擾。

在開始 coding 前先執行 CTags ,讓它把所有指定的程式語言的檔案,將所有變數、函數等等先收集起來儲存到一個索引檔。

CTags 也算是一個古老的工具,最新的一版是 v5.8,2009/07/09放出來的。

https://ctags.sourceforge.net/

https://sourceforge.net/projects/ctags/

下載後可以找到執行檔來使用,裡面也有 ctags.html 來說明各參數的使用方法。

例:

* -R 表示遞迴

* –languages 可指令程式語言

* –langmap 可指令程式語言與要處理索引的相關副檔名

## C 語言可以這樣用

**ctags –langmap=c:.c.h.mak -R %1**

## Python 語言可以這樣用

**ctags -R –fields=+l –languages=python –python-kinds=-iv**

當我們使用支援 CTags 的編輯器時,就可以輕輕鬆鬆瀏覽程式碼啦!

對於XXX,總是學不會嗎?談《大腦喜歡這樣學》

你討厭數學嗎?覺得怎麼樣都學不會嗎?

芭芭拉‧歐克莉(Barbara Oakley)也是這樣,從小學到高中,對於數學敬謝不敏,也就是說能躲就躲。轉向語文方面發展,俄文學得不錯,進入軍職後的升遷之路上,沒想到還是得克服數學這門學問,她決定接受這項命運的挑戰,既然學不來,那就慢慢學吧。

改變了心態,轉換了思考方式,意外的是,數學變得可以理解了。

原來,大腦切換到一個可以適應的學習方法,不用再那麼害怕有壓力。

作者好奇,為何數學之所以難以學習,是因為比起文學更具「抽象性」的觀念。

我們可以用圖片來代表一件物品,但卻難以用單一圖像解釋所有的「加法」與「乘法」。

「乘法」是進行多次的「加法」,等於再次加密的抽象概念。

那麼,學習,尤其是面對自己不擅長的,到底有什麼秘訣呢?

有三個心得來分享一下

專注與發散

大腦的學習運作好比一個彈珠台。

當釘腳緊密排列時,彈珠總是在特定區域打轉,這是專注模式

而釘腳鬆散排列時,彈珠總是能敲出新路徑,這是發散模式

以往我們以為學習必須長時間的堅持不鬆懈,這樣其實只是固定幾組神經元的刺激,久了也疲乏了。

大腦也需要休息,轉移到其他事務或是睡眠,或許看起來像偷懶,其實大腦會默默做資訊重整,就當釘腳從緊密慢慢鬆開,本來打不通的路徑竟然開闢出來。

於是,作者也建議使用「番茄鐘」,為你的學習建立韻律,25分鐘學習、5分鐘休息,有鬆有緊,退後原來是向前。

拖延與意志

你是不是也有某些事情容易拖延呢?想想看為什麼壞習慣總是比好習慣更容易養成呢?

「好,從此時此刻起,我決定不做什麼(壞習慣),要做什麼(好習慣)!」你有沒有常常對自己這麼說呢?

閱讀書中關於拖延的篇章後,我發覺原來我總是想用「意志」來控制自己,但事實上,意志是有限的,過度使用意志是容易讓自己感到能量耗弱,然後再發現事情沒有達成時,再一次打擊自己。

想想我們在執行那些自覺的壞習慣時,是不是很放縱,很開心,這種時候哪有意志出現的餘地。徵結點就在於,怎麼讓自己進入一個「開心」的狀態。例如:想辦法與犒賞捆綁,減少強加的步驟,先邁出最小步,然後休息。以間歇式前進的方式漸漸練習,才能堆疊成果。

圖像與空間

人類的視覺在我們的學習上幫助極大,看看現在網路世界已經進步到到處都是視覺影像。

所以學習記憶的強化兩個Level Up的方法,其一就是利用「圖像式記憶」,另一個是「空間記憶」。

「圖像式記憶」倒不難,現在許多人運用拍照、心智圖、或是作成圖卡,自己手寫的筆記某方面也結合了手腦並用的肌肉記憶。將你需要學習的訊息與有趣、富有畫面的素材加以捆綁,會更加快速。例如,袋鼠的英文諧音是看個路,那麼你就想像袋鼠🦘在馬路上低頭看路。

「空間記憶」則是將你已非常熟悉的場景,把你所需要學習的訊息放置到場景內的各區域。這個需要技巧,我想也需要練習,否則不會有專門開課教授「宮殿記憶法」。這裡讓我想起以前曾有的益智節目,需要在很短的時間內將不相關的方向與數字一一照順序記憶起來,像是左100,右38,上84,…,個人記個三組算是極限了。而使用「宮殿記憶法」的訣竅在於一開始必須撐過空間建造和想像對應的練習,所以學習門檻算是有的。

結論

我看到雙丁麻麻將本書應用在與兩個小學生的課後生活中,掌握大腦學習模式和時間切換技巧,兩者活用後竟可以幫助小朋友找到專注的方式,也算成功避開「從盯功課變成吼媽」的陷阱。非常建議家有小學生的吼媽們也看看《陪讀的刻意練習:養成孩子自主學習的教養魔法》怎麼實踐的。

〈番茄鐘〉適合用來轉換學習與工作的情緒,不過未必要死守25分鐘正事、5分鐘休息的韻律,找到適合自己的節拍或許能更順暢。有位國外資深前端開發者 Nick Bull 就以他的工作心流狀態,發現****69 工作技術(專注工作 52 分鐘,有效休息 17 分鐘)****更適合自己。

這本書也被一些高中、大學拿來教授,原因無他,在學生的日常就是學習,如果有技巧那會是更有效率的學習。已工作的人當然也需要,我最大的心得在於,與其說是更聰明地學習,不如說是了解自己的大腦,懂得在有限的時間內好好使用自己的精力,做好個人能量管理。

至於效率這個議題呢?有的時候覺得難就是難,太過PUSH只是為難自己。作者從接受數學到學會也不是一夜之間。忘記時間的界線,用開放的心態,有意無意反覆接觸你要挑戰的事物。

心情好,學習得更好!

《大腦喜歡這樣學》 A Mind for Numbers

  • 先認識自己的大腦, 找到正確的思考路徑, 就能專注、不拖延, 提高記憶力, 學會如何學習
  • 作者:芭芭拉.歐克莉
  • 出版社:木馬文化事業有限公司
  • 出版日期:2017/09/27

[延伸閱讀]

陪讀的刻意練習:養成孩子自主學習的教養魔法雙丁麻麻,2021/12/24,三民

專案裡的時間觀

這裡紀錄一些在執行產品開發過程中,常見的 acronym。

acronym 是多個單字的第一個字母組成的特別縮寫,在工作日常中常常會用到,但不一定完全了解,有時是邊做邊理會,可能你身邊的人也不一定知道。

用久了,猜一猜或許可以猜到八九成,但何不認真來認識一下呢?

產品周期裡各階段的命名

  • EVT – Engineering Validate Time 工程驗証期,第一份樣版通常需要大量修正
  • DVT – Design Validate Time 設計驗証期,開始確認各項設計是否符合一開始的設定
  • PVT – Product Validate Time 產品驗証期,確認設計後進行問題收斂
  • |- RC – Release Candidate 候選版本
  • |- Golden 黃金樣本
    |- PR – Pilot Run 小量試產,來觀察工廠可能發生什麼問題
  • MP – Mass Production 大量生產,正式成為產品

另一種是偏軟體類型的產品各階段的命名

  • Pre-Alpha
  • Alpha
  • Beta
  • PV
  • RTM – Release to Manufacturing 我自己以為 Ready to Market (HAHAHA)

產品上市後的里程碑

  • EOM – End Of Marketing 停止生產;仍在銷售期
  • EOS – End Of Sale 停止銷售;庫存繼續賣
  • EOL – End Of Life 停止服務;宣告維護終止

與開發周期相關的物料時間點

這邊通常指的是單一樣品 sample 的時間

  • ES – Engineering Sample
  • QS – Qualification Sample
  • Prod – Production
  • RTS – Ready to Ship 可以正式出貨

還有物料往返的時間,明確交待,以便工作御接。

  • ETD – Estimated Time of Delivery 預計寄出時間
  • ETA – Estimated Time of Arrival 預計抵達時間

專案開啟前的規畫相關文件

  • RFQ – Request for Quotation 徵詢廠家的意見,協議報價、時程、項目…
  • RFP – Request of Proposal 需求建議書,通常就是對於這個專案的提案。
  • PCR – Project Change Request 專案的規格以外的變更需求。
  • NDA – Non Disclosure Agreement 保密協議。
  • SOW – Statement of Work 工作說明,通常會說明參與各方的活動與要求。

工作日常信件來往常用單詞

  • AR – Action Required 行動要求,針對單項事務列出負責人與下一步動作。
  • EOB – End Of Business 下班前(個人也有營業時間嗎?)
  • EOD – End of Day 今天以前
  • WFH – Work From Homw 在家工作
  • OOO – Out of Office 不在辦公室,請假時用。
  • TBA – To Be Announced 待公佈
  • TBC – To Be Confirmed 待確認
  • TBD – To Be Determined 待決議

(To Be Continued …)

C# – 如何利用 Console 輸出來協助開發?

在開發 WinForm 程式時,會需要將執行檔移至其它機台驗証。

但我們不會在每個機台都裝上 Visual Studio 來編譯,那麼要如何debug呢?

這時可以利用 Console 輸出來輔助。

首先,要加入正確的 Name Space。

**using System.Runtime.InteropServices;**

再來在程式開始時引用並呼叫 **AllocConsole();**

    public Form1()
    {
        InitializeComponent();

        AllocConsole();

        ...
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool AllocConsole();

程式執行時,即可利用 **Console.WriteLine()** 等來輸出 debug 訊息。

結束時,記得做 **FreeConsole();**

另外,若程式執行後仍無看到 Console 視窗,可以暫時修改專案屬性來測試。

還要注意一件事,當程式執行時,Console 同時也在運作。

此時若關閉 Console,則程式也會停止執行。