本文基於公司
uclinux
核心,詳細講述
3代終端
gpioctrl
的原理及應用。
arm linux
的系統中斷採用產生軟中斷,查詢系統呼叫表,呼叫系統呼叫函式的方式實現系統呼叫。
先講述,如何去查詢
gpioctrl
函式的實現。
1.通過查詢,找到函式定義。
在sg2klib.c
裡,有如下定義:
_syscall3(int,gpioctrl, int, op, int, addr, int, value)
_syscall3
是乙個巨集定義,如下:
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)/
type name(type1 arg1,type2 arg2,type3 arg3)
這個巨集定義,用來定義乙個內聯彙編的函式。名稱為
name
,傳入3
個引數arg1
、arg2
、arg3等3
個引數,並返回
type
型別資料。
說明:%0
:即__res
的引用%1、%2
、%3:輸入運算元,
arg1
、arg2
、arg3
的引用第乙個冒號:輸出運算元,「
=r」約束操作束,說明運算元是輸出運算元。
第二個冒號:輸入運算元,「
r」指定將運算元儲存在暫存器中。
第三個冒號:告訴編譯器將在內聯彙編中修改
"r0","r1","r2","lr"
的值,這樣
gcc
就不使用該暫存器儲存任何其它的值。
通過上述巨集定義,即可定義乙個函式
int gpioctrl(int op, int addr, int value);
函式功能是產生軟中斷,呼叫相應系統呼叫函式,並傳入引數r0、
r1、r2,返回值r0。
注意__syscall(name)
、__syscall_return
也是巨集定義,實現乙個軟中斷,和返回函式返回值。
/* unistd.h */
#define __sys2(x) #x
#define __sys1(x) __sys2(x)
#ifndef __syscall
#define __syscall(name) "swi/t" __sys1(__nr_##name) "/n/t"
#endif
#define __syscall_return(type, res)/
do /
return (type) (res);/
} while (0)
產生的系統呼叫表
定義在entry_common.s
,**包含在
calls.s
。/* entry_common.s */
.typesys_call_table, #object
entry(sys_call_table)
#include "calls.s"
/* calls.s */
.longsymbol_name(sys_gpioctrl) 2.
真正的函式實現
/* value :
引數位址*/
asmlinkage int sys_gpioctrl( int op, int addr, int value)
return 0; }
3.函式說明
系統呼叫執行於核心空間,使用者空間程式通過系統呼叫傳入操作
opt、位址
addr
、值value
,進行暫存器的讀取、設定等操作。
#define op_get0/*
獲取*/
#define op_set1/*
設定*/
#define op_err2/*
異或*/
#define op_orr3
/* 或*/
#define op_and4/* 與*/
arm linux3 0自定義系統呼叫
硬體 訊為4412核心板,os 訊為linux3.0.15 編譯環境 ubuntu1404 編譯器 訊為提供的arm 2009q3 gcc交叉編譯。參考一文。增加加減乘除等系統呼叫,並測試系統呼叫和使用者呼叫的效能差異。1 新增系統呼叫函式 在 kernel sys.c內新增 sys add sel...
android自定義控制項新增自定義屬性
1 如果是自定義控制項,請在style.xml中或attrs.xml中宣告屬性 attr declare styleable 2 在theme中使用自定義的屬性,可以再多個主題中定義不同的屬性值 customize your theme here.color colorprimaryitem col...
新增自定義模板
模板 當增加一些,固定,特有組伺服器的時候,增加一些特定的監控專案,這些專案就可以加到自定義的模板裡,再將機器加到這個模板裡。每次增加類似的機器,就可以加到這個模板裡。思路 建立模板 名字自定義 模板要歸屬到模板組裡。也可以鏈結其他的模板。建立出的模板,所有的都為空。可以增加一些監控專案。可以在其他...