實作方法如下
#define AAC_DEBUG(fmt, arg...) \
printk("AAC: [%s] " fmt , __func__ , ##arg)
參考以下網址
http://magicparty-playandlearn.blogspot.tw/2012/05/linux-driverdebug-message-debug.html
Jeffery部落
2016年6月7日 星期二
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
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)
這有幾個好處
Ref:
進行Sem操作是讓系統進入sleep
Semapore透過原子的方式來進行加減,可看做為一個counter;用來計數有多少個剩餘資源或多少process在等待。
Mutex: Mutex是一把鑰匙,一個拿了就可進入一個房間,出來的時候將鑰匙交給隊列的第一個。一般用法用於串列化對critical section的訪問,保證這代碼不會被並行(concurrency)的運用。
Spin lock:spinlock利用test and set這個指令看有沒有辦法取得lock 因為是指令層級的操作所以有辦法達到atomic當lock無法取得時會用polling的方式不斷嘗試特別的地方是當他取得lock時 process將不會進入睡眠(沒有context switch)
這有幾個好處
- 效能會比semaphore好 因為他不做context switch可以一直執行
- 在SMP環境中 因為process不會進入睡眠 無法執行其他process或處理interrupt會將工作分擔給其他cpu(但在單cpu情況下就像是disable interrup)
Ref:
- http://fanli7.net/a/caozuoxitong/Linux/20111201/148928.html
- http://elehsaing.blogspot.tw/2014/05/semaphore-vs-mutex-vs-spinlock.html
- 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'
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打開了。
網路上教學許多,在此列最後成功的方式(方法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打開了。
訂閱:
文章 (Atom)