Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« November 2008 | (回到Blog入口) | January 2009 »

December 2008 歸檔

December 14, 2008

Linux 驅動程式的 scheduling 觀念, #1:

本週進行「Linux Device Drivers: Jollen 的 10 堂課」教育訓練,發現有些同學對於作業系統的「排程(scheduling)」觀念仍有些疑問,因此,在課程中以三段小程式來說明「什麼是排程」,以協助同學建立紮實的排程觀念。

以下是一段正常的 open system call 實作:

int card_open(struct inode *inode, struct file *filp)
{
	return 0;
}

當 process 開啟 device file 後,因為 kernel-space 的 open system call 實作會直接 return,因此 CPU 會切換至前景(foreground)、 process 繼續往下執行。

第二段是不正確的 open system call 實作:

int card_open(struct inode *inode, struct file *filp)
{
	while (1);
	return 0;
}

當 process 開啟 device file 後,因為 CPU 切換至後景(background),但是在 OS 裡頭的 open system call 實作是一個無窮迴圈,OS 並沒有做 system call 的返回,因此 CPU 並不會切換到前景,所以,電腦感覺起來呈現「當機」狀態。

因為 CPU 的時間無法切換到前景,因此任何的 process 都無法執行,電腦當然沒有任何反應。這裡,可沒有所謂的「time slice」與「context switch」的觀念與動作。請同學思考:作業系統是對 process 做排程。

最後一段程式,我們加入了呼叫排程器的動作:

int card_open(struct inode *inode, struct file *filp)
{
	while (1)
		schedule();
	return 0;
}

schedule() 是排程器主函數,等於是主動呼叫 scheduler 做 re-scheduling。在這個情況下,雖然 OS 仍然沒有做 system call 返回,但因為我們以「手排」的方式做排程,因此 CPU 會換切到前景,前景程式就會被分配時間執行,因此,電腦仍然有反應。

唯一要注意的地方是,因為這一個 open system call 並沒有 return,所以原來的 process 並不會繼續往下執行。利用三段簡單的程式碼,對作業系統的排程觀念做了一次討論,對於建立「什麼是 scheduling」的觀念,是很有幫助的。

December 29, 2008

Jollen 的Android 教學,#1: Android 應用程式模式

Android 應用程式的模式(application model),可由以下幾個觀念講起。在真正進入 Android 程式設計前,必須先了解以下幾個名詞觀念。

1. Android package(.apk)

Android 應用程式套件,包含應用程式本身,以及相關的資源檔案。將 apk 套件下載到 Android 手機後,即可安裝至手機上。Android Development Kit 可自動將 apk 套件下載至模擬器或實體手機。

2. task

Task 就是「應用程式」本身,也就是 Android 手機上的圖示,使用者可點擊圖示啟動 task。從開發者的角度來看,task就是一個或多個 activities。

3. process

Process 在作業系統的定義上,指的是「執行中的程式」,在 Android 的應用程式模式中,代表的是低階的執行程式,也就是系統層(kernel)的部份。一個 apk 套件裡的所有程式,都是在一個 process 裡執行。

4. 什麼是 Activity(android.app.Activity)

簡單來說,這昰一個與使用者互動的物件。一個 Activity 類別(class)負責建立視窗(window),我們可以透過 View 類別將UI放置在視窗上。

當 Activity 被啟動(active)或執行(running)時,就是在 foreground(前景)模式,在 foreground 模式的 Activity 會被顯示在螢幕上。

當執行中的 Activity 部份畫面被其他 Activity 蓋掉時,該 Activity 便被暫停(paused),被暫停的 Activity 在系統記億體不足時,便會被清除(kill)。只被蓋掉部份畫面,或是變成透明狀況的 Activity 不會停止,只會進入暫停狀態。

當執行中的 Activity 全部畫面都被其他 Activity 取代時,該 Activity 便被停止(stopped),當系統需要記憶體時,停止中的 Activity 會先被系統清除。

當系統需要清除 Activity 時,系統會要求 Activity 自行結束,或是直接殺掉 Activity 的 process。

5. 什麼是 View(android.app.View)

簡單來說,android.app.View 類別就是手機的 UI。View 負責繪製UI與處理事件(event),Android 利用 View 打造出所謂的 Widgets(元件),利用 Widget 可打造出互動式的使用者介面(interactive GUI)。

Android 應用程式的 UI 從程式碼的角度來看,就是一顆「view tree」,程式設計師可以利用直接撰寫程式碼,或是透過「XML layout」檔的方式,來安排應用程式的 view tree。

另外,還有一個特殊的 View 類別,稱為 ViewGroup(android.view.ViewGrup)。ViewGroup 是一種特別的 View,可以用來「裝載」其他的 View,對 ViewGroup 而言,這些被包含起來的 View 為 Children。

6. Process Types

在一般情況下,Android 應用程式都有一個自已的 Linux process。

在 Android 系統裡,process 的生命週期並不是直接由 Android 應用程式本身來決定,而是由系統來決定,也因此,Android 應用程式的開發者必須正確地撰寫程式碼,並使用 Android 的元件(component),否則系統不管應用程式是否仍在執行,仍會將應用程式的 process 清除(kill)掉。

Android 的 process 有五種類型:foreground process、visible process、service process、background process 與 empty process。

Jollen 的 Android 教學,#2: “Hello Moko” - Activity 與 View 的關係

上一則文章介紹了 Activity 與 View 的觀念,若能再理解 Activity 與 View 的關係,就不難了解 Android 應用程式的整個模式了。請看以下的範例程式:

package com.moko.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloMoko extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       TextView tv = new TextView(this);
       tv.setText("Hello Moko");
       setContentView(tv);
   }
}

這是在 Android SDK 文件裡的一段範例程式,類別 HelloAndroid 繼自 Activity。下圖是Activity的生命週期(lifecycle)。在「Jollen 的 Android 教學,#1」裡提到 Activity 負責建立視窗,根據 Activity lifecycle,當視窗建立時,onCreate 事件被觸發,所以我們在 onCreate 裡建立 View。

activity_lifecycle.png

TextView 是 Android 的其中一個 View,故名思義,這是一個顯示文字的 View。最後,呼叫 Activity 的 method 'setContentView' 來將 UI 顯示於視窗上。

Jollen 的 Android 教學,#3: 第一個 Android 專案

初步了解如何撰寫第一個 Android 應用程式後,接著就可以實際來建立我們的第一個 Android 專案了。Android Development Kit(ADT)使用 Eclipse 整合式開發環境,根據 Android SDK 裡的文件說明,先安裝 Eclipse 以及 ADT,然後建立一個新專案(File -> New -> Project),並選擇「Android Project」,如圖1。

new_project_1.png
圖1:建立 Android Project

接著輸入專案屬性:

1. Package name:Java 套件名稱,在這裡我們將應用程式的套件命名為 com.moko.hello。
2. Activity name:輸入應用程式的 Activity 類別名稱,建立一個繼承 Activity 的新類別。
3. Application name:輸入應用程式名稱,即應用程式標題。

new_project_2.png
圖2:輸入專案屬性

建立新專案後,在主程式 HelloMoko.java 撰寫第一個 Android 應用程式如圖3。第一個 Android 應用程式在 Activity 上顯示一個 View。

new_project_3.png
圖3:第一個 Android 應用程式

設計好的應用程式可以使用 Android 模擬器來執行。Android Development Kit 也將 Android 實體手機整合在開發環境裡,因此,我們實際以 T-Mobile G1 手機(全球第一支 Google phone)來做測試。

選取 Run -> Run Configurations 後,可以看到圖4的設定選單。在「Project:」欄位選取「Browse...」選取我們的 Android 專案 - HelloMoko,然後點選「Apply」套用設定。

new_project_4.png
圖4:設定 Run Configurations

接著點選「Target」標籤,將「Device Target Selection Mode」設定為「Manual」,然後點選「Run」執行 Android 專案。在執行專案前,請先將手機連接到電腦。

new_project_5.png
圖5:設定 Target

最後,可以看到圖6的畫面,Android Development Kit 會自動偵測 Android 手機。選取手機後按「OK」,Android Development Kit 就會自動編譯專案,並將應用程式打包成 apk 套件後下載到手機上執行。

除了 G1 手機外,Openmoko 的 Neo FreeRunner 也能執行 Android 系統,Android Development Kit 也能偵測到 Neo FreeRunner 並自動將套件下載到 Neo FreeRunner 上安裝執行。

new_project_6.png
圖6:選擇 Android 手機

在 Eclipse 的訊息窗裡,可以看到 apk 套件的下載、安裝以及執行過程的完整訊息:

[2008-12-29 16:51:29 - HelloMoko] ------------------------------
[2008-12-29 16:51:29 - HelloMoko] Android Launch!
[2008-12-29 16:51:29 - HelloMoko] adb is running normally.
[2008-12-29 16:51:29 - HelloMoko] Launching: com.moko.hello.HelloMoko
[2008-12-29 16:51:32 - HelloMoko] Uploading HelloMoko.apk onto device 'HT843GZ46367'
[2008-12-29 16:51:32 - HelloMoko] Installing HelloMoko.apk...
[2008-12-29 16:51:35 - HelloMoko] Success!
[2008-12-29 16:51:35 - HelloMoko] Starting activity com.moko.hello.HelloMoko on device 
[2008-12-29 16:51:36 - HelloMoko] ActivityManager: Starting: Intent { comp={com.moko.hello/com.moko.hello.HelloMoko} }

延伸閱讀

* 2008.11.21: 安裝 Android 應用程式(apk)至 Neo FreeRunner

關於 December 2008

此頁面包含了在December 2008發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 November 2008

後一個存檔 January 2009

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org