2013年12月2日 星期一

應用動態配置記憶體 - 大數乘二算爆你的電腦

好久沒有發文了,又快要被博主通緝了,所以就來談談今天的標題," 大數乘二 "
" 大數乘二 " 演算法的開發可以讓讀者練習動態配置記憶體的應用,另外可以複習
一下讀者們可能已經遺忘的對數計算,另外可以順便練習一下條件型的迴圈使用
所以學習寫程式直接透過綜合演練是比較有用,例如在下除了 "C++ : The Core Language"
與 K&R 那本經典的 C 語言書籍,剩下的知識都是直接閱讀各領域的專案原始碼獲得,所以
在下認為純程式語言的書沒啥用,當然這是在下個人觀點,至少對在下是沒啥用,例如
對 C++ 而言,假如讀者沒有另外去學習像 Qt 或是去閱讀 Inside COM 等等這些技術,就很難
了解 C++ 的一些本質 ( 注: 可以參考以前的發文 領略 QT 視窗程式設計),總之,語言一定
是拿來被應用,有需求才會被創造,所以回到本文,來看看為什麼  " 大數乘二 " 需要動態
配置記憶體呢? 很簡單,因為用電腦內建的精度就算不出來了,只會給你一個科學記號的
近似值,可是假如要超越 CPU 演算的精度,那就得自己實作演算法。

2013年10月25日 星期五

以 disasm 為例讓我們真槍實彈挑戰軟體的移植與編譯

今天本文的標題很簡單,讓我們來練習自己移植與編譯軟體的原始碼,講專業的一點就是
學習軟體環境的建構技術,也就是說本文的目標就是要示範給各位讀者知道如何在一支自己
完全陌生的軟體源碼中,自己能夠排除錯誤,對於不存在的函式,能夠移植或撰寫相容函式
將原始碼中缺的部分給補齊,最後下達編譯與連結指令製造出該軟體的執行檔。

2013年10月17日 星期四

一種特別的參數傳遞技巧:直接嵌入立即資料於程式區段

相信有認真看過敝人曾經發過的幾篇呼叫慣例系列文章,應該已經很了解傳遞參數給函式背後
的基本原理,C 語言主要常用的不外乎就是 stdcall、cdecl 與 fastcall,在 x86-64 的環境裡面
也曾經提到過全部統一用 fastcall,可是參數在傳遞的過程中,讀者有沒有想過,是否能夠將
資料直接嵌入在程式區段中,而不需要宣告資料區段呢?這就是今天的主題,敝人將示範一種
特別的技巧,讓資料直接混合在程式區段內傳遞給一條簡單的 Windows API 作為示範。

2013年10月14日 星期一

講講 CFile、fstream 與 傳統 C 程式庫對於檔案讀取速度上的比較

在不發文的話,就要被樓主 K 頭了,所以今天就來講一個很實用的主題,就是在 C/C++ 中
developer(稱 developer,聽起來比較高級一點,programmer 讓人有一種做苦工的感覺)
常常需要打開硬碟內的檔案讀取資料吧,也許是一些設備存檔出來的報表資料,也許是一些
實驗數據,或者是一些軟體播放影音檔,不管用了多麼深奧的解碼技術,這些軟體的原始碼
一定都會有對檔案進行讀寫的動作,但是存取檔案的技巧其實有很多種類,這也是常常讓人
迷惑的地方,所以吾人就來講講一種我們常常會用到的檔案操作物件,來解解大家的迷惑
並且比較一下這些物件讀取檔案的速度。

2013年9月11日 星期三

簡單講講 USB Human Interface Device

恩,發本文的原因是看到了以前畢業的朋友在旁邊的對話框問了一些問題,我想這些問題
不是三言兩語可以解釋完畢,但是我也不想又太細究 HID 內部描述表格的解說與視窗上
HID APIs 家族詳細使用方法,主要以偏向解決問題與實作面上的一些重點,希望可以有些
許幫助,因為詳細的文獻找 USB Complete: The Developer's Guide fourth edition 細讀第 11 章與
第 12 章就有,HID Descriptor 變化多端不可能逐一介紹全部情形,詳細情形除了參考上面資料
也一定要自己讀過訂製 USB 規範組織的 USBIF 發布的標準文獻

Device Class Definition for HID - USB.org  ( HID1_11.pdf )‎

HID Usage Tables 1.12 - USB.org              ( Hut1_12v2.pdf )

因為背這個沒甚麼用,寫韌體軟體的時候在去查閱想要用的型式就好
至於 USB 規範那本 Spec ,恩 假設讀者有念過有概念  : )  這應該是基本功夫,USB 基本知識
不再解說,我們要針對面對多變 HID Descriptor 的型式,怎麼樣的令 HID Descriptor 使得軟韌
體會比較好處理。

2013年9月4日 星期三

從三元運算子講講 C/C++ 的運算式表達問題

在電腦科技氾濫的時代,幾乎所有的科技都用上了電腦,周遭所認識的朋友們大概也脫離不
了在自己的計畫案中,需要寫寫程式,但是除了使用程式庫,會呼叫 API 寫寫應用程式外
( 當然牽涉到特殊領域的 API 那還得要另外學習該領域相關知識 譬如說 UI 或 核心同步物件 )
大概很少人會實際認真的想想,真正基本面的功夫掌握得如何,這正是本篇要講的話題
今天就來講講 C/C++ 語言本身一些進階的主題。

2013年7月16日 星期二

直接交換兩個雙精度用 XMM 暫存器

好久沒發文了,在不發文就對不起博主給我這個寶貴的空間了,今天要探討的主題很簡單
也很好懂,設計一條可以交換兩個雙精度浮點數的函式,數值互換是很基本的數學函式
,但是卻很重要,不少演算法裡頭,都會用到這種基本功能,當然本文不會研究甚麼艱澀
的演算法,這個主題是要透過實作 交換兩個雙精度浮點數的函式 來讓讀者認識現在新的
x86 CPU 內部的 XMM 暫存器 與 初步的了解如何在組合語言中搬移雙精度浮點數。


2013年6月11日 星期二

從轉譯 ZoomIn 工具講講撰寫組語的一些樂趣與困難

常常用 Visual C++ 寫古典 Win32 程式的人應該都知道,經典的第六版之所以歷久不衰
除了本身整合開發環境高效率,體積小,還可以將專案 dsp 檔轉成標準的 makefile 檔之外
就是第六版還附有所謂 17 大經典工具,這些工具被稱為 SDK Tools,它們會被稱為
經典不僅僅是各個程式小巧,而且每一支都很實用,更棒的就是這些工具本身原始碼
也是公開可以研究,這些工具不僅輔助開發程式的利器,本身每支工具的原始碼就是
示範 Win32 許多重要 API 的經典寶庫,我學習 Windows 程式設計的歷史中,絕大部分的
功底就是念透這些工具的原始碼,這個比買一本書看還有用,其中有六支值得仔細閱讀

2013年5月24日 星期五

關於感測器電路的一些經驗談(some tips about sensor)

  這幾個月來,我發現我對於電路實作與理論的應用,其實還有段差距,故將一些我實際碰到的問題以及解決方法寫下來。

  基本上我還是在處理感測器的電路,這時候會用到MCU的A/D去讀取實際的類比訊號進來,但是讀值可信嗎?

2013年5月13日 星期一

領略 QT 視窗程式設計

   我們都知道視窗程式設計一直都是讓人頭痛的問題,相信有用系統的 Native API 寫過 GUI
介面的讀者們都可以體會,不管是 MS Windows 還是 Unix 上的 X Window System 或者是
少數有些人可能有過 MAC OS 下 GUI 程設經驗 ( 我指的是更古老的 MAC 系統,非 OS X ),
使用系統的 Native API 撰寫 GUI 是很痛苦的工程,但是我的過來經驗是有過 Native Level
的 GUI 編程其實還是很有用,因為你會了解到任何 OS 下 GUI 子系統的基本法則都很相似
主要基本觀念不外乎就是 GUI 子系統 (有時候會稱為 Window Manager) 會不斷監控各種
視窗訊息並且將訊息傳送給應用程式,一個完整的應用程式一般會有很多的回呼函式來
回應各種訊息,假如不想處理訊息的就利用特殊的 API 送回系統,已經處理過的就不用送回
系統,而訊息一般都會被轉譯分派,但是一般不需理會,只要在已經註冊好的視窗回呼函
式用 Switch Case 敘述作訊息攔截撰寫對應動作的程式,這就是系統底層怎麼運作 GUI 程式
的基本原理,當然沒這麼簡單,因為有些訊息往往還會夾帶通知,這樣可以更精確的獲得
UI 本身更細部的行為改變,而且不同訊息所夾帶的附加資訊又不同,所以一般寫比較複雜
的 GUI 程式都要花許多時間查閱資料,基本上 Native GUI API 就是一大堆系統提供的
C 函式組合的集合,不妨將這個基本觀念用圖來表示 ( 這邊以 Windows 系統為例 ):

2013年5月6日 星期一

用 SL811HS 學習 USB 介面 - Part01

     通用序列匯流排 (USB) 是有史以來最成功的通訊介面,目前有數億計的 USB 設備存在於
這個世界上,許多晶片設計公司都已經紛紛推出針對不同裝置設計的 USB 橋接器晶片,像
常見的裝置如:鍵盤、滑鼠、掃描器介面、影像、印表機、磁碟控制器、網路介面、序列埠、並列埠甚至是一些特殊介面 CAN ( Controller Area Network )、GPIB (標準化後又稱 IEEE
 488),吾人碰巧有用過 USB-GPIB 的有趣經驗,這是因為以前有一台示波器後面有一個
USB 埠在好奇心的驅使下接上電腦發現電腦識別為 TEK-USB-488 設備,才知道原來這是
有內建了 USB-GPIB 轉接晶片的示波器,透過這個介面,可以直接用 C/C++ 程式下 SCPI
(Standard Commands for Programmable Instruments) 指令直接控制示波器的設定,像是
螢幕亮度,語系,調整時間刻度,電壓刻度,擷取示波器上的數值。

2013年3月22日 星期五

[QT] 執行檔上的圖示更改(icon change)

QT Creator的做法

首先準備好一個icon檔 可用Irfan view製作
接下來點選project->Add new->general 產生一個.txt檔
將其檔名改為xxx.rc
且內容為

IDI_ICON1 ICON DISCARDABLE "xxx.ico"

2013年3月17日 星期日

從動態二維陣列配置技巧領略 Windows 程式設計

由於 SL811 與 USB Protocol 相關資料還在整理中,這系列文章可能還不會馬上出爐,因此
先來看一看小主題,也就是標題所述帶領讀者寫一支簡單的動態二維陣列配置程式,可是
讀者可能會有疑問,這跟 Windows 程式設計有甚麼關係呢 ? 因為這支程式用純 Windows
API 撰寫,完全不使用 Microsoft Visual C++ Runtime Library DLL (後簡稱 MSVCRT DLL)
內的 malloc,也就是讀者將不只知道動態二維陣列配置的概念,還會了解如何呼叫視窗系統的 API 實現這種功能,這會建立讀者對於 "行程" 最基本的觀念。另外,會解說這個主題的次要原因是最近處理了一些巨大的二維資料陣列問題,問題根源在於繪圖視窗是執行階段才被動態建立,所以作為緩衝區之二維陣列不可能先行宣告,因此必須設計一組可以動態配置二維陣列的 C 介面用於根據繪圖視窗大小動態配置二維陣列,因此想說用這篇講述怎麼完全都用一維
角度模擬任意 N 維陣列的基本原理。

2013年3月11日 星期一

使用 Visual Studio 開發 C51 專案程式

好久沒有發文了,今天來談談關於 8051 MCU 的開發環境,8051 被認為是應用相當廣泛歷久不衰的古老 MCU,在眾多工程人員的努力下,8051仍然持續被重新設計與進化,現代新型的 8051 一般來說都經過架構與製程上的改造,架構上的改造像重新使用RISC架構設計的8051,或是外掛其他周邊例如加入常用的 I2C 與 SPI 或是像有名的 Cypress CY7C68013A 這顆超級 8051 帶有特殊的周邊主要是內建 USB 2.0 控制器 與 GPIF (General Programmable Interface),GPIF 不是 GPIO 不要弄混,這是一種很奇特的介面,它的功能很像 CPLD,可以產生開發者想要的特殊通訊波形,使得 USB 2.0 控制器可以直接與 GPIF 連接的外部裝置直接通訊,8051 核心本身不用介入控制,達到高速傳輸的目的,有點像可程式化的 DMA。製程上的改造使得 8051越做越小顆,像 C8051F320 小小一顆 7x7mm^2 還內建有USB全速控制器,NI 公司的 USB 轉 I2C 與 SPI 產品就是用這顆做的喔。雖然 8051 有許多變種,但是 8051 的核心在怎麼變,軟體開發層面都一樣,因為所有 8051 組合語言指令集都長得一樣,所以用 C 語言開發 8051 程式當然就只需要一種編譯器,最有名的就屬  Keil C Compiler,另外還有開放原始碼專案的 SDCC。雖然 Keil C51 Tool Chain很好用,可是 Keil 的程式環境就令吾人不深感不方便,尤其對我們這些原本搞 Windows 或 Linux 下寫 GUI 應用程式跳過去也搞搞微處理器的人來說,Keil 的程式編輯器實在太陽春,所以就浮現一個簡單的想法,我只要 Keil C51 Tool Chain,程式編輯與編譯環境用 Visual Studio !!

2013年3月5日 星期二

C語言函式呼叫慣例 ( fastcall ) (完) Part3

Part2 講到關於重要的 cdecl 呼叫慣例分析後,應該已經可以掌握
或是已經記憶在腦袋裡面了,stdcall 與 cdecl 其實長得差不多,除了
函式編譯後的符號名稱不同 與 cdecl 要自己平衡堆疊外,參數傳遞方式
是一樣,由右至左推入堆疊,使得在函式內部取用參數時,剛剛好是從
param 1 開始拿取,另外一個重點在於假如使用編譯器標準處理 Prologue 與
Epilogue Code,那執行完 Prologue Code 時,Stack 的內容一定是

Stack : param n, param n-1, ... , param 1, return address, ebp <== [TOS]

所以 [esp - 8] 必然是函式第一參數值,這些應該要牢記。

從 FASM 呼叫 C 副常式來自創 C 語言進入點

看完了上一篇對 Ternary operator 的深入研究之後,是否對程式語言有更進一步
的體會呢 ? 一個小小的 Ternary operator 可以引出對於 指令設計硬體化 基本觀念與
利用來自不同層次程式語言思考模式放入更高階語言內實現的想法,相信不少寫
C 程式語言者很少想過之間的關連性,或同時有寫過 HDL 和 C 語言兩者可能也沒
甚麼感覺,反正就是寫出功能達成任務,但是假如你學會這種多層次語言思考模式
則對程式語言的應用將會更顯靈活,這大概就是上一篇小品文大意所在。

現在讓我們來看看本文的標題,講的是說要 「自創 C 語言進入點」,搞技術的人
常常都要寫程式,也大概知道程式會有一個進入點(a entry point),進入點通常是
一條特殊的函式名稱,你不可以拿這個名稱去用,例如令成一條函式,因為 Linker
在進行鏈結的時候,會去尋找這些特殊的符號名稱,讓它們當作程式活動起來的門口
這樣子軟體工程師就會有所根據,知道說「某特殊名稱函式會自動被執行」,這樣
工程師就會知道程式要開始從這邊寫與規劃整個程式的架構,整個程式就運作起來了...
所以這些特殊名稱的函式一般又稱為 Entry-point function,所以說上一篇的小品文不全然
無關,上一篇講 「? :」 運算子的原貌,這篇就是講 Entry-point function 的原貌,讓你
知道,這種函式還可以自己根據需求創造 。

2013年2月8日 星期五

古怪的儀器偵測電路(未解決)

  前些日子,生化部門的表示他們要做個實驗,但是需要開關電路,他們有一台電位儀http://chinstruments.com/chi600.shtml,會供應0.4V給試片,並且測量出流經試片的電流。

2013年2月1日 星期五

MCU中的開關(analog switch)

  現在MCU的技術越來越包山包海,像是聯發科或是高通,現今又要將NFC(Near Field Communication)完整的做在MCU中,但是對一個等級不高的打雜工程師來說,真的是一件頭痛的問題,因為你很有可能會碰到,IC設計工程師設計完丟給你,但是你不知道他怎麼達成這樣功能的,而衍生出後面各種問題。
類比開關電路符號

2013年1月29日 星期二

單晶片的一些小事(some tips of MCU)

這幾個月來,翻了不少人的code,由於沒有人教我或是入門,所以摸索之間碰到許多困難,不過這些問題也慢慢找到解答。

這裡將它寫出來給大家分享。

2013年1月16日 星期三

判斷n是否為2的冪次

最近看到這則程式碼
return (n!=0 && (n&(n-1)==0))
我想了一下恍然大悟
這種東西不知道原本是誰想到的

2013年1月4日 星期五

深入研究 C語言 三元運算子 ( x ? y : z ) (完)

不可否認的事實,C 語言做為最基礎的程式語言,已經超過 25 年歷史依然持續站在
眾多程式語言最上層的王座,完全無可撼動的崇高地位再一次說明作為 OS 母程式語言
所擁有的絕對優勢,絕對不是其他語言可以輕易挑戰,有興趣可以參考
TIOBE 這是一個專門研究世界上數千種程式語言的使用率級排行榜的專業網站。

2013年1月2日 星期三

實戰呼叫慣例 - 淺談 x87 浮點運算 (完)

從最初期的呼叫系列慣例文章以來,也算是逐漸地發展出一套有系統的發文方式
從最基本開始讓閱讀的人從基本上了解程式語言底層的本質然後逐漸的推進到有
一篇簡單的實作練習,也就是上篇 從 C 呼叫組合語言函式一文,這樣的流程無非
希望讓讀者能夠有實質的進步與收穫,所以本篇當然要在推進一層
讓我們來看看怎麼使用浮點運算
這次我採用倒吃甘蔗的方式,先
跑一跑程式在來解說程式