2017年9月25日 星期一

WIN10 時間錯誤

Win10自動對時錯誤時,可嘗試更改對時伺服器來解決,如下步驟:

1.控制台->時鐘,語言和區域->日期和時間->設定時間和日期
2.日期和時間->網際網路時間->變更設定
3.網際網路時間設定->伺服器->改為"time.nis.gov"

p.s cmd>control timedate.cpl #可開控制台"啟日期和時間"頁面


2017年9月18日 星期一

[ToolChain]利用RAM DISK加速編譯


  • Ram當成Disk(檔案系統)的一種技術。
  • 假設我要將toolchain放在RAM DISK來加速編譯。
  • 步驟:
      1. 建立RAM DISK
      2. toolchain搬到RAM DISK(註解3
      3. 修改toolchain.def(註解4),設toolcahin路徑對應於2(RAM DISK)底下。
      4. 編譯




  • 註解:
  1. windows軟體(目前沒有CMD): SoftPerfect RamDisk
  2. Linux: 參考linux中RamDisk工作原理
  3. 由於是RAM所以每次開機都要重新搬, 避免每次搬的動作可以將此動作寫在腳本中,假設是cygwin的話可以修改:
           cygwin.bat
             @echo off
            IF EXIST r:\tool-chain4\mipsel-icatchtek-elf\bin\gcc.exe GOTO cygwin
            "C:\Program Files\7-Zip\7z.exe" x -or:\ d:\tool-chain.7z #解壓縮"d:\tool-chain.7z""r:\"
            cygwin
              C:
             chdir C:\CYGWIN\BIN #移到此路徑

              bash --login -I #登入
                          
                       P.S.  也可修改在BASH環境設定檔中參考 [BASH]如何初始化BASH環境設定?
                         
  1. 定義檔,用來設定toolchain的設定以及路徑。

[BASH]如何初始化BASH環境設定?

如何初始化BASH環境設定?

BASH登入流程如下,使用者可透過更改下檔案來初始化環境設定
=>使用者登入BASH -> 執行 /etc/profile ->執行 ~/.bash_profile, ~/.bash_login, ~/.profile


/etc/profile: 全體環境變數,只有root能修改
~/.bash_profile, ~/.bash_login, ~/.profile都是個人設定檔只有login shell會讀)
~/.bashrc: 屬於個人設定檔,non login shell, bash 只會讀此檔案(~/.bashrc 會呼叫 /etc/bashrc 及 /etc/profile.d/*.sh,另外須注意/etc/profile先執行然後才是~/.bashrc )。



2017年9月15日 星期五

[Cygwin] 如何在Cygwin底下跑Dos CMD?

想在cygwin底下列出文件結構,但cygwin沒有類似cmd,
所以可以利用下方式來呼叫dos 的 tree


 /cygdrive/d/works/v35/v35-test/lib
$ cmd /c "tree /F"
列出磁碟區 DATA 的資料夾 PATH
磁碟區序號為 00000200 741B:207C
D:.
└─libxxxx
        xxxx.cc
        xxxx. hh
        Makefile


說明:
  1. cmd 也就是cmd.exe放在C:\Windows\System32
    1. 如何存取原本在 Windows 下的檔案? (磁碟片 a:\ 在 cygwin 底下叫做 /cygdrive/a/)
    2. cmd 表示在此shell(bash)呼叫cmd這個shell.要關掉可以打exit.

'/': windows cmd option 是用'/'linux 是用'-'




/cygdrive/d/works/v35/v35-test
$ cmd /c "help cmd"
啟動一個 Windows 命令直譯器的新例項

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      執行字串中所描述的命令然後結束命令視窗


/cygdrive/d/works/v35/v35-test
$ cmd /c "help tree"
以圖形顯示磁碟機或路徑的資料夾結構。

TREE [drive:][path] [/F] [/A]

   /F   顯示各資料夾中檔案的名稱。
   /A   使用 ASCII 取代擴充字元。


2017年9月14日 星期四

[Makefile][fun] eval

eval就是一個make的解譯器,常與define一起用,由於define只是做展開的動作,
執行時可能會有錯,如下舉一個簡單的例子來說明eval如何parse 巨集。

Makefile:
pointer := pointed_value

define foo #定義foo 巨集 (自訂義函式)
var := 123
arg := $1
$$($1) := ooooo # $1: pointer, $pointer : pointer_value, $pointer_value = ooooo
endef


target:
$(info $(call foo,pointer))
#$(eval $(call foo,pointer))
@echo -----------------------------        
@echo var: $(var), arg: $(arg)
@echo pointer: $(pointer), pointed_value: $(pointed_value)
@echo done.
@echo -----------------------------

$(info $(call foo,pointer)) 結果:
$ make
var := 123
arg := pointer
$(pointer) := ooooo # pointer: pointer, ointer : pointer_value, ointer_value = o
oooo
-----------------------------
var: , arg:
pointer: pointed_value, pointed_value:
done.
-----------------------------

=>
1.  info就是如實的把後面接的(foo 巨集內容)全部都當字串顯示(分隔線之前),並沒有做執行的動作(如assign)
2.  由於沒有做執行的動作,所以echo變數值時,內容為空。

$(eval $(call foo,pointer)) 結果:
$ make
-----------------------------
var: 123, arg: pointer
pointer: pointed_value, pointed_value: ooooo
done.
-----------------------------
=>
evalfoo的內容當作makefile來做解譯並執行,所以echo時有值。



參考:link

[目的檔]目的檔格式

目的檔格式
2017914
下午 10:03

  • 目的檔:
    • 原始檔--編譯-->目的檔--連結-->執行檔
      • 編譯後未連結的機械碼
    • 執行檔與目的檔結構相似,所以在在Windows底下稱為PE-COFFLINUXELF

  • 可執行檔:
  • PC
    PE(Potable Executable)
    Linux
    ELF(Executable and linkable format)
    P.s 都屬於COFF(common object file format)的格式變化
                 

  • 靜態庫(.a),動態連結程式(.so)
    • 一樣是照著ELF的格式儲存。
    • 靜態庫是將很多的目的檔封裝為一個,再加上一些索引。


  • 目的檔可分為四種類型:
  • 可重定位檔(Relocatable file)
    包含資料,程式碼可用來連結成執行檔或共用的目的檔以及靜態庫
    .o, .so, .a
    執行檔(executable file)
    可直接執行的程式
    Bin
    共用目的檔(shared object file)
    包含資料,程式碼。
    1. 可用連接器與其當目的檔產生新的目的檔
    2. 可用動態連接器與執行檔結合做為映像檔來執行。

    .so
    核心傾印檔(core dump file)

    Core dump
  • P.s linux可用 file 命令來查看是哪一種類型


  • 參考:http://sp1.wikidot.com/elfobjfile

2017年9月6日 星期三

[OneNote] Tips


增益集:
載點
用途
說明
Code
安裝:onenote(2013)->執行NoteAddinsSetup .msi->onenote
可上方看到NoteHighLight點開即可使用。

若沒看到的話則:檔案->選項->增益集

問題:
問題
說明
解決方式
無法開啟連結或筆記本
onenote第一次開啟沒開過的筆記本可能出現錯誤
複製連結到
onenote->檔案->開啟舊檔->其他web位置->流覽->檔案名稱("輸入連結在這")
tap鍵無法用


[專案] 如何管理驅動程式

假設有很多種LCD面板,
每個案子可能會用不同的,
這樣的情況有幾個方式可以來管理專案。


方法一: 利用Makefile以及巨集來控制編譯程。
HOST
project.def
LCD_NAME := SONY
CFLAGS += -DLCD_$(GYRO_NAME)=1 //定義程式用FLAG
Makefile
ifneq ($(LCD_NAME ), NONE)
SUBLIBS += $(LCD_DRV_PATH)/liblcd.a
endif

APP
DRIVERS
LCD
Makefile
OBJS :=
ifeq ($(LCD_NAME), SONY) //決定link哪一個obj
OBJS += sony_lcd.o
endif
ifeq ($(LCD_NAME), SAMSUM)
OBJS += samsum_lcd.o
endif

SONY
sony_lcd.c
sony_lcd_on(){};
SAMSUM
samsum_lcd.c
samsum_lcd_on(){};
lcd.h
#if LCD_SONY
#define lcd_on sony_lcd_on     //lcd_on()為上層呼叫的介面
#elif LCD_SAMSUM
#define lcd_on samsum_lcd_on
#endif



註解: 大寫為資料夾,小寫及Makefile為檔案