網路教學(e-Learning)校園社群(e-Community)服務台(e-Service)系所班網(e-Class)登入
位置: 伍柏勲 > 最新文章
qq
by 伍柏勲 2013-12-03 10:01:16, 回應(0), 人氣(585)
上週我們講的 qemu 編譯,各位編譯完了嗎 ?

編譯完的話,理論上你應該可以執行底下指令:

/usr/local/bin/qemu-system-arm -version

/usr/local/bin/qemu-system-arm -version
QEMU emulator version 1.5.0 (qemu-linaro 2013.06), Copyright (c) 2003-2008 Fabrice Bellard

如果此時你再執行 qemu-system-arm -version 的話,會發生什麼事 ?

有些人執行 qemu-system-arm -version,結果會出現系統原始版本之 qemu,如底下所示:

/usr/bin/qemu-system-arm -version
QEMU emulator version 1.1.2 (Debian 1.1.2+dfsg-6a), Copyright (c) 2003-2008 Fabrice Bellard

這是因為搜尋路徑中,/usr/bin 在 /usr/local/bin 之前,因此我們會找到舊版的 qemu,
請各位確定你現在執行的 qemu 是 1.5.0,然後照上回上課最後一小段作練習。

當我們執行

qemu-system-arm -M beagle -nographic -sd sd.img

之後,你可以看到我們的確把 u-boot 的 2013.10 版啟動,這個版本也就是我們上回請各
位下載的版本。

如果各位回憶一下 ARM 開機流程的話,U-boot 開機完之後是要抓什麼東西進來 ?

現在我們所兜的 sd.img 只有 u-boot,沒有 kernel,因此一開機就立刻當機。
               ^^^^^^

這是正常的,我們要再把核心及 rootfs 整合進來即可正常開機。

先前我們已經完成核心編譯,也請各位安裝好一個虛擬的 ARM 版 Debian Linux,因此請
各位確定你現在可以使用 qemu 開 sd.img 後,我們即可開始來兜 sdcard.img
                                                           ^^^^^^^^^^

現在請各位準備一下東西,待會我來教整合系統,請準備以下東西:

1. 編譯完之核心,本週核心版本為 3.4.71
2. 編譯完之 u-boot,其版本是 2013.10
3. 把先前教各位製作的 sdcard.img 檔找出來,其中:
   第一個分割區掛在 /media/sdcard1 目錄
   第二個分割區掛在 /media/sdcard2 目錄

   如果你的系統沒有 /media/sdcard1 /media/sdcard2 目錄,請自行建立。

4. 先前安裝之 arm.img,我們要從其中抽 rootfs 出來。

準備好上述四樣東西,我們即可以開始整合出可以開機的 sdcard.img。

下一節我們開始整理,這個檔案請至 My 數位學習中下載。

各位在掛載 sdcard.img 前,請先確認 sdcard.img 已經完成分割、格式化的流程了,
如果不確定的話,請看之前建立 sdcard.img 的講義!!

如果你的 sdcard.img 已經完成分割、格式化的流程,理論上你現在可以掛載到

/media/sdcard1 /media/sdcard2 目錄!!

5. 現在我們將 arm.img 掛到 /mnt 目錄下

mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt

我們可以使用 df -h /mnt /media/sdcard* 來觀察目前掛載情況,如底下所示:

檔案系統        容量  已用  可用 已用% 掛載點
/dev/loop3      1.9G  693M  1.1G   40% /mnt
/dev/loop1       80M     0   80M    0% /media/sdcard1
/dev/loop2      913M  1.2M  848M    1% /media/sdcard2

接下來我們要將 rootfs 「移植」至 /media/sdcard1 及 /media/sdcard2 目錄,請注意:

/media/sdcard1 只有 80MB,主要存放開機核心及 bootloader,此分割區為 /boot 目錄
/media/sdcard2 才是其它檔案存放目錄


6. 在複製 rootfs 前,我們要了解一下檔案系統,課本的第 7 章有說明整個 Linux
作業系統的目錄樹,在作 rootfs 的移植前,我們要先清除不必要的檔案,以節省空間。
問題是:什麼是不必要的檔案 ?? 請參考部落格

7. 複製檔案:

cd /media/sdcard2

rsync -av /mnt/* .

問題:

a. 為什麼加 -av 參數 ?
b. 為什麼不用 cp 指令來複製檔案,而是用 rsync 來複製檔案 ?

複製完畢後,我們可以看到 /media/sdcard2 已經用了 700 MB 的容量,接下來我們要清
檔案:

cd /media/sdcard2/boot -> 清掉此目錄的主要原因是裡面的核心為舊版!!

rm -f *

cd /media/sdcard2/lib/modules -> 清掉此目錄的主要原因是裡面的核心模組為舊版!!

rm -rf * (加 -r 參數的意義是什麼 ?)

**** 複製完畢再來刪檔案 ****
**** 下刪檔案前請注意你目前的目錄為何 ? 萬一你刪錯自己的 /boot 目錄的話,
     不必來找我,直接重灌!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ****

沒有問題的舉手!

複製完了沒 ?

現在問各位另一個問題,還有哪些檔案可以清掉 ?

我們剛剛清掉的是舊核心及其相關模組,現在有那邊檔案可以刪除「而且」不會影響系統
效能 ?

這個問題作為各位的作業,下週我們再來討論。
請修改 /media/sdcard2/etc/fstab,將其內容改為:

/dev/mmcblk0p2   /     auto   errors=remount-ro   0   1
/dev/mmcblk0p1   /boot auto   defaults            0   0

再修改 /media/sdcard2/etc/inittab,加上底下這行:

T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102


複製新建核心模組:

cd /media/sdcard2/lib/modules

rsync -av ~eecs/qemu_image/kernel/modules/lib/modules/3.4.71 .




接下來我們將 bootloader 及開機核心放回去 /media/sdcard1 目錄
cd /media/sdcard1

cp -a ~eecs/qemu_image/kernel/linux-3.4.71/arch/arm/boot/uImage .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/MLO .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/u-boot .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/u-boot.img .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/u-boot.bin .

uEnv.txt 請至 校內 ftp 的 files 目錄中下載

wget ftp://120.117.72.71/files/uEnv.txt




8. 準備模擬:-> 這個步驟下週再來作,先將 sdcard.img 準備好以便模擬

a. 將 /media/sdcard1 /media/sdcard2 解除掛載
b. 以 losetup -d 將所有 loop 裝置解除連接
losetup -d /dev/loop2
   losetup -d /dev/loop1
   losetup -d /dev/loop0

以 eecs 權限執行底下指令:

qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
        -device usb-mouse -device usb-kbd








speak
by 伍柏勲 2013-06-13 11:30:55, 回應(0), 人氣(339)
#define NOTE_C5  100
#define NOTE_C3  350
int o=0;
int led=9;
int speaker=8;
int y=0;
int q=1;
void setup(){
Serial.begin(9600);
pinMode(led,OUTPUT);
pinMode(speaker,OUTPUT);
}
void loop(){
int readvalue = analogRead(A0);

float x = readvalue * (255.0/1023.0);

int z=x;

if(z==0){
  digitalWrite(led,LOW);
  noTone(8);
  y=0;
}
else if(z>0 && z<255){
y=NOTE_C5+z;
analogWrite(led,z); 
tone(8, y,4);
}
else{
  digitalWrite(led,HIGH);
  speakerr();
 delay(500);
  digitalWrite(led,LOW);
  
 delay(500);
 y=0;
}
  
                        
}

void speakerr(){
  for(int k=0;k<800;k++){
    
  tone(8,NOTE_C3,4);
  }
}
arduino 第一題
by 伍柏勲 2013-05-23 10:22:52, 回應(0), 人氣(410)
int led=9;
int y=0;
int q=1;
void setup(){
Serial.begin(9600);
pinMode(led,OUTPUT);
}
void loop(){
int readvalue = analogRead(A0);

float x = readvalue * (255.0/1023.0);

int z=x;

if(z==0){
  digitalWrite(led,LOW);
}
else if(z>0 && z<255){
y = y + q;
if(y==0 || y==255){
  q = -q;
}
analogWrite(led,y); 
delay(5);
}
else{
  digitalWrite(led,HIGH);
  delay(500);
  digitalWrite(led,LOW);
  delay(500);
}
  
                        
}
>_
by 伍柏勲 2013-05-15 18:05:47, 回應(0), 人氣(349)
int readbyte=0;
int readarray[10];
int count=0;
int i=0;
int q,p;
void setup(){
  Serial.begin(9600);
}
void loop(){

  if(Serial.available() > 0 ) {//如果有資料近來把資料存成陣列
      for(int z=0;z<10;z++){
       readbyte=Serial.read();
       readarray[z]=readbyte;
     
      }  
  
  }

           
p=0;             // 每次都初始確認值
check();        //確定陣列裡面有 "-"
delay(50);
compare();  
delay(50);







}
void check(){
  for(int j=0;j<10;j++){
                          if(readarray[j]==45){
                          p=1;   //如果陣列裡有"-" p值為1
                      }
  }
}

void compare(){
if(readarray[0]==43 && p==1){ 
  i=i+1;
  switch(readarray[i]){
     case 49:
      Serial.print("1aa ");
      break;
      case 50:
      Serial.print("2bb ");
      break;
      case 51:
      Serial.print("3cc ");
      break;
      case 52:
      Serial.print("4dd ");
      break;
      case 53:
      Serial.print("5dd ");
      break;
      case 54:
      Serial.print("6ff ");
      break;
      case 45:
      Serial.println();
      i=0;
      cleararray();
      
      break;
  }
  
}

}


 
   

 
void cleararray(){
for(int z=0;z<10;z++)
{
  readarray[z]=0;
}
}

asd
by 伍柏勲 2012-11-20 22:12:58, 回應(0), 人氣(347)
qqqq
by 伍柏勲 2012-10-26 08:19:50, 回應(0), 人氣(281)
rh232
by 伍柏勲 2012-10-16 11:17:05, 回應(0), 人氣(330)
Dim buf$

Private Sub Command1_Click()
MSComm1.Output = Text1.Text
Text1.Text = ""
End Sub

Private Sub Command2_Click()
buf = MSComm1.Input
If Len(buf) = 0 Then
    Text2.Text = "nothing"
Else
    Text2.Text = buf
End If
End Sub

Private Sub Command3_Click()
Text1.Text = ""
End Sub


Private Sub Command4_Click()
Text2.Text = ""
End Sub

Private Sub Command5_Click()
MSComm1.PortOpen = False
End
End Sub

Private Sub form_load()
MSComm1.PortOpen = True
End Sub

VB BMI
by 伍柏勲 2012-09-29 23:30:14, 回應(0), 人氣(477)
Private Sub Command1_Click()
'-----合格體重判斷
Weightmini = Format((Text1.Text / 100) ^ 2 * 18.5, "0.0")
Weightmax = Format((Text1.Text / 100) ^ 2 * 24, "0.0")
Text4.Text = Str(Weightmini) + "到" + Str(Weightmax)
'-----BMI計算and建議判斷式
tall = Text1.Text / 100
Sum = Text2.Text / (tall * tall)
Text3.Text = Format(Sum, "0.0")
If Text3.Text < 18.5 Then
Text5.Text = "爸媽不給你飯吃麼?"
Shape1.BackColor = &HFF&
ElseIf Text3.Text >= 18.5 And Text3.Text < 24 Then
Text5.Text = "保持不錯 沒有太低或太高!!"
Shape1.BackColor = &HFF00&
ElseIf Text3.Text >= 24 And Text3.Text < 27 Then
Text5.Text = "過重 這不叫胖 這叫勇壯!!"
Shape1.BackColor = &HFF&
ElseIf Text3.Text >= 27 And Text3.Text < 30 Then
Text5.Text = "輕度肥胖 豬 不解釋!!"
Shape1.BackColor = &HFF&
ElseIf Text3.Text >= 30 And Text3.Text < 35 Then
Text5.Text = "中度肥胖 肥豬 不解釋 !!"
Shape1.BackColor = &HFF&
ElseIf Text3.Text >= 35 Then
Text5.Text = "重度肥胖 神豬 不解釋 !!"
Shape1.BackColor = &HFF&
End If
Timer1.Enabled = True
Text9.Text = "手機:0936965525"

End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Command3_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Shape1.BackColor = &HFFFFFF
Label7.Caption = ""
End Sub

Private Sub Form_Load()
Text6.Text = "班級:系統三甲"
Text7.Text = "姓名:伍柏勳"
Text8.Text = "學號:49939058"
End Sub

Private Sub Label10_Click()

End Sub

Private Sub Text10_Change()

End Sub

Private Sub Timer1_Timer()
Label7.Caption = Date + Time
Timer1.Enabled = False
End Sub