顯示具有 Tool Chain 標籤的文章。 顯示所有文章
顯示具有 Tool Chain 標籤的文章。 顯示所有文章

2011年4月8日 星期五

Jserv: from Source to Binary -- How GNU Toolchain Works

大神的最新力作, 有用到的人自己去研究研究吧.... :)
from Source to Binary -- How GNU Toolchain Works

引用一下簡介
一開始的切入點是簡單的 "Hello World" 程式,觀察其編譯的方式,探討 GCC 這個 compiler driver 的行為,進而擴展到 binutils 與 libc。不同於教科書的理論呈現方式,我們探討實務上面對的議題,比方說,GCC 設計初期就考慮到多個前端與後端,以及繁複的優化機制,光是 IR (中間表示式) 就歷經多次變革。在 gcc4 之後,再次大幅強化,而議程中則適時給予簡要的案例探討。另外,組譯器也並非我們預想一般單純,實務上還得充分考慮到 relocation 與位址處理的機制,最後才是連結器 / 動態連結器的引入,我們實地觀察了 x86 架構上,GNU/Linux 的執行時期行為。

2011年1月13日 星期四

2010系統層級程式設計簡介與實做

2011/1/12

期末Project評分方式請見:

期末作業評分

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

2010/1/5

期末Project:

期末作業的規範如下:

1. 使用8051當做中央處理的機器,此為模組一,其工作如下:

      1.1 接收來自影像輸入模組的資料。

      1.2 傳送已處理之影像資料至檔案寫入模組。

      1.3 接收來自參數模組織參數決定處理方式,處理動作於接收來自參數模組之訊息後才開始。

              1.3.1 如參數為0, 將每一影像pixel亮度加上20

              1.3.2 如參數為1, 將每一影像pixel亮度加上20

              1.3.3 如參數為2, 將每一影像pixel亮度取sqrt後乘以16

              1.3.4 如參數為3, 將每一影像pixel亮度平方後除以256

      1.4 通知影像輸入模組可以再輸入下一張影像

2. 影像輸入模組,此為模組二,其工作如下:

     2.1 主動輸入一張以YUV格式的影像,檔名由使用者輸入。

     2.2  顯示此一影像

     2.3  通知模組一來接收影像。

     2.4  接收模組一的訊息以示可以處理下一張影像。

3. 檔案寫入模組,此為模組三,其工作如下:

      3.1 接收來自8051處理後的影像資料。

      3.2 根據使用者輸入之檔名寫檔。

      3.3 顯示接收之影像

4. 參數模組,此為模組四,其工作如下:

     4.1 使用者輸入處理參數

      4.2 通知模組一接收參數並開始處理。

在此,不限定模組織間的溝通通道之實作方式,但是,如果以

1. 一個統一的匯流排(Bus)的方式實做(也就是另外設計Bus為模組五),加學期總分三分。

2. 如果定出Bus 的協定(含Timing Diagram)並實做出Cycle Accurate (CA)的Bus模組,再加學期總分五分。

以上加分機制實施後,以總分為99分為成績上現。

期末作業需含完整報告,並附執行檔,將視報告完整度酌量增加評分。如果只有程式以及可執行之執行檔,將只有期末作業50%的分數。

   期末Project期限為11:59:59PM, 1/24, 2011,不再展延。如之前有作業要補交,也請以之為期限,但成績以乘以0.7計。成績將於11:59:59AM, 1/26, 2011公佈在系辦公室公布欄,如有疑義,請在4PM, 1/26, 2011前向助教詢問是否有登記錯誤,之後將不再接受更改。

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

2010/12/20

這是SystemC有關Ports的部分.

請在這裡下載: Ports

有關SystemC Communication的更詳細解說請見: SystemCBook

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

2010/12/17

有關8051的簡介以及工具

請在這裡下載: SCREAM 805,  its toolchain and FPGA Emulator

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

2010/12/15

豪文學長說上星期竟然沒有人把8051 Simulator灌起來,所以實在不知道大家的問題是什麼,請大家趕快動作,因為這個作業最困難之處在於環境的設定。程式倒還是其次。

以下是作業要完成的。

1. 使用 8051 ESL/SystemC Simulator,請先在上面跑一個簡單的程式,然後使用GDB來debug。簡易程式如下:

    main(){

         int i,k,j;

         k=1000;

         j=1000;

         for(i=0:i<k;i++) j- -;

    }

   請觀察j的值是否對了。請注意,要知道j有沒有算對,除了用GDB之外,還可以有什麼方法呢?

2. 使用學長提供的8051環境。學長已經提供了一個範例,那是用一個8051以外的Module與8051之間進行溝通。 請改寫此一範例,將上述程式的迴圈數改變。也就是k的內含值。此一外掛模組的功能是自鍵盤輸入一整數,再將此一數字傳到8051模組已更改回圈數。

3. 請增加一個模組,將8051計算的每一個j的值傳過去,然後寫入一個檔案。

4. 更改8051之程式,讓它可以接受多次的外部回圈數的設定,並保持第3部分之寫檔功能,直到輸入迴圈數為-1為止。

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

2010/12/8

這是SystemC有關Channels的討論與作法

請在這裡下載: Channels

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



2010/11/17

這是SystemC有關Concurrency的討論與作法.

請在這裡下載: Concurrency

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

2010/11/16

這是SystemC有關SC_THREAD與AC_METHOD大致的實作方式與範例.

請在這裡下載: Thread and Method

2010/11/3

這是SystemC有關Main Function以及Module Function的宣告以及大致的實作方式與範例.

請在這裡下載: Structure: Main and Module

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

2010/11/3

這是有關解釋SystemC如何根據時序(Timing)來進行模擬, 因為所有硬體系統都需要跟時序相關的.

請在這裡下載: Timing

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

2010/11/3

這是有關解釋SystemC的資料型態.

請在這裡下載: Data Types

_____________________________________________________

2010/10/21

這次的投影片是講解更多的範例以便讓同學多了解SystemC的寫法,這個投影片也是一般SCREAM Lab的自己內部訓練用的簡易型資料,在此同時也規定了第二次的作業。



請在此下載: System Beginners

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

2010/10/19

對不起,借一下版面,今年的專題指導名單為:

1. 李柏毅

2. 陳政澤

3. 陳奇鴻

4. 林俊緯

假如前面四位有人改變心意的話,那麼

5. 柯旻漢

對不起,耽擱大家。並向沒抽到的說聲抱歉。

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

2010/10/11

這上星期,我們對ESL的重要性做了一點簡單的介紹,為了讓課程的主要進度可以快一點,所以我要先介紹一點SystemC,此一目前的ESL標準程式語言,等大家做了第一個SystemC作業後,再回頭來講ESL的其他觀念。

以下是SystemC的Overview: SystemC Overview

HelloWorld程式範例如下: SystemC HelloWorld Example

範例程式請在這裡下載: SystemC Overview Program Example

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

2010/10/6

作業上傳位址:

ip : 140.116.82.184
port : 21
user:eslcourse
password: scream

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

2010/10/5

這學期,我把上課順序調整一下,先講一點ESL的觀念,然後上SystemC的入門,再回來講完ESL。然後再上其他的課程。

這樣做的用意是8051在其他課程已經再上了,我等一下子再上,其用意只是在於補充一點資料以及我的實驗室所在用的 與8051有關的ESL工具。這是有關ESL的整體的概念性簡介:

Basics of ESL Design and Modeling

第二回上課投影片在此下載: ESL Basics

未來的Topics包含:

SystemC coding and simulation

Review of Verilog coding and simulation

SCREAM8051 and its Toolchain

OpenESL

Heterogeneous Simulation Environment

Simple SoC Design, Modeling and Simulation

HW and Grading: 五個, 分別練習 C++/Threads, 8051 coding, Verilog coding, SystemC coding

Term project: Simple SoC Modeling and Simulation Using 8051/ModelSim/SystemC/Verilog

HW(60%)+Project(40%). 如期末作業未交或兩個作業(或以上)未交則不及格. 作業必須要能正常執行, 否則視同未交.

課程資料:

主要上課資料: 線上投影片(PDF  格式)

參考資料: 1. SCREAM Lab Blog

               2. SCREAM Lab Open Source Blog

               3. SystemC From the Ground

               4. The Guide to SystemC

助教的Email: ProdigyJerry@gmail.com

假如你們還對此一topic想有進一步的了解, 可以Google以下的關鍵字。

1. SystemC Simulation Kernel

2. Advanced OpenESL tool development

3. TLM2.X

4. ARM Processor ESL Model

5. Multi-core Virtual Model

6. Multi-core Programming on Virtual Model

7. Multi-core application programming using CUDA

8. Debugging tool for microprocessors

 

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

我一直覺得SoC設計應該要由資訊系的學生來做才恰當, 但是資訊系的學生一向怕硬體, 為了破除這個問題, 我在2009的下學期的大學部開一門選修課, 課名如標題. 英文標題是:

Introduction to Programming and Tools of Electronic System Level (ESL) Design

我寫了第一階段的投影片, 用意在簡介一下ESL的設計觀念. 如下:

Electronic System Level Design Basics

上面投影片的內容還會再更新,但是可以供大家參考。

因為是大學部的課, 一些基本的東西還是要含蓋一下, 我又不想把課弄得講太多ESL, 可是實務卻做的少. 所以我計劃有一章是基本工具與知識的介紹, 以便在實做term project或Homework時可以用到. 以下是幾個重要的Topics:

1. C++ Basics

2. Threads

3. Processes

4. Verilog HDL Basics and Logic Design

5. HDL Simulator and FPGA

6. SCREAM 8051 and toolchain

7. SCREAM OpenESL

8. Computer Architecture Basics

這一些Topics本來有些是同學在其他課程當中就修過了的,但是假如您覺得自己還不夠清楚,請自己加強一下,老師只負責簡單介紹。

這學期的上課資料多半會跟去年的類似,但是我會在做一些資料的修正與補充。而由於8051的部分,我們的工具經過一年的修正,加上專題學長的努力,bugs已經少很多了,也就是期末的作業會進行得更順暢,在此向上一屆的同學說抱歉,也向負責的學長說謝謝。

最後,我發現同學對微處理機與計算機組織的支是還太弱,這是硬體系統設計的基礎,希望同學多自己加強,另外就是8051的使用也是本學期的重點,希望同學在微處理機課程裡多用功。

2010/9/12

以下是第一回的投影片, 是有關C++, Process與Thread.

請在這裡下載: C++, Process與Thread

新版的投影片請在此下載: C++/Process/Thread

10/14要繳交的作業內容在新板投影片裡。

2010年8月27日 星期五

2010 SCREAM Lab Summer Training Courses

今年規畫的比較晚,大概是因為我生了一場病,之後也比較疏懶一點,不過這傳統還是不希望斷掉。今年的訓練課程偏重實際,但是多增加一點練習,請講師多費心,下學期的多核心課程裡,我希望是這些課程裡部分的延續。

 

9/6 AM: Verilog 講師: 哲榮

9/6 PM: Verilog LAB and ModelSim 講師: 哲榮

9/7 AM: SMIMS FPGA SDK and FPGA Lab 講師: 巴菲特

9/7 PM: SCREAM Lab Multicore Platform/Emulator Programming Front End 講師: 威佐

9/8 AM: Android/QEMU/Cracking HTC Desire  講師: 塞公; SLIM/aSLIM programming 講師: 易聰

9/8 PM: SLIM/aSLIM Lab 講師: 塞公

9/9 AM: SMIMS Android/QEMU/FPGA 講師:君宇

9/9 PM: SMIMS Android/QEMU/FPGA Lab 講師:格銘

9/10 AM: SystemC/OpenESL/Eclipse 講師: 威佐

9/10 PM: SystemC/OpenESL/Eclipse Lab 講師: ruru

 

請Lab的講師出Lab所需的練習題目並提供解答,請Senior學長協助Junior學弟製作課程投影片。

請在9/5以前上傳投影片。投影片請各自開主題,並註明年分,作者,以及分類。並在串裡附上摘要。

2010年1月18日 星期一

系統層級程式設計簡介與實做

1/18, 2010

由於學長在期末作業的tool kits上出了一點小問題, 所以必須延遲kit的上傳時間. 老師在此感到十二萬分的抱歉, 讓大家無法早一點回家放假.  不過為了讓大家的學習可以有一個比較完美的成果, 還是請大家勉為其難一下.

Kit預計在星期三(1/20)上傳. 星期四(1/21)學長會在4263等各位並且做詳細的說明. 原則上, 假如會正確使用套件以及之前的作業都做好了, 那摸應該只需要2~3天就可以完成了.

無論如何, 這是我們的疏失, 所以作業繳交期限延至1/2/2010.

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

1/8, 2010

期末作業注意事項請在這裡下載: Final Project

由於期末作業套件準備不及, 作業繳交時間延後至1/25晚上12點. 請隨時注意套件上傳的資訊.

過去第四與第五個作業還沒交的組, 可以在1/25前繳交. 已經按時繳交的組該作業加5分.

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



1/4/2010

這是關於Ports/Interfaces的最後的一次投影片, 我引用參考資料裡對階層式通道的例子, 這是要進入實做比較複雜的介面, 如AMBA或者是晶片內網路(NOC- Network on Chip)等的時候你所必須採取的方法.

這也是這學期最後的一份投影片, 我把它跟Ports放在一起. 我在之後會將這學期所有的投影片再做一次總整理, 並且會有一份附帶的講義, 預期在半年後放上來, 請各位同學到時候來下載.

請在這裡下載: Hierarchical Channel

最後提醒各位, 期末作業的套件講解是1/7, 請務必來上課.

最後祝大家學習愉快與順利, 也希望這個課程對大家的未來有所幫助, 更希望有更多資訊系同學能投入到這個領域的研究, 假如我上課有不周全的地方, 請大家到這裡留言, 我會想辦法改進, 這樣對以後來修課的同學會更有幫助.

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



12/31

這是SystemC有關Ports的部分. 這次先上傳一部分.

請在這裡下載: Ports

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

12/28

有許多同學在問第五個作業是什麼, 我記得我在課堂上講很多次了.  就是

第四個作業用OpenESL的Command Line模式再做一遍, 用意在讓各位熟悉ESL工具.

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



12/8

這是SystemC有關Communication的部分. 目前完成的部分是Primitive Channels的部分, 其他的會在之後上課前放上來.

本周的作業是將此次投影片裡有關sc_semaphore的範例的其中一個master module改成用method來實做. 請在12/24前繳交.

這一周除了上SystemC之外, 另外要請同學開始試用實驗室宗胤學長開發的8051 SystemC Simulator. 下周品皓學長也會把對應的GDB也做好. 這是期末作業的最重要的元件之一, 請同學一定要熟悉.

下周會請哲榮上OpenESL的使用, 請同學下載試用. 請在Windows XP或Linux環境下使用.

請在這裡下載: Communication Channel

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

12/1

這是SystemC有關Thread與Method更進一步的介紹, 不過也因為還沒完全寫好, 只算是完成70%, 請見諒.

請在這裡下載: Thread and Method

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

12/1

這是SystemC有關Concurrency, 不過因為還沒完全寫好, 只算是完成70%, 請見諒.

請在這裡下載: Concurrency



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

11/25

這是SystemC有關Main Function以及Module Function的宣告以及大致的實作方式與範例.

請在這裡下載: Structure: Main and Module

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

11/25

這是一份 SystemC的Overview, 講一些有關SystemC的基本概念與元件是開發觀念. 有Example提供大家參考.

請在這裡下載: SystemC Overview

範例程式請在這裡下載: SystemC Overview Program Example

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

11/24

這是有關解釋SystemC如何根據時序(Timing)來進行模擬, 因為所有硬體系統都需要跟時序相關的.

請在這裡下載: Timing

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

11/24

這是有關解釋SystemC的資料型態.

請在這裡下載: Data Types

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

11/23

這是OpenESL的投影片, 主要是說明SCREAM Lab所開發的ESL 整合設計環境(IDE)的使用方式.

請在這裡下載: OpenESL

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

11/23

這是SystemC的安裝教學.

請在這裡下載: Installing SystemC

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

11/22

這是簡單的Verilog與Logic Design教學以及ModelSim的用法.

請在這裡下載這三份檔案:

 Using ModelSim

Basic Logic Design

Verilog Basics

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

10/6, 2009

這是第五回的投影片, 是有關SystemC的概念性簡介:

For SystemC Beginners

請在這裡下載: SystemC Beginners

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

9/29, 2009

這是第四回的投影片, 是有關ESL的整體的概念性簡介:

Basics of ESL Design and Modeling

請在這裡下載: ESL Basics

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

9/24

這是第二回的投影片, 是有關8051的簡介以及工具

請在這裡下載: SCREAM 805,  its toolchain and FPGA Emulator

未來的Topics包含:

Review of Verilog coding and simulation

Basics of ESL Design and Modeling

SystemC coding and simulation

OpenESL

Heterogeneous Simulation Environment

Simple SoC Design, Modeling and Simulation

HW and Grading: 五個, 分別練習 C++/Threads, 8051 coding, Verilog coding, SystemC coding

Term project: Simple SoC Modeling and Simulation Using 8051/ModelSim/SystemC

HW(60%)+Project(40%). 如期末作業未交或兩個作業(或以上)未交則不及格. 作業必須要能正常執行, 否則視同未交.



課程資料:

主要上課資料: 線上投影片(PDF  格式)

參考資料: 1. SCREAM Lab Blog 

               2. SCREAM Lab Open Source Blog

               3. SystemC From the Ground

               4. The Guide to SystemC

 

假如你們還對此一topic想有進一步的了解, 相關研究所課程的內容如下, 近期會有一個討論串發佈.

Topics:

1. SystemC Simulation Kernel

2. Advanced OpenESL tool development

3. TLM2.X

4. ARM Processor ESL Model

5. Multi-core Virtual Model

6. Multi-core Programming on Virtual Model

7. Multi-core application programming using CUDA

8. Debugging tool for microprocessors

HW and Grading:

1. 10 to 12 presentations

2. 3 projects

如有作業未交或超過3次presentations未準備者則不及格.

課程資料:

主要上課資料: 線上投影片(PDF  格式)

參考資料: 1. SCREAM Lab Blog 

               2. SCREAM Lab Open Source Blog

               3. SystemC From the Ground

               4. The Guide to SystemC

               5. CUDA

               6. TLM

               7. ARM ESL


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

9/22

這是第一回的投影片, 是有關C++, Process與Thread.

請在這裡下載: C++, Process與Thread

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



9/20

ruru: 請將8051 simulator的用法加在品皓底下post的power point裡再傳給我, 請包含如何跟SystemC銜接的方法.  另外我的ESL Basics有幾張圖要畫一下, 我再寄Powerpoint給你.

宗胤:  請將C++/threads/processes的投影片寄給我. 請你寫一份TLM2.0/2.1的投影片. 一月中會用到, 請你12月完成.



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

7/24, 2009

提醒我自己與大家一下, 該上傳了. 我自承有點怠惰, 會趕快把SystemC的部分一點點補上來.

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

6/18, 2009

投影片我改成PDF檔, 請指教. 請負責的同學記得在7月底上傳投影片.

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

我一直覺得SoC設計應該要由資訊系的學生來做才恰當, 但是資訊系的學生一向怕硬體, 為了破除這個問題, 我預計在下學期的大學部開一門選修課, 課名如標題. 英文標題是:

Introduction to Programming and Tools of Electronic System Level (ESL) Design

我寫了第一階段的投影片, 用意在簡介一下ESL的設計觀念. 如下:

Electronic System Level Design Basics

因為是大學部的課, 一些基本的東西還是要含蓋一下, 我又不想把課弄得講太多ESL, 可是實務卻做的少. 所以我計劃有一章是基本工具與知識的介紹, 以便在實做term project或Homework時可以用到. 我把可能需要介紹的東西以及要負責寫的同學條列如下:

1. C++ Basics: Gary

2. Threads: 塞公

3. Processes: 塞公

4. Verilog HDL Basics and Logic Design: ruru

5. HDL Simulator and FPGA: ruru

6. SCREAM 8051 and toolchain: 品皓

7. SCREAM OpenESL: 小龍

8. Computer Architecture Basics: 品皓

這一部分是:



All programming skills you need to know to master SystemC and learn ESL design together with some useful information

請各位就一個不是懂太多的大學部學生為準則, 盡量寫得讓他們看得懂. 順便幫他們複習一下他們過去學過的, 但是對這門課重要的部分. 不過請不要copy你過去學過的書或講義, 務必是你消化後再寫出來的東西比較好.

接下來我會寫SystemC的部分以及請Gary寫一章TLM2.0的部分. 至於OCP與AMBA, 我還在考慮要不要放進來, 但是還是請ruru準備, 反正都是要寫的.

以上請各位有空可以開始寫了, 我希望大家在七月底可以完成四個Chapters的powerpoint, 並且開始寫書的部分.

以上請各位學長與學姐指教, 如能自願幫忙, 感激不盡.

2009年10月20日 星期二

GDB for 8051 - 品皓

======================11/25=======================

meeting投影片

延續上禮拜做的給做完。之前的loop因為寫得太單調了所以感覺沒用到幾個branch instruction,改的複雜一點就可以看出差別:
Function call -> LJMP, RET
while loop -> SJMP, CJNE
For loop -> SJMP, JNC
If-else -> JZ, JNZ
但仍然有少數的branch instruction我試不出來。最後沒辦法只好寫inline assembly自己測試:
ACALL, AJMP, LCALL, DJNZ, JB, JNB, JBC

======================11/18=======================
實作decoder加入判斷branch目標位子的功能。測試程式我是寫了簡單的while loop, for loop, 和function call來測試,但是看了對應的assembly code發現有些branch指令還是沒測到。之後會直接inline assembly繼續測試。

======================11/10=======================
寫了一個簡的測試程式,把每一行C code設breakpoint測試,都有停下來。同理用next step一步步執行也都有停到預期的program address;除了branch instruction。

因為只能根據目前的instruction長度判斷下一個instruction的位子來設定breakpoint,如果停下的點是branch instruction,則設定的breakpoint位子可能是執行不到的。譬如無限迴圈while(1);在assembly code就只是sjmp當下位子,我breakpoint則會設定到迴圈之外。

簡決方法是單步執行的decoder還必須能判斷branch的位子。

======================11/04=======================
原本Breakpoint的指令是用timer達成,現在已經改成學長的建議用software interrupt: SETB TF0。

上禮拜關於GDB的單步執行(next)會卡死的原因,發現單步執行所給予的breakpoint位子不可能走的到,我判斷是GDB端的問題。GDB處理signal step的地方當初是直接延用bbb的risc32,也就是判斷下一個instruction的位子是目前PC直接+4,所以才會造成GDB會產生一個不可能走到的breakpoint。又因為8051是CISC,下一個instruction的位子等於目前PC值加上目前instruction的長度,所以加上一個簡單的decoder判斷目前instruction的長度。

目前build GDB失敗......

======================10/28=======================

主要是實作8051 stub處理breakpoint的問題。8051 stub接到breakpoint指令後,啟動timer0 interrupt。利用timer interrupt每執行一個instruction都進handle_exception()檢查目前PC值和之前設定的breakpoint是否相同。
不同則表示還沒到breakpoint,return。
相同則表示已經走到breakpoint,進入無限迴圈等待GDB的指令。

目前測試看來是成功的,不過奇怪的是GDB的單步執行(next)會卡死,懷疑可能是GDB端給的program memory address有誤,目前還在debug。
======================10/21=======================

處理breakpoint之前,我想先完成單步執行的功能,因為breakpoint可以利用單步執行,每執行一instruction就比對一次目前的PC值是否和breakpoint table裡任一數值相吻合。

另一方面,GDB的單步執行(next)也差不多是如此;GDB的繼續指行(continue)就是跳出handle_exception繼續執行直到遇到breakpoint後又進去handle_exception。GDB的單步執行(next)則是根據symbol table知道下一步instruction的位子,設定breakpoint在那位子後,繼續執行(continue)。

處理單步執行我是用timer0 interrupt,簡單的驗證方式是觀察每一步的PC差距,更進一步應該是要比對binary code的instruction。還沒完成是因為遇到bug,應該只是個小錯誤,還在debug中。======================10/16=======================
我試著插入breakpoint於測試程式中,觀察設定breakpoint後GDB傳給8051 stub的program memory address內容有誤。直到觀察assembly code才發現某些C code沒有對應的assembly code。

因為我的測試程式寫得太簡單,裡面一些簡單的變數運算可能sdcc判斷為無用。更進一步去觀察測試程式所設定的變數,變數設定太簡單,sdcc會直接定為某個register,而不是給予一個記憶體位子。這樣會間接導致那些變數編譯完後也不存在於symbol table中。

後來變數加入volatile的設定而解決,主要目的是程式對volatile的變數作存取時必須直接到他的位子作讀寫而不是經過暫存器或者cache之類的。這樣的設定也會強制sdcc必須安排volatile的變數一個記憶體位子,而不是定為某個register。

======================10/08=======================
paper投影片

BEE2 是由四個user FPGA和一個control FPGA組成,根據FPGA提供的功能如I/O pins和其要求如供電壓等作設計,最後加上其他周邊硬體如usb, rs232等完成整個平台。
平台裡每個FPGA都加入PowerPC的架構並在control FPGA執行Linux,主要用於控制周邊硬體,監控等。
======================10/06=======================

常常會忘記自己做的東西是很底層的,很多是事情其實直接用inline asm解決即可;也有很多問題是必須trace assembly code才會知道錯誤在哪。

上禮拜是驗證8051 stub回傳的PC是否正確,這禮拜是驗證其他registers(r0-r7 sp)。
驗證方法很簡單,在進入function handle_exception()之前用inline asm隨意指定r0-r7的數值,之後觀察8051 stub回傳的r0-r7和之前指定的數值是否一致。

接下來是之前提到的,回傳的memory數值不正確。
原因是為了8051 stub回傳registers方便,我宣告一些全域變數用來儲存registers的參數;並為了inline asm撰寫方便,宣告時也指定那些全域變數的位子。我本來以為compiler會處理其他(如區域變數)的位子並避開前面我指定位子的全域變數,結果並不會。簡單的判斷方法就是宣告幾個同位子的變數看compiler是否有warning或error。我之所以認為compiler會處理這問題是因為Keil C51就會在變數位子的宣告有重疊時會產生warning,但是我目前用的SDCC卻不會。這問題就會影響到8051 stub回傳memory數值的錯誤,我用以下範例說明。

reg_PC一變數是我宣告用來儲存中斷點的位子,也就是handle_exception function return的位子。所以一開始8051 stub與GDB連線時,stub會進入handle_exception function並回傳所有registers的數值,其中包含PC值,所以在這一點我是直接回傳reg_PC的數值,也是上禮拜用來確定回傳的PC值是否正確的依據。

但是reg_PC也是一個變數可以在symbol table找到,所以可以用指令display reg_PC調出他的數值。用display指令和之前回傳register的方式不太一樣,前者是回傳目標記憶體位子的數值;後者則是直接回傳指定變數的數值。之前會回傳錯誤資訊的原因是因為handle_exception function的區域變數會覆蓋到reg_PC的位子。解決方式就是不要指定位子,全部給compiler分配就好了。

======================9/29========================

8051 stub方面,有個問題是不知道怎麼在C程式裡得到processor暫存器(pc,sp,r0-r7)的資料,後來直接寫inline assembly code來解決。首先宣告一個固定位值的變數如: data unsigned char at 0x20 reg_temp[8],表示變數reg_temp陣列在iram裡的0x20-0x27位子,接著用inline asm 如: mov 0x20, r0 的方式把r0-r7的資料存到reg_temp陣列裡,最後reg_temp就保存了r0-r7的資料了。pc也是用類似的方法,只是inline asm 是用pop push得到進入handle_exception function前的pc值。(handle_exception是stub裡的function,主要是收送GDB端讀寫的封包,一般在程式走到breakpoint會進入的function)

目前我只能驗證stub回傳的pc值是正確的,假設handle_exception function的進入點是在main function裡,可以從symbol table得知main function的起始位子,簡單的計算就可得知stub回傳的pc是否正確了。

接下來的問題是回傳的memory數值不正確,不過應該只是stub哪裡寫錯了,詳細情形我還在找原因。

GDB方面,之前有提到說把register的數值列印出來的指令會導致GDB當掉,原因是出在我GDB裡的TARGET-tdep.c裡對於每個register的宣告上(function enum gdb_regnum)我設定9個register,然而在(function TARGET_analyze_control_transfer)裡分析register裡,也就是switch case裡我少設定一個register,導致找不到那缺少的register case而在default case裡回傳error message的動作。改完後就可以正常的列印出暫存器數值了。

======================8/30========================


debugging stub透過COM port與GDB溝通的方式為RSP(Remote Serial Protocol),其封包格式很簡單: $ddd...#hh。 '$' 是封包的開頭,'ddd...'是十六進位資料且並無限定長度,'#'表示結尾,'hh'為十六進位的兩個checksum。

GDB遠端連線建立好後,會先送出"qSupport",stub收到後回傳"T05"表示停下來的原因是breakpoint,接著stub回傳所有register的資料。以上資訊傳輸完後,GDB就會列印出目前的位值和等待使用者的指令,stub也是在一個無線迴圈內等待GDB的封包。

我目前的遇到的問題是,連線建立後,輸入指令如列印出某暫存器的數值後GDB會死當,根據找的文件是說這可能是BFD那邊的問題,也就是symbol table的問題,真正問題的原因我還在尋找。

至於上個禮拜關於debugging stub回傳暫存器的數值有誤的問題,本來以為燒錄器的問題: 因為同一個程式燒入兩次卻有不同的結果。但是後來請aaa幫忙修理才知道燒錄器沒問題,是晶片at89c51燒壞了。

======================8/24========================

GDB for 8051我想粗分成以下幾個階段:
1. GDB透過COM port能與8051硬體相連,傳輸最基本的功能就是讀寫registers和memory。
2. GDB端的symbol table
3. 支援breakpoint

我目前還在第一階段,想說先架起最基本功能的debugger,可以根據兩端傳輸的資料看出我哪一端有修改錯誤。GDB端要做修改的地方應該比較簡單,主要是修改TARGET-tdep.c和TARGET-dis.c對暫存器的宣告(TARGET=8051)讓GDB認得TARGET的架構;8051硬體端,也就是debugging stub,負責與GDB做溝通,目前最基本的功能就是讀寫暫存器和記憶體。

測試程式方面我是用SDCC (small device c compiler)編譯,產生binary執行檔格式為Intel Hex format。GDB認得這格式為executable file,但是卻會顯示找不到symbol table,因為裡面純粹是程式的資料。不過少了symbol table,GDB應該還是可以讀寫暫存器和記憶體。
目前是卡在debugging stub回傳暫存器的數值有誤,我還在尋找出錯的原因。

第二階段是關於GDB需要的symbol table方面。SDCC編譯C程式可以產生8051的執行檔(Intel Hex Format)和symbol table(CDB format),主要是用於SDCC提供的8051模擬器SDCDB。麻煩的是GDB不支援CDB格式的symbol table,我目前也找不到工具可以將CDB轉成GDB已知的格式如ELF或者COFF等。

GDB認得symbol table的格式定義在BFD,修改BFD讓GDB可以看的懂CDB格式的symbol table,
這應該會是我第二階段要做的。

最後支援breakpoint階段我想等前面的問題釐清後再討論。

======================8/11========================

這是我在meeting時報的paper: Functional Simulation Using Sim-nML
由於時間比較緊迫,我並沒有仔細讀完全部的,上台報告的像是Sim-nML教學。
paper大略的內容是利用Sim-nML語法模擬出一個processor model,作者的Functional Simulator Generator可以parse此model成一個c++的class,並產生一個屬於此processor的simulator。

這simulator可以執行模擬的processor的執行檔,且利用GDB作為介面,remote control這個simulator。

投影片
論文


在meeting的時候提出的討論:
1. (pg. 6) SystemC is targeted more toward system level modeling rather than processor modeling.
對這句話有疑問,systemC不一定就是要用system level來描寫。
2. (pg. 25)—Methods for handling traps and other synchronized events
是指關於interrupt時processor處理的行為,白算盤裡有詳細的解釋。
3. 關於Sim-nML,是有compiler等工具支援,發展至少有十年歷史。

2009年7月16日 星期四

Porting GNU GDB to a new target RISC32-ELF-GDB

Porting GNU GDB to a new target RISC32-ELF-GDB
之前寫了一半文件, 此文件完整度只有30%
不過至少還是有列出大概需要改什麼檔案與編譯時需要注意什麼
留給品皓日後研究與補充
1. 前言
2. 以下所列文件為移值GDB至少必須新增的檔案
3. 編譯GDB
4. 其他



另一份文件是如何使用Eclipse CDT加入自己的toolchain(使用Zylin Embedded CDT)
Using Eclipse CDT and risc32-elf-gdb with RISC32 simulator

OpenESL/ModelSim/QEMU/FPGA

實驗室的OpenESL終於要announce了, 在ESL方面, 或者正確地說, 在HW設計的模擬方面, SCREAM Lab一直致力於異質工具的共同模擬, 過去我們也曾經將Matlab/SIMULINK加到裡面來, 但是, 現在我們要回到正軌來, 也就是 SoC設計的模擬方面. 說到模擬這方面, SCREAM Lab真是有一長串歷史可以交代, 我們接著要做的方像我把它稱之為:

Cyber-Physical-Simulation-Migration(CPSM)



也就是在Cyber Space做的模擬, 可以一部分一部份移到Physical Space去, 這中間做的模擬就叫做Cyber Physical Co-simulation. 由於是一部分一部份移到Physical Space去, 一直到全部的設計都移到Physical Space為止, 所以我叫它做Cyber Physical Migration. 不但是硬體設計, 連軟體的設計也是, 也就是在Cyber Model運做的軟體, 在Physical Space也要一樣可以運作. 這中間牽涉到非常多的轉換(Transformation)與介面(Interfacing)的問題, 所幸SCREAM Lab過去多年來做的一連串的Heterogeneous 與Mixed level simulation, 一堆Code Generation以及辛苦建的Programming/SW tools, 這一天的到來應該不會太遠.

目前的Physical Space的工具有以下幾種可能:

1. FPGA

2. ARM Versatile Platform Board

3. Socle SoC Board (Optional, 因為 2 太貴了)

Cyber Space的工具就多了, 我只列幾項, 有一些要保留一下, 因為還不確定:

1. ESL Platform: OpenESL/CoWare

2. QEMU

3. HDL Simulator

看到這些工具, 有經驗的人就知道SCREAM Lab想要做什麼:

先用比較高階的 QEMU的ARM Versatile PB版跑SW Simulation, 部分原件拉出來在ESL跑, 然後ARM移到ESL, 然後元件移到HDL Simulator, 之後再移到FPGA, 最後所有東西移到FPGA. 中間經過的順序以及要經過多少步驟要視狀況而定.

所以Long目前要補足一些SCREAM Lab所缺的主要區塊:

1. HDL Simulator with ESL Platform

2. QEMU with ESL Platform

我的計劃是用OpenESL來當一切的轉接/轉運站, 舉凡data交換, protocol, ..., 等都是它. 只要建立好通道(channel), 以及準備好一堆Code Generation tools, 在一定的Framework下設計, 應該不難達到.

希望Long八月份可以把HDL Simulator打通, 接著回到QEMU來. 今年內應該可以看到一些成果的.

2009年2月4日 星期三

Coware v2007.1.2

我剛把CoWare 2007年版的裝進去WS
使用時請先source 一下 設定檔,指令如下:
ooxx@WS>source /etc/skel/CoWare.csh
然後要使用的時候,只要在你的目錄下打
ooxx@WS>pct &
就可以開始用了
Have Fun!

2008年12月4日 星期四

Semihosting

在Embedded System在Debug Software的時後
常常會利用printf把資料秀出來

一般來講, 開發環境都是在Host PC上
所以比較方便的作法, 秀出來的訊息是顯示在Host端
ARM會利用Semihosting這種技術, 把I/O的資料導回Host端

Semihosting另一個用途就當是Target沒有完整的I/O環境 (例如檔案系統)
就可以利用Host端的檔案系統來加快開發速度

參考資料

裡面有另一篇Conference Paper有不一樣的方法來Model I/O Device
ㄚ凡你找個時間看一下~