10.31.2006

"Build and Sysgen" won't build(compile?) the PRIVATE folder

修改PRIVATE下的folder,用IDE的"Build OS - Build and Sysgen" [no clean],並不會compile PRIVATE 下的folder,所以要手動:
  1. 開啟release directory,,,
  2. SET WINCEREL=1
  3. build -c
  4. 到parent folder再build 一次(make sure the target lib has been update)
這樣做完後,如果其他地方的code都沒有modify,只要作 "Sysgen" 就可以了。
..

Memo : modify source in source folders

修改Source Code Folder中的任一個source code時,將整個folder copy, rename 後常常會造成PB catalog 的錯誤,所以最好copy 到WINCE500 以外的folder,這樣很麻煩,所以當只有修改部份source code時,將原source file rename成 backup_XX.XX 放在原folder處就可以,這樣將來要改回時,可以利用search 功能 找到所有backup_XX.XX的file。

10.30.2006

worklog of last week

  • 想要rebuild device.exe,卻不行,開始trace nk.exe,找load device.exe的地方。
  • 在nk.exe中加入debug message,rebuild。
  • document說只有debug version 可以rebuild private folder codes。try building debug version。
  • debug version ROM太大,要enable > 64M image。
  • debug version boot speed too slow,而且不會output debug message。
  • 換回release version,nk.exe build ok (跟document 不合),會output debug message。
  • try tiny-kernel ,成功run tktest.exe...
  • 修改tktest 再build後就fail了,tktest.exe prefetch abort。
  • 開始try 各種configuration (item),設法找到fail 的原因。
  • 上QFE。build on another machine。
  • from a minimum configuration, add necessary item - TKTEST prefetch abort.
  • 以為是item沒有選對,所以一個一個try。結果不是item的原因,是...一定要先加一些奇怪的item,build fail後再移除才可以。但是再sysgen一次(沒有修改任何configuration)就fail。
  • enable KERNEL_MONITOR Thread,發現雖然tktest.exe abort,但是kernel依然是ok (kernel monitor thread ok)。所以決定用kernel monitor thread來作on/off process。
  • Trace power off process - power button trigger (timer) call to kernel - oal - off,找到power off 的kernel function。
  • kernel monitor thread 用sleep( )來auto off 是OK的。加入powerbutton oal,修改掉compile error (unresolved external)後,也可以用power button ON。
  • 在monitor thread加入polling power button .. access peripherial register - mapping ok, read 就會exception。
  • Virtual/Physical Translation在UserMode和KernelMode不一樣,Kernel Mode要用VALPAtoPA。
  • 開機後馬上進入PowerOff - 加入putton release check。
  • 發現 NB的building speed竟然是PC的4倍。
花這麼多時間,都是在find building process,source code (not disclosed),image上。跟真正的trace code沒有關係。
<-- 都是花在none-open source 上的effort。

10.28.2006

更換X32的HD

命運多舛80G HD終於拿到了,拿來換上X32。
換的時候順便看了一下兩個HD的spec:
原廠:Toshiba 40G 5400rpm
新買 : Seagate 80G 5400 8M.
重點是在電流上:
原來的是1A,新的這個是0.46A?是真的?還是Toshiba太保守了?

換上後 速度好像...有點影響(希望是心理上的..慢)。

順便試試上次做的X32 還原光碟。果然比以前的方便多了,放上第一片,不用進入bios設定security,直接就進入IBM 恢復程式,選恢復成開機(出廠)狀態....等...重開機。放入第二片。然後就不用管他,約1.5 hours後 就出現剛拿到的X32一樣....轉換FAT to NTFS...然後,後面就都一樣了。

這次新拿到的HD為了確認沒壞,所以有先用USB 裝置在widows下"初始化"和parition 成ntfs過(whole one partition)。

安裝過程中有一點疑問的的方式重開機時,問"是不是有IBM supplyment CD?"我以為有,所以放入恢復光碟,按Yes,結果都不是。

還有 安裝玩後,keyboard的" . " button 變得有點不靈,這個按鍵剛好在HD上面,該不會換Hd的問題?

還好我多按了幾次後,就恢復了。

還有... 今天的keroro配音好像換了...
後續:
隔天實際測試battery life : 播放30 min 照片後,一般web surfing, upload一個60M的video 到youtube,看兩段youtube 影片。..msn.. 除了一開始30min LCD backlight是FULL外,剩下時間調成1格。Wifi 全時開啟。
7:40 ~12:10 battery 剩下21%, 開始出現low battery warning 警訊,但是顯示還可以使用1:20 min。
所以猜測大概真的可以用到5:00。

10.26.2006

收到 銀箭線上 更換的HD了

今天忍不住又去pchome留言,問一下 已經快一個禮拜了,我的hd什麼時候才會回來。
回家後 就收到了,馬上測試了一下,這次OK。

但是..說會退郵費的,我花115,只有退90... 枉費我還特地問可不可以用宅急變,他還說可以。

算起來還真不划算,花時間測試,確認壞掉,自己去寄,浪費時間,還等了快一個禮拜才收到更換品,還倒貼20多塊郵資,真是 花錢,花時間。

這次 銀箭線上的hd 真的是非常不划算 (不過也沒差,他以後大概也不會再賣hd了吧)。

How to build nk.exe

先要上QFE : 2005 annually update 和2006的(到9月)。實際上好像是2004 的某一個QFE有update private folder source file,才可以build出nkmain.lib。

  1. modify your sourcecode in private\wincecore\coreos\nk\
  2. open release directory - set WINCEREL=1, build -c
  3. - 確認一下 public\common\oak\lib\nkmain.lib (或nkXXX.lib)的date-time。
  4. sysgen
  5. makeimg - output log中會有message " updated private data in nk.exe"
在nk.exe中,如果要print message,用NKPrintfW(L" format %x", data);

目前好像只有nk.exe可以build,device.exe依然不能 (雖然可以compile成lib,但是不會link成device.exe )。

the 1st Process launched by nk.exe

SchedInit( ) OpenExecutable ("nk.exe").. in nk.exe..

Kernel 的sheduler好像是在 NK\KERNEL\scheduler.c 中的 SystemStartupFunc ( )
  1. 在pROM 結構中找到sharedll 區域的位置
  2. Alloc Memory
  3. Load coredll.dll
  4. 在load 到memory 的coredll.dll 中找到需要的一些function pointer ( 用 function index的方法 )。
  5. Create Kernel need synchronize object - event, critical section..
  6. CreateThread : PowerHandlerGuardThrd,
  7. Load shimeng.dll
  8. CreateThread : CleanDirtyPagesThread
  9. CreateThread : RunApp
  10. Endless While - Wait Alarm (Time limit - oneday), give CleanDirtyPages a chance to run.
RunApp 在 kmisc.c
  1. CreateProcess : filesys.exe <-- this is the very 1st process Lives after nk.exe

New Platform - why I have somthing I don't want ?

New Platform

問題:每次New Platform 一個新的platform ,結果出來的OSDesign View Item 好像都不一樣。

回答:

這是因為 Platform Builder很自動(多事?)的幫你加入一些item 的關係(即使你選了"custom"也一樣)。

在platform builder中使用New Platform Create一個platform 時,第一個動作: "BSP"。
在選定BSP後,Platform builder會參考該BSP下的bat檔 (platform\<your_platform>\<your_platform>.bat),執行他,所以該BAT檔中所有設定的環境變數,都會在接下來的操作中繼承。

舉例來說:在 <your_platform>.bat中設定了SYSGEN_BINFS=1,則接下來Platform Builder就會自動在New Platform 中加入 Binary File System 這一個component (將游標移掉Catalog item 上, platform builder會顯示出該item 對應的SYSGEN_VAR)。即使你在接下來的各item 選擇中都沒有加入該item (Custom ),最後那一個item 還是會被 加入。

New Platform 完成後,在Workspace的OSD View中就可以看到被自動加入的item,如果去delete他,會有warning dialog出現,請你刪除掉 " SYSGEN_XX" 環境變數。

反過來說,當自己create一個platform時,可以藉由定義SYSGEN_XXX的方式來強制使用該BSP的設計加入需要的item。

另外Platform Setting 中build option 也會影響到被加入的item,可以在New Platform 的最後一步 "modify building options without leaving the dialog" 按下這個link,將不要的build option 拿掉,這樣最後Create出來的platform 才會包含你需要的item (不會被自動加入其他的item )。

10.25.2006

CE 的build 動作

一般的software , os run time image的 build 動作,不外乎是..
  1. config, generate heder and defines
  2. compile
  3. link
  4. relocate resource and exe files
  5. combine all to rom image
但是CE platform build卻看不出這幾個動作..

首先,這一篇(要用IE 或IE Tab來看,因為裡面的圖用了IE特殊的script )有說明build phase. 出乎意外的是:
  1. Compile
  2. Sysgen
  3. Release Copy
  4. Make run-time image
Compile在sysgen之前。

文章的圖對於各build tool 之間的關係說得很仔細:

所以blddemo.bat 是最大的batch program,做了所有的事。依據呼叫cebuild.bat, buildrel.bat 和makeimg.exe。

cebuild.bat 作 上面.. 1.Compile 和 2.sysgen 的動作。

所以sysgen 並沒有compile 囉?


blddemo.bat 可以有以下使用法:
blddemo [clean | noclean] [rel | norel] [-q | -qbsp] [Cebuild.bat parameters]
clean, noclean - clean 的目標是指%_PROJECTROOT%\Cesysgen 和 %_PLATFORMROOT%\Cesysgen。
當有修改 %_WINCEROOT%\Public\CEBASE\OAK\Misc\Cesysgen.bat 時,才需要clean。
含有environment variable 中,以SYSGEN 和BSP 開頭的變數有變更時,也需要clean。

rel, norel - norel 大概是指要不要自動將 compile完的file copy 到release folder,及之後的動作(makeimg)。

-q - 這是pass給cebuild.bat 的參數, -qbsp 是告訴cebuild 只要build plaform folder以下的source。 -q 是說 ? 有點conflict.. 好像說,所有source 和sysgen 變數都沒有改變。

cebuild.bat parameters - 是任何呼叫cebuild.bat 時傳遞的參數。


在command line 使用blddemo.bat 來build image的話,可以先設定好環境變數:
set BLDDEMO_MI_LOG=1
這樣blddemo.bat會在目前目錄下產生
  • Makeimg.out : makeimg.bat 的log
  • SysgenSettings.out : sysgen 在做完dependency check 後的setting.

Cebuild.bat
  1. 在%_WINCEROOT%\Public\ 中,所有env var : _DEPTREES 中所包含的 folder name,一一的到該目錄下執行 build.exe 來compile source code。
  2. 對每一個_DEPTREES 中包含的item XXX,執行 Sysgen.bat -p XXX 。
    Sysgen.bat 將會 還會依照cesysgen.bat 產生的module 需求,buid module。
    Sysgen.bat 還會build %PROJECTROOT%\Oak\Misc 下的module。
  3. 到%_PLATFORMROOT%\%_TGTPLAT% 作build.exe,compile hardware platform的module
猜測Build 作compile, sysgen 才作link。
為此,使用Cebuild.bat時,可以加上 " -q " 叫cebuild.bat不要呼叫build.exe將source code重新compile,直接叫sysgen 重新link就好。

Sysgen.bat

真的是作link的動作...

sysgen.bat 將Cesysgen.bat中指定的所有module,用nmake.exe將各個lib link起來。
  1. sysgen.bat 到%_PROJECTROOT%\Oak\Misc中參考Cesysgen.bat,設定好適當的envvar。
  2. 參考 %_WINCEROOT%\Public\Common\Cesysgen 下的makefile,如果有-p option時,則follow -p option 指定的 Project ,參考 %_WINCEROOT%\PBWorkspaces\<Project Name%gt;\Cestsgen 下的makefile。參考這些makefile,作以下..
    1. Create Target system directory
    2. 將Cesysgen.bat中指定的 .lib link 起來
    3. Call Res2res.exe, 將所有resource file 合併起來
    4. call Cefilter.exe 處理 CE header file 和其他source file,
      CE header file 中有些comment 被用來作condition statement : @CESYSGEN。
      利用這些condition statement,可以讓Cefilter變更處理的動作。
    5. Cefilter.exe處理%_COMMONPUBROOT%以下四個folder中的file,並且output到 %PROJECTROOT%\Cesysgen\的對應位置:
      1. \Sdk\Inc\*.* ==>\Sdk\Inc
      2. \Oak\Inc\*.* ==>\Oak\Inc
      3. \Ddk\Inc\*.* ==>\Ddk\Inc
      4. \Oak\Files\Common\*.* ==> \Oak\Files
    6. Copy modules 到target directory
  3. Sysgen.bat會將Error輸出log到%_WINCEROOT%\Build.log中
stsgen   [-c] [-p Tree] [NmakeTarget] [NmakeTarget] ...
-c : Run Nmake.exe時, 加上clean 參數
-p Tree : 對 Tree 作sysgen,當沒有指定時,對common project 作 (?)
NmakeTarget : 指定build Target module就好,當沒有指定時,sysgen 對所有Cesysgen.bat中列出的module作sysgen。
 sysgen -p wceshell
這個動作指示sysgen build/link wceshell module,並且copy 到 target folder

Cesysgen.bat
?

簡單的說:
  • build.exe 是compile,但是build.exe產生的是lib (也是就ar 起來的一堆obj)
  • sysgen 是link,依照cesysgen.bat 的內容將各 lib link成target : exe, dll
  • resource arrangement - 略
  • makeimge : 依照binary image script (*.bib) 將各exe, dll , res,... 合併成一個image。
以上整個動作可以由blddemo.bat完成。

10.24.2006

try build wth x32

1.7G 512M 5200rpm
tiny kernel w tktest smdk2440
10:15 start building
10:51 stop on build error
ok..rebuild again.. try suspend to hd during building..

? 好像比 C2.6 + 512M 還快... PM 1.7 會比 C2.6快??

CE : MISC Work Record : Tiny Kernel Mode ,, Test Program

在build log 中會出現:
CE_MODULES=coredll nk shell relfsd loaddbg shellcelog fsdmgr filesys toolhelp rt_tests
COREDLL_COMPONENTS=coremain lmem showerr thunks corecrt corestrw snotify coregwestub coreimmstub coresiow serdev locmini multiui full_crt crypthash rsa32
NK_COMPONENTS= nkcompr nkmapfile
FILESYS_COMPONENTS=fsheap fsmain fsreg fsysram msgqueue
可以看出NK.EXE, COREDLL.DLL, 各由哪一些 lib 組合而成,但是不知道決定dependency 的地方在哪裡。

New Platform : build 出來的platform在OS design View中會自動依照Platform-Setting - Build Option 的項目加入需要的item,所以刪除該item時,會出現一個dialog,說明同時要將 ENABLE_XXX 的item 關閉。

但是雖然OS Design View 中有該item,實際看workspace.pbxml 卻還是只有基本的item (就是有選的item),也就是說... 實際的和OS Design View 不符。

將 platform-Setting-build option 中的item 都不勾選,TinyKernel 就只有標準的nk, coredll 兩個。


  1. uncheck all "Platform - Settings - Build Options" except "FullKernelMode".
  2. uncheck "Clean befor build" and "make run-time image after build".
  3. build and sysgen
  4. modify platform.bib
    1. comment out FlashDrv.dll
    2. comment sdmmc ...
    3. comment pnashell.bib
  5. modify *.reg <- seems not need to do this


TinyKernel Test Program的位置在
PUBLIC\COMMON\OAK\tktest

在common.bib中有描述,當指定使用MODULE_TKTEST時,會將tktest.exe copy到 image中,rename成filesys.exe。

這是因為 CE 的 kernel : 寫死了 起動後 run ...
  • schedule.c : SchedInit( ) : CreateThread( ... SystemStartupFunc ...)
  • schedule.c : SystemStartupFunc : CreateKerelThread( ... RunApps ... )
  • kmisc.c : RunApps( ) : CreateProcess( ..filesys.exe... )
所以...第一個啟動的是filesys.exe (?)。
跟Linux一樣,kerel boot後,指定root filesystem, kernel 用內建node id找到後,找到裡面的init.. load, run。
所以makeimg完,用viewbin -top nk.bin 看 MODULE 只有看到filesys.exe,沒看到tktest.exe。
dir 出來看,tktest.exe 和 filesys.exe 的size一樣大。

download and Run ...
In TKTest
Page size=4096, 13426 total pages, 13402 free pages. 13401 MinFree pages (102400 MaxUsed bytes)
Event created successfully, About to set event
Look, a message from a thread
In thread, loop cnt = 0
In thread, loop cnt = 1
In thread, loop cnt = 2
In thread, loop cnt = 3
...
.成功。

很愚蠢的是 沒有單純build tktest.exe 的方法,tktest\source 中指定target是sharelib,所以build 出來會是 tktest.lib (!!)。
好像是到該folder build -c 後 sysgen ,修改platform.bib後再makeimg就可以..

這樣啟動的kernel,因為filesystem 沒有啟動,所以registry 都沒有用。

好笑的事

今天iThome的新聞..
...面對微軟下一代作業系統Windows Vista推出時程一延再延,與內建的PatchGuard與安全中心(Windows Security Center,WSC)兩項安全機制,許多國內資安業者紛站出來表達心中的不滿。 ..
這個...有點... 好笑。

10.23.2006

CE : Register an INT handler - Thread

Interrupt Handling Process..
用Thread來作
  1. Create an Event
  2. Associate this Event to specific INT
  3. while loop - WaitForSingleObject

讓event 和INT關聯起來的方法: IOCTL_HAL_REQUEST_SYSINTR
argument:
  • lpInBuf : 要"觀照"的 IRQ - 例如...EXT_INT0
  • lpOutBuf : 取得的ID
之後再用 InterruptInitialize ( ) 把剛拿到的ID和Event關聯在一起(跟kernel 註冊)。

但是不知道 .. INT ... sispatch .. int handler .. event .. waitObject thread.. 這個flow 的code再哪裡。

10.21.2006

CE book Notes : Process and IPC objects

以下是"Building Powerful Platform with Windows CE"的筆記..

和大部分的Realtime OS一樣...

Program ,Process,Thread

在Storage中,還沒活化(也就是說,還沒有依照program header alloc memory, 給他用,還沒將run-time 環境設好的狀態)。叫Program。
Program活化後,就叫Process,Process有自己的memory space,OS 用virtual memory的方式為每個process提供自己的memory space,並且保護不讓彼此影響,也不會影響到OS。
Thread是OS scheduler的排程單位,每個Process都是自己的"Pimary Thread",當然,可以create 多個Thread,方便設計,同一個Process的Thread都和share同一個memory space,所以可以互相access彼此宣告的變數。

Thread可以run在kernel mode或是user mode,這是由CE kernel決定的,一般ISR thread會run在kernel mode,其他就run在user mode,kernel mode的thread可以access所有kernel resource,所以也可以crash kernel。

在kernel mode執行的thread 效能會比較好一點,因為減少了access right check的時間。所以如果你很勇敢的話,可以啟動"full kernel mode"選項,讓所有的process (thread) 都run在kernel mode。


Process是用CreateProcess( )來啟動,argument是Process的對應program name,可以在argument中直接指定program所在的path,不然kernel會依照 "WINDOWS", "\","PPSHELL","."。OEM 可以在registry : HKEY_LOCAL_MACHINE\Loader\SystemPath 中寫入search path string。

Thread用CreateThread( )來啟動,argument是thread的function address (pointer),還有一個argument是用來傳遞給這個thread的working space,通常是一個structure。Thread可以啟動在suspend mode,然後用ResumeThread 恢富工作。


Schedler

CE的schedule是preemptive,priority, time-slice base。預設的tread quantum是100ms,OEM可以在kernel 啟動時設定自己要的thread quantum。

每個thread可以有0-255 的priority,0是最高的priority。當有很多thread是相同的priority時,scheduler採用round robin的方式。


Synchronization

和其他RTOS一樣,CE也有Mutex,Semaphore,Events,Critical Section用於IPC的object。每個object在使用前都要用create來取得一個handle作溝通用。thread可以用WaitForSingleObject 或是WaitForMultipleObject 來wait(取得)單一或多個IPC object。
所以syhchronization object的用法通常是宣告一個global variable 的object handle,在還沒使用前create他,然後各thread用這個global variable來操作。

Mutex 就是簡單的互斥物件,CE為了防止programmera acqure到一個mutex後還沒release就又acquire他,設計成"acquire一個已經擁有的mutex時,會馬上return,不會被block..。

Semaphore 可以看作是counting mutex,在create semaphore時可以決定他的available number是多少(32 bit int)。

Events是用來"通知"的object,一個thread可以signle 一個event,讓wait 這個event的thread知道該事件已經發生。CE的設計是:當有多個thread都在wait同一個event,只有第一個wait這個event的thread會return。

Critical Section 用EnterCriticalSection和LeaveCriticalSection來形成一個不會被swap out 的code section。(但是不清楚ISR會不會也被disable)。


Communication between Process


剛剛講的都是Thread之間的IPC,因為同一個process的thread都在同一個memory space,所以可以用共用變數來傳遞IPC object handle。但是在Process間就不能這樣用了,因為Process間有OS的virtual memory 隔開,不互相存取對方的變數。所以Process間的IPC就要用其他的方法。

CE利用Windows Message作為Process間同步的機制,一樣,要使用前,必須要用RegisterWindowsMessage向kernel 索取一個沒有人用的message id,然後用這個message來傳遞資料給其他Process (那其他Process怎麼會知道他要對哪一個Message ID反應?)。

傳遞message時,可以同時包含兩個參數: lParam, wParam。都是DWORD,這也就代表只能傳遞 8 bytes的資料,如果要傳更大的資料,就要先用structure包裝好,然後將structure pointer放在lParam中,但是因為Process間的virtual memory mapping是不同的,所以光傳address過去,對方也取不到你的memory 資料。為此,要使用WM_COPYDATA這一個message來傳遞參數才行,這個message的lParam是COPYDATASTRUCT型別,包含一個pointer和一個size,kernel會負責將size的資料copy到對方的空間。這樣的需求(kernel幫忙處理),就要用SendMessage這一個function來傳遞WM_COPYDATA,讓kernel在將message交到reciver process前,先將data copy好。

pchome : news 2.0 新聞評論網站

最近收到的 Pchome 電子報在每則新聞條目下都會多了一個"我要評論" icon。
進入後就會到PChome的News 2.0網站,雖然還是維持當初PChome 2.0 的"不知如何使用"的網站設計風格,但是從條目上:
  • 標籤
  • 民選頭條
  • 本日10大趣聞
  • 網友評論
大概可以看到,是和最近很有名的hemidemi 有點類似,不過hemidemi的"主體"可以是任意的網頁,blog和新文。
pchome news2.0 好像只能針對新聞而已(不知道所謂的"新聞"是要如何定義)。

使用上有一奇怪的是..從每一個條目,找不到原來的新聞原文。是可以讓user自己寫嗎?

是喔,那我來去找找pchome 亂寄垃圾信的新聞來po看看... :P

about MS Windows Embedde

MS要全面進入Embedded 市場囉(其實有很多地方都已經使用Windows了,從到處出現的"blue screen就可以知道)。

Windows Embedded 大概有幾項產品:
  • CE 6.0
  • XPE for POS
  • Embedded Server
  • XPE
核心其實只有三個:
  • CE
  • XP
  • 2003 Server
真正的Embedded其實只有CE,其他都是現有產品,只是不同的授權策略 (也就是說..同一個東西,嗯,為了特定的市場,採用不同的定價策略..)。

XPE 就是XP,MS另外寫了一個configuration tool,讓designer 自行決定安裝哪些component,以減少footprint (雖然如此,還是很大)。嗯,為了符合Embedded 的需求,另外加上EWF功能。免得到時候產品需要常常"重新安裝"。

XPE for POS其實就是XPE,大概是POS的市場佔Embedded 很大一塊,所以特地從XPE中拉出來另外定價。

Embedded Server其實就是Server 2003,只不過如過真的到retail價格來賣,大概沒人用得起。
面對越來越多用Linux的embedded server,MS不得已只好採用另外的價格。然後又怕將retail的價格打亂,所以Embedded Server的重點是在授權規定上...這個價錢只能用N顆HD喔,這個價錢不能裝上monitor, keyboard喔,這個.....

CE 6.0 的進步...嗯,除了32-32的process, memory 限制消失外,module 間的切割便得比較清楚,所以..MS要隱藏code更容易了(也就代表 designer以後要debug就更難了..)。還有? 多了一些feature..Wifi, BT..

ADS的奇怪符號

奇怪的符號

1. #<+/->數字,代表constant。 如#123, #-123,如果要表示16進制,用#0x123,#-0x123或是#&123, #-&123, 也就是說#後的&符號可以用來代表16進制符號。

2. 小逗點‘ . ’和其他的assembly一樣,一個小點‘ . ’代表compile時的“目前地址”,可以用來作運算。

3. [ ’ 代表IF ,‘ | ’ 代表ELSE, ‘ ] ’ 代表ENDIF。

4. ! ’ 代表INFO

5. RN是用來將register重新命名用, sqr RN r6 意指 :sqr就是r6

6. A,L,S字尾分別代表arithmetic,logical,string。如SETA,SETL,SETS分別代表設定arighmetic, logical, string變數。

7. ADS的Assembler的Operator都是以‘ : ’作開頭和結尾,像 :MOD:代表Mode,:AND:代表AND,:CC:代表Concatenate,其他Operator說明在3-24。

8. % ’ 代表SPACE。如data1 % 255代表在data1開始預留255個byte的空間並把資料清爲0。

9. ^ ’代表MAP

10. # ’ 代表FIELD

11. = ’代表DCB 。 c_string DCB C_string,0

12. & ’代表DCD

13. * ’代表EQU

14. a1-a4 (argument) = r0-r3

15. v1-v8 (variable) = r4-r11

16. sb (static base) = r9

17. sl (stack limit) = r10

18. fp (frame pointer) = r11

19. ip (inter-procedure-call scratch register) = r12

ARM Assembly Pseudo Codes : MAP, FIELD

ARM Assembly 中MAP和FIELD是用來產生類似 C 的"structure" 的資料區塊
  MAP  0x100
A FIELD 16
B FIELD 32
C FIELD 256
以上在位址0x100的地方宣告了一個structure,A的位置是16 byte,B 32 byte,C 256 byte。
和 C的structure一樣,reference 到A時,代表位址0x100,
B 代表位址 0x100 + 0x10
C 代表位址 0x100 + 0x10 + 20

另外比較討厭的是ARM Assembly每個pseudo code幾乎都有一個簡寫符號,MAP是 " ^ ",FIELD是 " # "。

所以上例變成:
  ^  0x100
A # 16
B # 32
C # 256
要注意"#"在instruction 中代表literal。

另外,如果不是在MAP中,要宣告一塊空間,要用 " % ",使用 %符號,該位置由locator決定。

Writting ARM Assembly in Embedded VC

這一篇也是轉貼,因為只有找到這一篇,所以copy下來。
是從packetmatrix forume 看到的一篇 ( http://www.pocketmatrix.com/forums/viewtopic.php?t=4063 )
內容說明在embedded VC++ 內使用assembly language。
專注在ARM。

因為embedded VC++ 的IDE要create source file,沒有assembly filed可以選,還有有關C- Assembly 間的argument passing 規則,不知道MS和ADS一不一樣。
以下就是說明。

------------------------------------------------------------------------------

1) Is there a good book about ARM assembler?
2) Can I use inline assembler in my c code with Embedded Visual C++?
3) Can I see what assembler code the c compiler creates?
4) How do I add an assembley source file to my project, and get EVC to assemble it?
5) How do I write a function in assembler and call it from the c code?
6) How are values passed to and from the assembler function?
7) Can I use any of the 16 registers for anything?
8) Useful resources.


--------------------------------------------------------------------------------

1) Is there a good book about ARM assembler.

ARM System-on-chip architecture (second edition)
Steve Furber
Addison-Wesley

As well as some chapters aimed more at hardware designers, it has an explanation of the ARM instruction set plus a complete reference of the assembler format for each one. It doesnt teach programming in any way, but if you are experienced in c programming and just need full details of the instruction set and info on how the processor works it is great.

2) Can I use inline assembler in my c code with Embedded Visual C++?

There is no supported way of doing this. You need to put your assembler in seperate functions which can be called from your c code. See below for details of how to do this.

3) Can I see what assembler code the c compiler creates?

Yes, and this is very useful for a few reasons. You can see how optimal the code being produced is, and also learn how the compiler does things. You need to:

From the 'Project' menu choose 'Settings'. Go to the 'C/C++' tab. In the 'Category' drop-down-list choose 'Listing Files'. In the 'Listing file type' drop-down-list choose 'Assembley with Source Code'.

Now the compiler will produce .asm files in the output directory which contain the assembler code with the c source as comments.

4) How do I add an assembley source file to my project, and get EVC to assemble it?

Create a blank file 'myfile.asm' in your project directory with notepad. From the menu in EVC select 'Project->Add to Project->Files' set the 'Files of type' field to 'All Files' and select the myfile.asm file. It will appear in the file list on the left, drag it into the 'Source Files' section.

Select 'Project->Settings' from the menu. On the left of the dialog: select the 'ARM release' configuration and select the 'myfile.asm' file. On the right of the dialog: select the 'Custom Build' tab. In the 'Commands' box add the text 'armasm myfile.asm' and in the 'Outputs' box add the text 'myfile.obj'. Repeat this for the 'ARM debug' configuration.

Now you can open and edit myfile.asm from EVC and it will be assembled into your project.

5) How do I write a function in assembler and call it from the c code?

First a note about the assembler source code layout. All command lines should begin with a tab. Any lines that have text on the left are labels. You need to use labels for function names and as targets for branch instructions. Use a semicolon to mark the rest of a line as a comment. The file should finish with an END command.

Example file:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
AREA ArmGfxLib,CODE,READONLY
EXPORT FunctionA
EXPORT FunctionB

FunctionA
MOV r12, sp
stmfd sp!, {r4-r11,lr}

; useful code to do something goes here!

ldmfd sp!, {r4-r11,pc}

FunctionB
MOV r12, sp
stmfd sp!, {r4-r11,lr}

; useful code to do something goes here!

ldmfd sp!, {r4-r11,pc}

END

21 lines; 2 keywds; 0 nums; 32 ops; 0 strs; 0 coms Syntactic Coloring v0.3 - Dan East


Explanation: the AREA command gives a name to this code section. The EXPORT command makes those labels available as functions. The stmfd/ldmfd commands save and restore the registers to the stack, so you dont corrupt values that the calling function depends on.

In your c++ code add the line:

#ifdef ARM
extern "C" void FunctionA(int a, int b);
#endif

The #ifdef is because we have written the function in ARM assembler so it isnt available in MIPS/SH3 builds.

6) How are values passed to and from the assembler function?

If you declare a function of the form:

extern "C" int armfunction(int arg1, int arg2, int arg3, int arg4, int arg5, int arg6);

The first 4 arguments will be passed in the registers r0-r3. These registers will contain the passed values at the start of your assembler function. Further arguments are passed on the stack, see the code below to read them.

The return value should be placed into register r0 at the end of your assembler function (just before you return to the caller).

This works well with int's and pointers (all pointers are 32 bits). If you try and pass a structure directly as an argument it gets more complex. I advise you to only pass/return integers and pointers to/from your assembler functions, at least to start with.

Here is an example function (declared as above) which adds its six arguments and returns the result.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
armfunction
MOV r12, sp ; these two lines are
stmfd sp!, {r4-r11,lr} ; standard setup code

; r0-r3 are the first 4 arguments passed

ldr r4, [r12] ; load 5'th argument into r4
ldr r5, [r12, #4] ; load 6'th argument into r5

add r0, r0, r1 ; r0 = r0 + r1
add r0, r0, r2 ; r0 = r0 + r2
add r0, r0, r3 ; r0 = r0 + r3
add r0, r0, r4 ; r0 = r0 + r4
add r0, r0, r5 ; r0 = r0 + r5

ldmfd sp!, {r4-r11,pc} ; standard cleanup and return code

16 lines; 1 keywds; 3 nums; 52 ops; 0 strs; 0 coms Syntactic Coloring v0.3 - Dan East


7) Can I use any of the 16 registers for anything?

No. You can use r0-r12 and r14 for anything you like. r15 is the program counter, if you write a value to it then execution will jump to that location. Use the branch instruction, dont alter it directly. r13 is the stack pointer, do not alter it unless you are sure you know what you are doing. r14 (which you can use) is the link register. If you want to call another function you need to set this to the return address, I will include an example in a future version of this FAQ.

8) Useful resources.
什麼時候要用?

要用 mcr, mrc 和co-processor instruction 時好像就要用到...

X32 - 建立自動回復光碟

X32 已經在Windows 中的"Access IBM"增加了"建立回復光碟"這一個工具了,
這也就是說...不用再進入bios.. access IBM, F11.. 輸入 FWBACKUP ... 這一些麻煩事了(要是沒有內建燒錄機,還要重新partition, 安裝OS, backup, 燒錄...等等)。

使用這個程式,"我的電腦"中會出現HPA partition,顯示為Z碟,program 會一段時間作解壓縮動作,然後請你選擇妹備份燒錄機(可以用usb 外接燒錄機,很方便喔,不用裝Nero)。

然後就開始燒錄.....

但一片是開機片和一點點resotore 的資料,很奇怪。我放DVD進去,還是燒成CDROM的格式,早知道就用CDROM就好了。
第二片才是DVD格式,燒的滿滿的。

然後就OK啦,燒玩後,program會自動將Z碟再解除,回到原來的隱藏狀態。

燒好的光碟我還沒試過,要等上次pchome送來就DOA的HD回來後才能試..(銀箭線上會還我吧...)。

New Google Reader : More similiar to Bloglines, but..

新的Google Reader介面更像Bloglines了,用起來也很方便,反應也快,還有"share" 功能(在加上"discuss" 就是 web 2.0 ?)。
但是..

subscrible new feed 的功能還是太麻煩了,不像bloglines一樣方便,按下書籤的button就會自動parse網頁,找到 feed 。

所以,還是暫時待在bloglines好了..希望過一陣子Google Reader就會有這個功能了。

10.14.2006

  1. 找到mail - to - blog 的free blog host
  2. 重新註冊失效的account