2019年9月6日 星期五

常用數學符號的 LaTeX 表示方法


在jupyter notebook 插入LaTeX數學公式, 前後要包 $$..............$$


## Euclidean and Cosine distance
Euclidean:  $$d(x,y)=\sqrt{\sum^n_{i=1}(x_i - y_i)^2}$$

Cosine:  $$\theta(x,y)=\frac{x \bullet y}{ \sqrt{x \bullet x} \sqrt{y \bullet y}}$$


常用數學符號的 LaTeX 表示方法
http://mohu.org/info/symbols/symbols.htm

Online LaTeX Equation Editor - create, integrate and download
https://latex.codecogs.com/eqneditor/editor.php
About LaTeX 
很多論文及科學文章都會用到LaTeX。它是一個公式編輯系統,使用簡單的指令構建出專業的數學公式。


Markdown Cell內容




輸出結果




如果公式不要換行,則只要使用一個$去包,Letex

$\alpha$ 愈小等同於Linear Regression

在Jupyter Notebook 輸出會像這樣



2019年8月16日 星期五

Raspberry Pi Mail Box--tag buffer


Raspberry Pi Mailbox的機制是你CPU 送出Request所用的buffer , 在GPU Response 回來時是會被修改的.因為使用的是同一塊Buffer, 所以Request傳送的資料佔了幾個byte (bit 30:0 Value Length)及 Response回來有多少個byte ,在送出Request就要決定了
 value buffer 的大小一定是max(Request data length, Response data length)




value buffer size in bytes 是指value buffer的大小;
  value length in bytes 是請求欄位佔幾個Byte



ARM Bare metal 開發課程連結

2019年8月14日 星期三

Linux GPIO Host Controller驅動程式



目前課程影片進行到CH3-3 Linux GPIO Host Controller驅動程式,有一些問題如下:

  1. 01_LED中chr_led.c使用gpio_set_value對GPIO Pin設定輸出值,往Kernel Source Code追: gpio_set_value -> __gpio_set_value -> gpiod_set_raw_value -> _gpiod_set_raw_value ->


    static void _gpiod_set_raw_value(struct gpio_desc *desc, bool value)
    {
            struct gpio_chip        *chip;

            chip = desc->chip;
            trace_gpio_value(desc_to_gpio(desc), 0, value);
            if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
                    _gpio_set_open_drain_value(desc, value);
            else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
                    _gpio_set_open_source_value(desc, value);
            else
                    chip->set(chip, gpio_chip_hwgpio(desc), value);
    }

    追到最後是課程影片中提到的struct gpio_chip,但是課程提供的Image中找不到bcm2708_gpio.c這個檔案,struct gpio_chip中的function應該都是實作在這個檔案中?
        ~/linux-rpi-4.4.y/drivers/bcma/driver_gpio.c  ==> gpio chip driver 
  1. 根據課程影片,gpio_set_value是上層API,由Kernel定義。struct gpio_chip中的function pointer實作則為底層硬體相關,這個部分理論上應該是SoC廠實作並提供給客戶嗎?想知道業界實務上怎麼分配?實務上,如果拿到一塊公版,SoC Vendor會提供整包Linux或Android Source Code,我們只需要針對自己選擇的外接硬體寫驅動程式嗎?
       
            
  1. SoC Vendor是否連Driver Template都會一起提供於整包OS Source Code中,只需要修改對應硬體部分?譬如,選擇的Display不同,選擇的Sensor不同,只需要在module_init()中修改初始化代碼?

             晶片廠通常提供的BSP ,會做好大部份SoC Driver. 若是自己自行外接的, 則要靠自己去撰寫或移植

             同類型硬體其Driver 寫法差異不大,所以可以參考現有的code去修改即可.. 

2019年8月12日 星期一

如何界定User Space Driver和Kernel Space Driver?



課程提供的Image中有一個bcm2835_clibbcm2835_clib資料夾,裡面有兩個資料夾。其中一個example應該是控制IT Shield上面不同External Device的Source Code。另一個src資料夾是不是類似"SoC HAL或BSP"之類的腳色,看起來比較像HAL,因為沒有包成板上Device控制的API,而是SoC Peripheral? 這是底層的HAL code 供上層使用 其中,下面的程式碼中為什麼是MAP_FAILED,而不是BCM2835_GPIO_BASEADDR之類的暫存器位置,而且找不到MAP_FAILED這個MACRO的定義 bcm2835_init () 會給正確值 另外,這樣子的寫法如果理解沒有錯誤,應該是Base Metal的寫法。為什麼blink.c編譯出來的執行檔可以直接執行? 這樣是不是等於不是走syscall -> LDD的方式,這樣Kernel怎麼管理這種Process? 這種方式如何界定User Space和Kernel Space? 這是User Space Driver 的寫法.. Kernel 只當它是一般User Process來管理..所以無法像Kernel Space Driver可以在底層做設備管理
User Space Driver 作法可以走 device file 的方式, 也可以用mmap(2)方式來操作SFR (special function register) . 細節可以自行參考 bcm2835_init () 函式

2019年8月6日 星期二

將vim預設語法Highlight 打開



sudo apt-get install vim

將vim開啓程式,預設即是語法Highlight 打開 (syntax highlighting in vim)

修改 vim $HOME/.vimrc


加入這一行

syntax on

存檔離開

2019年8月5日 星期一

boot code 說明


有個問題請教一下
Linker Start up code那個章節 56分:28秒的那一段
1. For broad com的bootloader,是不是也應該會把vector table copy to RAM 0x00的位置?
2. Power on and Reset 是一樣的嗎? 都會直接執行RAM上面0x00的位置? 還是Power on的時候會從走一次bootloader,然後copy vector table to RAM 0x00.

    每個系統有其 PowerOn 啓動流程,如從ROM, EEPROM, NOR Flash或特定bootable devcie開機.執行boot code
    接著會去初始化了SDARM, 再將boot code 前面幾行複製到SDRAM 0x0位址 (實際上內容就是Exception Vector Table及Exception handler), 接著再觸發ARM Reset ,就進入ARM Reset 這就是CPU Reset標準流程.  

是會有誰把vector table copy過去才對。但影片中說reset一開始就跑0x00,0x00要有instructions.讓我聽得有點模糊。reset的時候 , RAM的內容都還保留著? 只有Power on and Power on的情況才會重新從bootloader copy vector table to RAM?
  Power ON流程中就會重新copy vector table from ROM to RAM的動作. 所以RAM的內容會被換掉
  Vector table 是描述於ROM裡程式碼中,這些內容會被複制到RAM中

我想知道一般broadcom的bootloader,不含我們bootloader的流程。到底有沒有copy vector table to RAM 0x00,以及power on/off and reset是否一樣?
如果不一樣,是否power on/off, bootloader會重新copy vector table to RAM, 至於reset是用之前已經copy過存留在RAM的vector table.

  


還有一個問題,RAM and ROM share 相同的位置空間嗎? 不同空間 
課程中常提到 0x8000 and 0x0。這個位置 是RAM 還是 ROM。當我拿到一個位置的時候,我怎麼知道他是RAM還是ROM還是某個peripheral?
   
    0x8000 and 0x0 都是RAM 

   詳看晶片手冊..一般 memory map 會告訴你address指的是什麼....