2016年6月7日 星期二

自訂debug log

實作方法如下
#define AAC_DEBUG(fmt, arg...)  \
        printk("AAC: [%s] " fmt , __func__ , ##arg)

參考以下網址
http://magicparty-playandlearn.blogspot.tw/2012/05/linux-driverdebug-message-debug.html

2016年5月4日 星期三

C fread方法及計算file size



size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

由檔案系統讀出一串資料,明確講是由檔案系統指標 stream 讀出 count 的 size bytes 的 array, fread ( ) 讀出後會自動地將檔案系統指標 stream 增加 count*size bytes 為新指標位置;

獲得File size方式


long lSize;
// obtain file size: fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile);


參考:

http://knowledge-teaching.blogspot.tw/2012/11/c-fread-fget.html

2016年4月6日 星期三

Android SElinux 增加方式

當從logcat log中看到如下
KERNEL  : [  346.736862] type=1400 audit(1459928377.450:42): avc: denied { write } for pid=5371 comm="app_process" name="system@framework@boot.art" de
context=u:r:dumpstate:s0 tcontext=u:object_r:dalvikcache_data_file:s0 tclass=file permissive=1


在SElinux(xxxx.te)檔中加入以下的權限
allow dumpstate dalvikcache_data_file:file write;

第一個參數為domain 
第二個參數為tcontext=u:object_r:dalvikcache_data_file:s0,故要加入dalvikcache_data_file
第三個參數為tclass=file,故要加入file

2015年10月20日 星期二

Semaphore、mutex、spin lock

Semapore: 一件可容納N人的房間,當人滿了,就要等待人在出來;當N=1稱binary semapore。一般用法用於限制對於某一資源的同時訪問。
進行Sem操作是讓系統進入sleep

Semapore透過原子的方式來進行加減,可看做為一個counter;用來計數有多少個剩餘資源或多少process在等待。

Mutex: Mutex是一把鑰匙,一個拿了就可進入一個房間,出來的時候將鑰匙交給隊列的第一個。一般用法用於串列化對critical section的訪問,保證這代碼不會被並行(concurrency)的運用。

Spin lock:spinlock利用test and set這個指令看有沒有辦法取得lock 因為是指令層級的操作所以有辦法達到atomic當lock無法取得時會用polling的方式不斷嘗試特別的地方是當他取得lock時 process將不會進入睡眠(沒有context switch)
這有幾個好處
  1. 效能會比semaphore好 因為他不做context switch可以一直執行
  2. 在SMP環境中 因為process不會進入睡眠 無法執行其他process或處理interrupt會將工作分擔給其他cpu(但在單cpu情況下就像是disable interrup)

Ref:

  1. http://fanli7.net/a/caozuoxitong/Linux/20111201/148928.html
  2. http://elehsaing.blogspot.tw/2014/05/semaphore-vs-mutex-vs-spinlock.html
  3. http://orzlab.blogspot.tw/2007/03/mutex.html


2015年10月18日 星期日

C Callback function



C語言裡面的Callback function主要的概念就是:

傳回某個函數的指標,呼叫者即可透過該函數指標直接執行函數…


參考網路上的範例

//宣告callback function的prototype(原型)

typedef struct{

uint8_t time ;

void (*bsp_callback)(void);

}Display_Info_struct;


//宣告該struct的變數 DisplayInfo

static Display_Info_struct DisplayInfo;


//定義會被呼叫的函式

void showHelloword()

{

printf("Hello world.\n");

}


//定義會使用CallBack Fuction的函式

void BSP_SHOW(uint8_t time,void (*callback)(void))

{

DisplayInfo.time = time;

DisplayInfo.bsp_callback = callback;

while(DisplayInfo.time > 0){

--DisplayInfo.time;

if(DisplayInfo.bsp_time == 0){

//呼叫callback function

if(DisplayInfo.bsp_callback)

DisplayInfo.bsp_callback();

//清除callback fuction

DisplayInfo.bsp_callback = 0;

}

delay_ms(1000); // 1 second

}

}


//由main執行的呼叫點起始

void main(){

//顯示10秒的hello word字串

BSP_SHOW( 10, showHelloword);

}


Ref.

http://eeepage.info/examplecallback-function/

2015年8月31日 星期一

Linux .vimrc&powerline及自訂linux指令

剛裝好Linux OS預先設定適合自己的.vimrc

1. .vimrc(vim設定檔)
網路上範例非常多或參考
https://github.com/JackABK/vimrc_setting


2. power line(直接看git當前的branch)
https://github.com/b-ryan/powerline-shell
網路上範例也十分多

安裝玩power line需在.bashrc增加已下指令
function _update_ps1() {
       export PS1="$(~/powerline-shell-master/powerline-shell.py --mode flat $?)"
}

export PROMPT_COMMAND="_update_ps1"

主要讓他去讀取powerline所在的資料夾

3. 自訂指令linux組合指令
例如ls -al
可依自己習慣簡化喜歡的指令,例如這邊簡化為ll

在.bashrc內設定如下
alias ll='ls -al'

2015年8月27日 星期四

Android framework debug for android 5.0

使用Log.isLoggable打開framework log

網路上教學許多,在此列最後成功的方式(方法2)

方法有兩種

1. setprop
使用更改property的方式去設定,但很多log無法套用,因在build boot的時候已經設定完property,故此方法參考就好不一定管用。

adb root
adb remount
adb shell setprop log.tag.[TAG] DEBUG

其第三條指令如下
log.tag.TAG Level
TAG:你要打開的framework TAG
Level:在framework level有
VERBOSE(2)、DEBUG(3)、INFO(4)、WARN(5)、ERROR(6)、ASSERT(7)

isLoggable默認level為android.util.Log.INFO
只有讓level >= INFO才能正確輸出

例如
private static final String TAG = "AudioService";
protected static final boolean DEBUG_VOL = Log.isLoggable(TAG + ".VOL", Log.DEBUG);

所以你的指令要是這樣才有效
adb shell setprop log.tag.AudioService DEBUG
or
adb shell setprop log.tag.AudioService VERBOSE
因為這樣會把VERBOSE以上的LOG設定為true


以上設定,經由重新開機設定會失效。

2.利用local.prop(此方法為一次寫死,效果十足)

首先先建立一個local.prop,其內容如下
log.tag.TAG=DEBUG       (= 一定要加)
ex: log.tag.AudioService DEBUG

adb root
adb remount
adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot

此方式重開機以後,就能成功把你要的framework log打開了。