Professional Documents
Culture Documents
u Trng Hin
Trng Ngc Sn
SPKT
Chng 1
GII THIU H THNG NHNG
1 .H thng nhng ( Embedded System):
Hin nay h thng nhng v ang tng bc pht trin Vit nam, n thay cho cc h
thng vi x l trc y. H thng nhng c ng dng rng ri trong ngnh in t, my tnh
v vin thng nh cc h thng in thoi, cc my o, cc h thng iu khin t ng trong
cng nghip, thng mi v ngn hng. Tuy nhin chng ta vn cha c mt nh ngha c th
v h thng nhng. Thng qua qu trnh vn hnh, xy dng v pht trin h thng nhng chng
ta c th hiu h thng nhng nh sau:
H thng nhng l mt ng dng bao gm t nht mt thit b lp trnh c nh vi x l,
vi iu khin hay cc vi mch x l s. N l mt h thng da trn vi x l thc hin mt
chc nng hay mt dy chc nng c th no .
H thng nhng l mt ng dng c tch hp c phn cng v phn mm nhm phc v
cc bi ton chuyn dng trong lnh vc cng nghip, y t, qun s.
Mt my tnh PC l mt thit b c nhiu chc nng v ngi s dng c th thay i cc
chc nng thng qua vic thm, xa phn mm ng dng, trong khi h thng nhng c
thit k phc v mt s chc nng c th, xc nh. Chnh v th h thng nhng c cc nh
pht trin ti u ha n nhm gim thiu kch thc v chi ph sn xut.
Cc thit b cm tay PDA cng c c im ging h thng nhng nhng chng khng
phi l h thng nhng v chng c nhiu chc nng.
thay i chc nng ca h thng nhng thng thng ngi ta da v cc cng c pht
trin v cng vic ny do cc chuyn gia pht trin h thng nhng thc thin. Qu trnh xy
dng li chc nng h thng nhng ging nh qu trnh thay i chc nng h iu hnh, thng
thng ngi ta thay i, sa cha, thm, xa cc trnh iu khin, hot ng ca h thng sau
tin hnh bin dch li cho h thng nhng.
Mt h thng nhng c kt ni vi mt h thng my ch pht trin h thng, qu
trnh pht trin h thng hay lp trnh cho h thng nhng c thc hin trn mt my tnh c
cc cng c h tr. Cc kt qu ca cc qu trnh bin dch nh: cc tp tin nh ca h iu hnh,
cc tp tin thc thi c np xung h thng nhng thng qua cc kt ni nh: serial, usb,
ethernet..
o Khi to, thit lp cho cc thit b ngoi vi nh cng ni tip, b nh thi chip, s ln
lm ti RAM
o Khi to b nh h thng chun b cho qu trnh download Image.
o Khi to chng trnh iu khin ngt, ci t cc ngt h thng.
- Embedded Monitor h tr 1 cng c giao tip ngi dng thng qua giao tip ni tip
n cc chng trnh m phng. Thng thng th n h tr cc lnh iu khin nh sau:
o Download Image.
o c v ghi cc thanh ghi h thng.
o c v ghi b nh h thng.
o Thit lp v xa cc break point.
o Cho php thc thi tng lnh g ri h thng.
o Reset v reboot h thng.
- Qu trnh boot ca h thng:
Trang 4
thit lp thch hp cho qu trnh pht trin m ngun ca h thng. M ngun h thng c th
thay i c.
- Trong mt s ng dng, RTOS bao gm mt kernel (nhn). Kernel l mt li mm gim
st h thng, cung cp cc khi logic, cc gii thut lp lch, cc gii thut qun l ti nguyn.
Mi mt h thng thi gian thc u c mt kernel. Mi h thng thi gian thc l mt s tng
hp ca nhiu module trong bao gm kernel, file system, network protocol stack, v cc
module khc ty thuc vo yu cu chc nng ca h thng.
Trang 5
- Ready state: Task sn sng thc thi nhng khng th v mt task khc vi mc u tin
cao hn ang thc thi.
- Block state: Task gi yu cu nhng khng c chp nhn, yu cu c thi hnh phi
ch mt s s kin khc din ra hay b tr hon trong mt khong thi gian.
- Running state: Task c mc u tin cao nht v ang c thi hnh.
Trang 7
Chng 2
GII THIU H IU HNH NHNG
1. h iu hnh linux
1.1 Gii thiu h iu hnh Linux:
Linux l h iu hnh m phng Unix, Linux c xy dng da trn phn nhn (kernel)
v cc gi phn mm m ngun m. Linux c cng b di bn quyn ca GPL (General
Public Licence).
Unix ra i gia nhng nm 1960, ban u c pht trin bi AT&T sau c ng
k thng mi v pht trin theo nhiu dng vi cc tn khc nhau. Nm 1990, xu hng pht
trin phn mm m ngun m xut hin v c thc y bi t chc GNU. Mt s Licence v
m ngun m xut hin nh BSD, GPL. Nm 1991, Linus Torvald vit thm phin bn nhn
V0.01(kernel) u tin v a ln cho cng ng ngi dng s dng v pht trin. Nm
1996, nhn V1.0 chnh thc cng b v ngy cng c s quan tm ca ngi dng. Nm 1999,
phin bn nhn V2.0 vi nhiu c tnh h tr nhiu cho cc ng dng server. Nm 2000, phin
bn V2.4 ra i h tr nhiu hn v Linux bt u bc chn vo th trng m ch yu l trong
cc ng dng mng, cc ng dng cho cc thit b cm tay.
Cc phin bn ca Linux l sn phm ng gi kernel v cc gi phn mm min ph khc.
Cc phin bn ny c cng b di licence GPL.
Ging nh Unix, Linux gm c 3 phn chnh: Kernel, Shell v cu trc tp file.
Kernel l chng trnh nhn, mt s ti liu cn gi l nhn h iu hnh Linux. Kernel
chy cc chng trnh h thng v qun l hat ng ca h thng.
Shell l mi trng cung cp cc giao din cho ngi s dng cn c m t nh mt b
bin dch, Shell l cu ni giao tip gia ngi s dng v nhn h iu hnh(kernel). Shell nhn
cc lnh t ngi dng v gi cc lnh n nhn h iu hnh thc thi. Hin nay ch yu tn
ti 3 shell: Bourne, Korn, C Shell. Bourne c pht trin ti phng th nghim Bell. C Shell
c pht trin cho phin bn BSD ca Unix. Korn Shell l phin bn ci tin ca Bourne Shell.
Nhng phin bn hin nay ca Unix bao gm Linux u tch hp c 3 shell trn.
Cu trc File hay h thng file (file system) quy nh cch lu tr cc file trn a. File
c t trong cc th mc. Mi th mc c th cha File v cc th mc con khc. Mt s th
mc l cc th mc chun do h thng s dng. Ngi dng c th to ra cc file hay th mc
ring v c th thay i cc file hay th mc . Trong mi trng Linux/ Unix, ngi dng cn
c th thay i cc quyn truy cp trn cc file hay th mc cho php hn ch quyn truy cp i
vi mt ngi dng hay mt nhm ngi dng. Cc th mc trong Linux c t ch hnh cy,
bt u l th mc gc (root), cc th mc khc uc phn nhnh t th mc ny.
Kernel, Shell v h thng File to nn cu trc h iu hnh. Vi cc thnh phn trn
ngi dng c th chy chng trnh, qun l file v tng tc vi h thng.
1.2 Mt s phin bn ca Linux:
Redhat v Fedora Core bn Linux c l l thnh hnh nht trn th gii, pht hnh bi cng
ty Redhat. T nm 2003, Redhat Inc chuyn hng kinh doanh. H u t pht trin dng sn
phm Redhat Interprise Linux (RHEL) vi mc ch thng mi, nhm vo cc cng ty, x
nghip. i vi ngi dng bnh thng, h m mt d n tn l Fedora. Redhat b tin v mt
s k s ca mnh h tr cho d n ny ng thi ku gi cc chuyn vin thit k trn khp th
gii qui t li pht trin Fedora Core. Bn Linux ca Redhat cui cng dng phin bn 9.0.
Version ca Fedora Core c m t 1. C th ngh i khi l FC1 tng ng Redhat 10,
FC2 tng ng Redhat 11. Thc t th khc nhiu, c bit l t FC2.
Trang 8
WhiteBox Linux Bn clone ca Redhat Enterprise Linux 3.0. Build trn source code ca
RHEL bi mt nhm cc k s LA, Hoa K. Hin nay server Nhatban.NET ang dng bn
ny.
SuSE Linux c sn xut c. Bn Linux cc k thnh hnh chu u v Bc M.
Nm 2003, cng ty SuSE b ng ln Novell mua. Novell ang dc sc u t cho SuSE nhm
vo cc nh doanh nghip hng ginh li th phn t tay Redhat. Bn SuSE mi nht hin nay l
9.1
Mandrake Linux Made in France. Cng l mt bn Linux rt thnh hnh chu u, M, v
Vit Nam. y cng l bn c u i nht trong vn Vit ho. Theo thng tin mi nht ngy
22/7/2004 th qu trnh Vit ho cho Mandrake Linux (MDK) t 85%. Bn MDK mi nht
hin nay l 10.0
Turbo Linux Ni ting Nht, Trung Quc. Cng ty Turbo ang u t mnh nhm thng
tr th trng Linux Trung Quc. Bn Turbo mi nht hin nay l 10F.
Debian Linuxm, mt ng ln na trong lng Linux. Nhiu ngi c kin cho rng:
ngi khng chuyn nn dng Fedora Core c th lm quen c vi nhng k thut mi
nht ca Linux, cn dn chuyn nghip nn dng Debian v s n nh tuyt vi ca n. Bn
mi nht: 3.0R2
Vine Linux Cc k c a chung ti Nht. c pht trin trn nn Redhat 6.2. c
im ca bn ny l rt nh (duy nht 1 a CD) v h tr ting Nht 100%. Vine Linux cng
c tch hp thm mt s tnh nng ca Debian v d nh apt-get. Bn mi nht hin nay l
2.6R4. Bn 3.0 c tung ra trong thng 8/2004.
Knoppix Linux c sn xut c. Bn live Linux c a chung nht hin nay. Khi
ng trc tip t CD m khng cn ci t vo cng. Phin bn mi nht l 3.4.
Vietkey Linux c sn xut ti Vit Nam. Hon ton khng c ting tm g ngoi chuyn
c gii trong cuc thi TTVN 2003. Pht trin bi nhm Vietkey trn nn Redhat 7.2. Cng
nn th cho bit sn phm ot gii nht ca TTVN n ra sao.
vnlinuxCD Bn live CD by Larry Nguyn. Nguyn tc ca vnlinuxCD ging Knoppix
nhng c build trn nn Mandrake 9.2. H tr kh tt cc vn v ting vit.
Cc phin bn khc cn rt nhiu nh phn phi khc. Cc bn t tm hiu thm c th
check: Slackware, Gentoo, College, Yellow Dog, SGI, Momonga...
1.3 H thng tp tin v th mc trn Linux:
Trong mi trng Windows (v d 2000 hay XP), mc d ngi dng c ton quyn t
chc cu trc th mc, nhng mt s quy nh truyn thng vn c tun theo. V d cc tp
tin h thng thng nm trong th mc :\Windows, cc chng trnh thng c ci t vo
C:\Program Files, v.v. . . Trong Linux cng c mt cu trc th mc kiu nh vy v thm ch
cn nghim ngt hn. Hn na c mt tiu chun xc nh cu trc th mc cho cc h iu
hnh dng UNIX. Tiu chun ny c gi l Filesystem Hierarchy Standart (FHS).
/bin: Th mc ny gm ch yu cc chng trnh, phn ln trong s chng cn cho h
thng trong thi gian khi ng (hoc trong ch mt ngi dng khi bo tr h thng). y
c lu rt nhiu nhng cu lnh thng dng ca Linux.
/boot: Gm cc tp tin c nh cn cho khi ng h thng, trong c nhn (kernel). Tp
tin trong th mc ny ch cn trong thi gian khi ng.
/dev: Th mc ny cha cc file thit b. Trong th gii Unix v Linux cc thit b phn
cng c xem nh lm mt file. a cng v phn vng l cc file nh hda1, hda2. a mm l
fd0 Cc tp tin thit b ny t trong th mc /dev.
/etc: Th mc ny cha cc file cu hnh ton cc ca h thng. C th c nhiu th mc
con ca th mc ny nhng nhn chung chng cha cc file script khi ng hay phc v cho
mc ch cu hnh chng trnh trc khi khi ng.
Trang 9
To ti khon ngi:
Lnh useradd
useradd [tn ti khon]
Lnh cho php to mt ti khon ngi dng, ngi dng c th s dng ti khon ny
ng nhp vo h thng ngay trn my Linux hoc t cc my khc thng qua mng.
Bn ch khi ng nhp vo h thng vi ti khon root bn mi c th to ti khon
ngi dng, ng nhp h thng vi ti khon root c th ng nhp trc tip trn my hoc
thng qua mt my khc trn mng.
Trang 10
$ cd <pathname>
pathname = ng dn tng i (tnh t th mc hin hnh) hoc tuyt i (tnh t th
mc gc)
Th mc c bit:
Th mc hin hnh: .
Th mc cha: ..
Th mc home: ~ hoc ~username
$cd /tmp
(chuyn ti th mc /tmp)
$cd ../home/a01
(chuyn ti th mc /home/a01)
$pwd
/home/a01
Lit k ni dung th mc:
Lnh ls (listing directory):
ls [option] path_name
V d:
$ ls
addr.c env.c fork.c lockf.c pipe1.c a.out exec1.c forkex.c lockf.h
-a lit k cc file n
-d ch lit k tn ca th mc, khng lit k ni dung
-F lit k cc file v cho bit kiu ca file qua k hiu cui
Khng c k hiu g: file thng
/
directories
*
executable files
@
linked files
-i cho bit s inode ca file
-l lit k y thng tin v file/th mc
-R lit k cc th mc con quy
-t sp xp theo thi gian cp nht
To th mc:
Dng lnh mkdir
mkdir path_name
V d:
$pwd
/export/home/a01
$mkdir examples
$ls aF
./ .bash_logout .bashrc .emacs ex.tar .screenrc
../ .bash_profile Desktop/ examples/ .kde/ .wl
V d cn to 3 th mc a, b, c nh sau a/b/c
Dng 3 lnh mkdir
$mkdir a
$mkdir a/b
Trang 12
$mkdir a/b/c
Dng mt lnh mkdir
$mkdir p a/b/c
1.5 Lnh xa file v th mc:
Lnh rm
Xo th mc rng (khng cha th mc con hay file)
rmdir path_name(s)
Xo th mc khng rng
rm r path_name(s)
Xo file
rm option file_name(s)
Lnh Copy files:
cp [-option] from(s) to
Copy th mc
cp -r from(s) to
Vd:
$cp /etc/passwd.
$cp p*.pas /tmp
$cp /etc/sysconfig/network-sripts /tmp
1.6 Di chuyn file v th mc
Lnh mv (move):
mv [option] filename dest_file
mv [option] directory dest_dir
mv [option] filename dest_dir
V d:
$mv examples lab1
To file v nhp vo ni dung
cat > name_of_file
Sau khi nhp ni dung, g <Enter> xung dng.
n Ctrl-d ghi ni dung son tho vo file v kt thc thao tc.
V d
$cat > test.txt <Enter>
this is my file <Enter>
Ctrl + D
$
To file rng (0 bytes) bng lnh touch
touch new_file
To file c ni dung di:
Lnh more:
more filename
Du nhc --More--(nn%) xut hin bn di mn hnh.
C th dng cc phm iu khin trong lc ang xem ni dung file
Trang 13
space bar
hin th trang k tip
<RETURN> hin th dng k tip
q
thot khi lnh more
b
v trang trc.
h
xem tr gip
Hin th n dng u tin ca mt text file, dng lnh head
head -n filename
(nu n=10, c th b option n i: head filename)
Hin th ni dung file:
Hin th n dng sau cng ca mt text file, dng lnh last
last -n filename
(nu n=10, c th b option n i: last filename)
1.7 Tm kim mt file trong h thng file (file system): dng lnh find
find pathname -name filename -print
(C th dng wildcard t trong du nhy kp)
V d:
$find / -name *.cpp -print
Cng c th nh v mt file bng cc lnh which, whereis, locate (lu l cc lnh ny ch
tm trong phm vi bin mi trng PATH hoc xxxPATH)
V d:
$ which find
$ locate ls
Tm trong ni dung ca file:
Tm mt chui k t trong mt text file bng lnh
grep pattern filename(s)
pattern: chui k t cn tm kim. Nu chui c k t c bit th phi t trong du nhy
n.
V d:
$ grep UNIX /usr/man/man*/*
$ grep -n '[dD]on\'t' notes
$ grep a01 /etc/passwd
Cc quyn trn file v th mc:
H thng *NIX bo v cc file v th mc thng qua cc quyn thit lp trn .
C 3 quyn:
rread - c
wwrite ghi
xexecute -thc thi
Cc quyn c p dng trn 3 nhm ngi dng, k hiu bng ba k t tng ng u, g, o
u = owner user = ch s hu
g = group = nhng ngi cng nhm vi ch s hu
o = others = tt c nhng ngi khc
Phn quyn:
Trang 14
Trang 16
Chng 3
LP TRNH H V SHELL
1. S dng bin
2.Cc k t c bit
Trang 17
3. ng dn
4. Lnh r nhnh
Trang 18
Trang 19
4.1 Lnh if
Trang 20
#!/bin/sh
echo nhap a=
read a
echo nhap b=
read b
if [ $a -gt $b ] ; then echo 'a>b
elif [ $a -eq $b ] ; then
echo 'a=b
else echo 'a<b
fi
5. Vng lp
#!/bin/sh
dem=0
echo "ban nhap vao mot chuoi"
read word
echo "tach tu:"
for i in $word
do
dem="$(($dem+1))"
Trang 21
echo "$i"
done
echo "tong so tu la:$dem"
exit 0
6. Lnh CASE
Trang 22
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
case "$timeofday" in
"yes") echo "Good Morning";;
"no" ) echo "Good Afternoon";;
"y" ) echo "Good Morning";;
"n" ) echo "Good Afternoon";;
* ) echo "Sorry, answer not recognised";;
esac
exit 0
Trang 23
7. Lnh s hc
Trang 24
8. Express
9. Ly kt qu
Trang 25
Trang 26
Chng 4
LP TRNH TRN LINUX
Rt nhiu bn ngh rng lp trnh trn Unix , Linux lun lun phi dng ngn ng C. iu
ny hon ton ng bi v nguyn thy Unix c vit t C v phn ln cc ng dng cho Unix
cng dng C vit. Mc d vy C khng phi l mt la chn duy nht v bt buc. Ngoi
ngn ng C cn c th s dng nhiu ngn ng khc lp trnh nh Pascal, Assembler hay
Perl, Fortran, Prolog
Tuy nhin C/C++ v Pascal l hai ngn ng c kh nng bin dch mnh v gn gi vi
chng ta nht. Trnh bin dch C v Pascal trn Linux hon ton c kh nng bin dch c m
ngun vit bng ngn ng Assembler.
Chng trnh ng dng trn Unix, Linux tn ti 2 dng: dng thc thi (tp tin nh phn)
v dng thng dch script. Tp tin chng trnh thc thi dng nh phn tng t nh tp tin
.exe ca DOS. Script l nhng ch th lnh bng vn bn din dch v thc thi bi shell hay trnh
thng dch no . Cc file script tng t nh cc file.bat ca DOS.
Hu nh script hay chng trnh m my u c kh nng v sc mnh ngang nhau. Bn
kh phn bit u l lnh gi chng trnh nh phn u chng trnh gi lnh script trong Unix
v Linux tr khi xem ni dung ca chng. Chng trnh nh phn v chng trnh gi lnh script
c th hon i cho nhau. Mt chng trnh script nu thch bn c th chuyn thnh chng
trnh nh phn bng ngn ng bin dch C hay Pascal.
Khi ln u tin ng nhp vo h thng Linux v gi mt chng trnh t dng lnh, h
iu hnh Linux s tm ng dn n ni cha tp tin chng trnh trong bin mi trng
PATH. Thng th bin mi trng ny s cha cc ng dn c bn nh: /bin, /user/bin,
/usr/local/bin
Cc thnh phn cng c h tr h iu hnh thng c ci t vo th mc /opt. Linux
khng tm ng dn chng trnh trong th mc hin hnh tr khi bn thm k t (.) vo bin
mi trng PATH.
Lu l Unix, Linux s dng k t: phn cch cc ng dn trong bin mi trng
PATH trong khi DOS s dng k t ; V d:
PATH= /bin:/user/bin:/usr/local/bin
4.1 Chng trnh helloworld.c
Hello World l chng trnh kinh in i vi hu ht cc lp trnh vin khi tm hiu mt
ngn ng lp trnh mi. Trong phn ny s gip cc bn hiu v cc bc tin hnh lp trnh mt
ng dng bng ngn ng C, bin dch v thc thi ng dng trn mi trng linux.
Trc ht, m ca s Terminal. Terminal l giao din dng lnh cho php ngi dng
tng tc vi h thng thng qua cc lnh iu khin, n tng t nh bn nhp cc lnh trong
ca s cmd ca windows.
C nhiu cch khi ng ca s Terminal. Trong cc phin bn RedHat, chng ta ch cn
Click phi ln Destop, chn menu lnh Terminal. Trong cc phin bn khc nh Fedora Core,
m ca s Terminal Chn menu Applications / System Tools / Terminal
Windows v sao chp sang my Linux (phn ny s hng dn c th sau). Trong phn ny
s hng dn to mt tp tin m ngun trc tip trn Linux.
S dng trnh son tho vi nh sau:
vi helloworld.c
Trong trng hp tp tin ch nh trong lnh khng tn ti, trnh son tho vi t hiu phi
to mt tp tin mi c tn ch ra trong lnh, ngc li nu n s m tp tin cho php ngi dng
thay i.
Ln u tin vi m tp tin, c th chn ni dung vo tp tin, bn nhn phm I chuyn
sang ch insert, Nhp ni dung nh sau:
#include<stdio.h>
int main ()
{
printf (Hello World) ;
exit(0) ;
}
Thot khi ch INSERT v chuyn sang ch lnh bng cch nhn ESC .
lu li ni dung tp tin nhn t hp phm :w
thot khi trnh vi nhn t hp phm :q
Lc ny trong th mc hin hnh s to ra tp tin c tn helloworld.c
bin dch tp tin m ngun .c trn Linux s dng trnh bin dch gcc. Trc ht bn cn
kim tra s tn ti v phin bn ca trnh gcc trn my Linux ca bn. Thng thng khi ci t
h iu hnh Linux th gcc c ci t sn. xem thng tin v trnh bin dch b, ti dng lnh
bn nhp lnh gcc v.
Mt lot cc thng tin trong ng ch l phin bn ca gcc:
Sau khi qu trnh bin dch thnh cng, tp tin thc thi helloworld s c to ta. gi
tp tin ny chy trn mi trng Linux, c th gi trc tip nh sau:
./helloworld
Trang 28
scanf("%f",&c) ;
delta = b*b - 4*a*c ;
if (delta<0)
printf("\nphuong trinhh vo nghiem") ;
else if (delta==0)
printf("\nphuong trinh co nghiem kep x= %f ",-b/(2*a));
else
printf("\nPhuong trinh co nghiem \n x1=%f \nx2=%f");
exit(0);
}
Bin dch chng trnh
gcc main.c main
./main
4.3 Tin trnh (process)
Mt th hin ang chy ca mt chng trnh c gi l mt tin trnh (process). V d
chng ta c 2 ng dng ca s terminal trn mn hnh chng ta xem nh c 2 tin trnh ang
chy. Mi ca s terminal ang thc thi mt shell. Mi shell l mt tin trnh khc nhau. Khi
nhp mt lnh vo t mi shell, chng trnh s thc thi mt tin trnh mi, khi tin trnh mi
ny kt thc th tin trnh shell li c tip tc.
Lp trnh trn Linux thng s dng nhiu tin trnh trong mt ng dng cho php ng
dng c th thc thi nhiu cng vic hn nhm lm gia tng tnh hiu qu ca ng dng.
Hu ht cc hm x l cc tin trnh m t trong phn ny tng t nh trong cc h thng
Unix khc. Hu ht c khai bo trong tp tin unistd.h
4.4 S hiu ca tin trnh (process IDs):
Mi tin trnh trong h thng Linux c xc nh bi mt s hiu duy nht. Thng s ny
cn c gi l pid. S hiu tin trnh l mt s nguyn 16 bit c cp lin tc bi h thng
Linux khi mt tin trnh mi c to.
Mi tin trnh c mt tin trnh m (parent process) ngoi tr cc tin trnh c bit nh
init process. V th cc tin trnh trong h thng Linux c xp theo hnh cy vi tin trnh init
l gc. parent Process ID hay ppid n thun l cc s hiu ca cc tin trnh m.
Khi thao tc vi cc process ID trong cc chng trnh vit bng C/C++ chng ta thng
s dng cc kiu d liu nh ngha sn pid_t trong th vin <sys/types.h>. Mt chng trnh
c th c mt s hiu ca mt tin trnh ang chy bng cch gi hm h thng getpid(). Tng
t cng c th ly s hiu ca tin trnh m bng cch gi hm h thng getppid().
V d:
#include <stdio.h>
#include <unistd.h>
int main ()
{
printf (The process ID is %d\n, (int) getpid ());
Trang 30
Trang 31
V d s dng lnh fork to mt tin trnh con. Ch rng trong khi u tin ca pht
biu if ch c thc thi trong tin trnh cha, trong khi pht biu trong mnh else li c thc
thi trong tin trnh con.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
printf (the main program process ID is %d\n, (int) getpid ());
child_pid = fork ();
if (child_pid != 0)
{
printf (this is the parent process, with id %d\n, (int) getpid ());
printf (the childs process ID is %d\n, (int) child_pid);
}
else
printf (this is the child process, with id %d\n, (int) getpid ());
return 0;
}
Hm exec t mt chng trnh ang chy trong mt tin trnh vi mt chng trnh khc.
Khi mt chng trnh gi hm exec, tin trnh ngay lp tc dng chng trnh ang thc thi
v bt u thc thi mt chng trnh mi t gi s rng gi hm exec khng pht sinh ra li.
Mt s cc hm exec thng dng nh sau:
Cc hm bao gm k t p sau tn ca exec (execvp, execlp) nhn vo tn chng trnh v
tm chng trnh thng qua tn ca n trong ng dn ca chng trnh thc thi hin hnh.
Hm khng bao gm k t p phi c cung cp ng dn y ca chng trnh thc thi.
Cc hm bao gm k t v sau tn exec (execv, execvp, execve) nhn vo danh sch cc i
s cho chng trnh mi nh l mt mng khc NULL ca con tr chui. Cc hm bao gm k
t l (execl, execlp v execle) nhn vo danh sch cc i s s dng c ch ca ngn ng C.
Cc hm bao gm k t e (execve, execle) nhn vo cc i s truyn thng, mt mng cc
bin mi trng. Cc i s phi l mt mng khc NULL con tr ti chui k t, mi chui k
t c dng VARIABLE=value
Mt cch chung nht chy mt chng trnh con bn trong mt chng trnh kt hp
gi lnh fork v exec nh v d sau:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
/* Spawn a child process running a new program. PROGRAM is the name
of the program to run; the path will be searched for this program.
ARG_LIST is a NULL-terminated list of character strings to be
passed as the programs argument list. Returns the process ID of
the spawned process. */
Trang 32
Chng 5
PHN CNG H THNG NHNG
H thng nhng cng l mt h thng vi x l m nhim mt chc nng ring bit no
. Tuy nhin khi thit k h thng nhng th i hi phi quan tm nhiu yu t hn mt h
thng vi x l thng thng. Mt h thng nhng thng thng l mt h thng da trn vi x l
m ch yu l cc vi x l 32 bit kt hp vi b nh, cc ngoi vi cn thit phc v cho chc
nng ca h thng. Vi iu khin ARM thng l la chn ti u cho h thng nhng bi chng
h tr nhiu. Cc h thng nhng s dng ARM c th lm gim cc ngoi vi, lm cho h thng
n gin nhng vn p ng c yu cu. Hin nay ARM c nhiu hng nghin cu v sn
xut vi tnh nng ngy cng vt tri.
Mt h thng nhng c bn c th xem bao gm cc phn cng nh vi x l, vi iu
khin, b nh, cc ngoi vi.
Trong ti liu ny s gii thiu phn cng h thng nhng da trn nn vi iu khin
ARM9 AT91Sam9260 ca Atmel.
- 4 b ADC 10 bit
- USB device v USB host
- 4 b USART, 2 UART
- 10/100Mbps ethernet.
- Giao tip SPI, SSC, 2 wire
5.2 Chng trnh khi ng vi iu khin AT91SAM9260 (boot program):
Chng trnh khi ng tch hp mt chng trnh c kh nng dowload hay upload mt
chng trnh khc ln mt vng nh khc ca vi iu khin.
Trc ht n khi ng n v g ri qua cng ni tip v thit b USB. Tip theo
chng trnh khi ng trn DataFlash c thc thi, n tm mt cch lin tc trong 8 vector ca
cc dataFlash c kt ni n vi iu khin thng qua chun SPI.
Nu mt vector hp l c tm thy, m chng trnh s c dowload vo bn trong
SRAM ni, chng trnh s nh x b nh v nhy n a ch u tin ca SRAM
Nu khng c mt vector hp l no c tm thy, chng trnh khi ng trn DataFlash
s c thc thi trn chn chn chip th 2(NPCS1).
Nu khng c mt Vector hp l no c tm thy trn c 2 chn chn Serial DataFlash,
chng trnh khi ng trn NAND Flash s c thc thi. Tng t chng trnh s tm 8
vector hp l, nu mt vector hp l c tm thy, m chng trnh s c download ln
SRAM, chng trnh s nh x b nh v nhy n a ch u tin ca SRAM.
Nu khng c vector hp l no c tm thy trn NAND Flash, chng trnh SAM-BA
Monitor s c thc thi v ch qu trnh truyn d liu chng trnh trn cc cng USB v
JTAG.
Trang 37
Trang 38
Trang 40
Trang 41
Trang 42
Trang 43
Trang 44
Trang 45
Trang 46
Trang 47
Trang 48
Trang 49
Trang 50
Chng 6
PHN MM H THNG NHNG
6.1 Cu trc phn mm trong h thng nhng:
Tng t nh mt h thng my tnh n gin, mt h thng nhng l mt s kt hp cht
ch gia phn cng v phn mm, khc vi cc h thng vi x l thng thng khc, h thng
nhng c mt h thng phn mm iu khin phc tp hn. Chng ta hy hnh dung h thng
phn mm trong mt my tnh. Khi bn mua mt my tnh mt phn mm c ci t sn
trong h thng l CMOS. Chng trnh ny lm nhim v giao tip gia ngi s dng vi
phn cng v thc hin cc thao tc tip theo. Sau bn ty thch ci h iu hnh m bn
mun, sau khi c h iu hnh cc ng dng li c la chn phc v nhu cu ca bn. Phn
mm trong h thng nhng cng tng t nh mt h thng my tnh. H iu hnh trong cc h
thng nhng cng tng i phong ph. Hin nay c nhiu h iu hnh cho h thng nhng nh
Window CE, LinuxTuy nhin Linux l c la chn nhiu do m ngun m v nhiu tnh
nng nh a nhim, a ngi dng Ngai ra Linux cn cho php ti bin dch nhn h iu
hnh trn ngay chnh h iu hnh. Vic pht trin h thng nhng s dng h iu hnh Linux
c thc hin trn mt my tnh s dng h iu hnh Linux, y cng l l do m cc chng
trc ti liu hng dn co thao tc v cch lp trnh trn h thng Linux. Mt h thng
nhng s dng h iu hnh Linux thng thng c 3 lp phn mm nh sau:
Boot Loader l tn gi chung mt phn mm c ci t trc vo h thng, phn mm
ny c nhim v khi to h thng v thc hin giao tip gia h thng vi ngi s dng. C
nhiu phin bn cng nh nhiu loi bootloader khc nhau. Cc b x l ca Ciruss Logic nh
EP9315th s dng red boot, AMCC vi Power PC v cc ARM9 ca Atmel th s dng uboot, mt s b s l khc th dng lun tn Boot Loader. Trong ti liu ny s trnh by mt t
chc phn mm trong mt h thng nhng s dng b x l ARM9 ca Atmel. Trong cc h
thng nhng s dng b x l ca Atmel th phn boot loader bao gm 2 phn Bootstrap v Uboot, phn h iu hnh Linux l kernel linux c cu hnh cho ph hp, phn file system c
s dng mt s file system ca linux nh Amstrong, Debian...
BootStrap
U-boot
Kernel
File System
Trang 51
Trang 52
Nm r kin trc cc thnh phn trong u-boot gip ngi pht trin h thng bin dch v
cu hnh u-boot cho tng thch vi cc phn cng khc nhau.
Th mc board xc nh nhiu kin trc nn khc nhau ca cc hng khc nhau nh Philip,
AMCC, Atmel, davici, Cirus Logic... th mc board cng bao gm cc hm khi to cc board.
Cc hm ny c th gi t th vin lib_<arch>/board.c
Th mc board / <boardname> xc nh thng tin chi tit cho h thng, th mc ny
cha cc tp tin khi to cn thit cho mi h thng bao gm cc tp tin nh asm_init.S,
congif.mk, flash.c
Th mc common cha tp tin nh ngha cc lnh ca uboot, cc bin mi trng nh
cmd_boot.c, cmd_date.c, environment, env.c, main.c...
Th mc CPU bao gm cc tp tin xc nh cc thng s, khi to cc ngt, b nh m...
cho CPU nh cpu.c, cpu_init.c, interrupts.c, cache.s, start.s...
Th mc disk cha cc tp tin phn vng v thng tin thit b cho a.
Th mc driver cha cc tp tin thit b nh ethernet, usb, sirial...
Th mc include bao gm nhiu tp tin header nh console.h, version.h, usb.h, pci.h.
Trong tp tin version.h nh ngha phin bn ca u-boot #define u-boot_VERSION xxx.
Include/congifs cha cc cu hnh cho nhiu board.
Th mc lib_generic cc th vin chung nh bzlib.c vsprintf, string.c...
Th mc net cha cc tp tinh Ethernet nh eth.c, net.[ch], nfs.[ch], bootp.c [ch].
Th mc fs cha cc file h thng nh fat, fdos, jffs2
Th mc bao gm cc tp tin h tr ch ng h thi gian thc rtc date.c, mpc8xx.c, etc.
Th mc tools cc th mc v cc tp tin h tr bin dch, g ri nh env, gdb, logos,
scripts, mkimage.c
Th mc post bao gm cc tp tin v th mc nh post.c codec.c, cache.c, memory.c,
uart.c, etc.
6.1.2 Bin dch li u-boot:
Sau khi thit k mt h thng nhng mi, qu trnh bin dch li u-boot thc thi trn h
thng mi l ht sc cn thit. Qu trnh ny hay con gi bng mt thut ng porting. Porting
u-boot l qu trnh to ra mt u-boot vi cc thng s ph hp cho b x l v cc thit b ngoi
vi. Mt cch chung nht thc hin vn ny l to ra t cc u-boot c sn t cc board c
cu hnh gn ging vi h thng m bn ang thit k.
Trc ht to mt s tp tin v th mc phc v cho vic cu hnh h thng:
u-boot/board/<boardname>
u-boot/include/configs/<boardname>.h
u-boot/Makefile
Chp cc tp tin v thay i makefile v kin trc nn cho board nh include, cpu,
lib_arch, v board.
Trong th mc include, tp tin config/<boardname>.h s bao gm cc tp tin cu hnh
phn cng cho h thng nh nh x b nh v cc ngoi vi. Cu hnh b x l, cu hnh b nh
khi ng, cu hnh Nor hay Nand flash, cu hnh b nh SDRAM, cc giao tip ni tip,
ethernet v network...tp tin <core>.h nh arm926ejs.h bao gm cc nh ngha cn thit cho
b x l nh a ch cc thanh ghi...
Trong th mc cpu bao gm cc tp tin nh cpu.c cha cc khai bo cho b x l, cc
hot ng c v ghi IO, Reset CPU, cho php hay khng cho php hot ng ca b nh m
lnh v b nh m d liu, khi to ngn xp cho cc ngt. Th mc interrupt.c bao gm cc
hm phc v cho ngt v timer, nh cho php ngt hay khng cho php ngt, cc hm lin quan
Trang 53
Trn my tnh s dng h iu hnh windows, vic chp mt tp tin t gia 2 my tnh
c thc hin mt cch n gin thng qua vic ko th cc tp tin, th mc.
Sau khi ci t SSH secure File Transfer, thc hin kt ni n my Linux thng qua tn
user, a ch IP, Port
Trang 54
Trang 55
Bin dch uboot cho ARM khng s dng trnh bin dch gcc c sn trn my tnh ci
linux. Trc ht bn cn ci gi phn mm bin dch arm-linux-gcc. ci t gi phn mm
bin dch, download gi phn mm arm-linux-gcc-3.4.3.tar.bz2 v v gii nn vo th mc gc
ca my Linux.
Gi phn mm bin dch bn c th ti v t trn mng.
Trc khi bin dch, cn thit lp bin mi trng v ng dn cho trnh bin dch, v d
nh sau:
PATH=/usr/local/arm/3.4/bin:$PATH
Trong th mc PATH=/usr/local/arm/3.4/bin cha cc trnh bin dch nh arm-linuxgcc
Bin dch uboot cho h thng:
Make clean: xa ht cc cu hnh bin dch trc .
Make at91sam9260ek_config: khai bo bin dch uboot cho h thng board
at91sam9260ek.
Make all
Nu qu trnh bin dch thnh cng trong th mc u-boot-1.3.4 s tn ti file u-boot.bin
Trang 56
Sau khi U-boot c load vo h thng. Bootstrap thc thi, khi to cc thng s cho
b, load uboot v thc thi uboot. Khi uboot thc thi, u-boot command cho php ngi s dng
c th giao tip vi h thng thng qua cc lnh u-boot h tr.
Trc ht cn thit lp cc thng s mi trng cho h thng.
thit lp cc thng s mi trng chng ta s dng command setenv nh sau:
o Thit lp a ch IP cho board: setenv ipaddr <a ch IP cho board>
o Thit lp a ch IP cho host: setenv serverip <a ch host>
o Thit lp a ch ethernet(MAC): setenv ethaddr <MAC address>
o Thit lp mt n: setenv netmask <submask net>
o Lu li cc bin mi trng vo dataflash: save
xem li cc bin mi trng ti dng lnh bn nhp lnh prinenv
c th chp thng qua giao thc tftp th trn my tnh host phi ci t v chy dch v
tftp, file uImage c lu trong thc mc ca tftp server.
Bootm 0x20000000
tftpboot
version
? alias for 'help'
Trang 59
Trang 60
Trong menu h thng cha c loi vi x l tng thch vi h thng bn, iu ny cng d
hiu, Linux c thit k h tr nhiu phn cng khc nhau, bn mun cu hnh Linux cho mt
h thng ring ca bn i hi bn phi c kin thc tht tt v h thng v h iu hnh lm
c iu . Bn phi to ra cc tp tin Linux hiu h thng ca bn khi bin dch. i vi
h thng nhng s dng ARM9 ca Atmel, nh sn xut lm sn cho bn cc thay i bng
cch to ra cc bng v nhn h iu hnh linux.
Download cc bn v
2.6.xx-at91.patch.gz , 2.6.xx-at91-exp.patch.gz
Chy cc bn v
zcat 2.6.xx-at91.patch.gz | patch -p1
zcat at91-exp. patch.gz | patch -p1
Download tp tin cu hnh at91sam926yek_defconfig
Chp tp tinh cu hnh vo th mc config trong th mc Linux. Sau thc thi config
cp at91sam926yek_defconfig .config
make ARCH=arm oldconfig
Trong qu trnh thc hin oldconfig, trnh bin dch s yu cu bn xc nhn mt s thng
s cho h thng.
Thc thi menuconfig
make ARCH=arm menuconfig
Lc ny menuconfig xut hin cho php bn tin hnh cc ci t cho h thng.
Trang 61
Trang 62
Trang 63
Trang 64
Cch 2:
1. Ci t trnh bin dch cho trn linux
2. Khai bo ng dn cho trnh bin dch
PATH=$PATH:/root/km9260/arm-2009q3/bin/
3. Bin dch chng trnh
arm-none-linux-gnueabi-gcc -o hello hello.c
3. Chp file sang kit
scp hello root@192.168.1.60:/home/root/baitap/
4. truy cp kit:
=> ssh 192.168.1.60
User: root; pass: 1234567
Ch :
nu ssh yu cu add key:
=>to file config trong thu muc:~/.ssh/
ni dung file config:
Host 192.168.1.*
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
Trang 65
Chng 7
LP TRNH GUI S DNG QT
Exercises Lecture An introduction to Qt
Install the Qt SDK
Visit http://qt-project.org/downloads , and download the LGPL version of Qt SDK
suitable for your system. Then proceed to install the SDK. This gives you a Qt Creator
icon on your desktop and in your program menu. Please refer to the platform specific
tips and tricks below if you are experiencing any issues with this.
Windows
If altering the installation path of the Qt SDK, make sure to use a path without spaces.
Spaces can in some situations confuse the build tool-chain.
Mac OS X
Installation should be straight forward.
Before you can develop Qt applications, you must make sure you have installed the
developer tools from the DVD that came with your Mac.
Unix/Linux X11
Before you can develop Qt software, you must ensure that you have a C++ toolchain
installer. This usually means GCC with support for C++. This comes as a part of your
distribution and you must install it to be able to use the SDK.
If your Linux distribution has a prepackaged version of Qt Creator and the Qt
development libraries, it is often better to use those libraries. This course has been
developed with Qt 4.6+ and Qt Creator 1.2+ in mind.
If you choose to use the installer downloaded from the web, you must make the installer
executable before you can run it. You can either do this by setting the executable bit
(sometimes just X-bit) of the file through your file manager, or by running chmod from a
command prompt.
chmod u+x qt-sdk-linux-*.bin
When running the installer, make sure that you have write access to the directory where
you chose to install the SDK.
Trang 66
Having opened the project, ensure that you are in edit mode (Ctrl+2), then look for
main.cpp in the Sources folder. Understanding the source code is not the purpose of this
exercise, so leave that for later. Instead, try pressing the run button (Ctrl+R) to start the
example. This will trigger Qt Creator to first build the example, then run it. When the
example has been built, you should see a window with the demo running.
Trang 67
Having run the project, you have verified that the compiler and linker work. The next
step is to test the debugging features.
To find a point in the code to insert a break point at, we will use the locator. The locator
lets you search within your project. It can be used to look for classes, methods and files
within or outside your project. In this case, you are looking for the mousePressEvent in the
main.cpp file. To locate a method, start your search with a dot followed by a space . .
Then start typing mousePressEvent until you find the method in the list, then press
enter to go there.
Having located the Button::mousePressEvent in the source code, you will see something like
the image below. Try setting a break point as shown below (by clicking just left of the
line number or right clicking on the line number and picking Set Breakpoint from the
pop-up menu).
To start debugging click the debugging button (F5) just below the run button. This will
start a debugging session. The example program will start as expected, but as soon as
you click one of the buttons, the program execution will break and the editor will show
the current callstack, breakpoint and so on.
Trang 68
To resume execution, press the resume button on the debugging bar. Exiting the
example program will end the debug session.
When you have run and debugged this example, you have verified that your
development setup is in order and you are ready to continue.
From the dialog that pops up, create an Empty Qt4 Project, then specify a location for
your project. Notice that Qt Creator will create a sub-directory with your project's name,
so if you choose to name the project helloworld and create it in /home/user/code, your source
files will end up in /home/user/code/helloworld.
If you have other projects open (from earlier exercises), make sure to either close them
(right click on the project node and choose Close Project ... from the menu) or ensure
that you are working with your project by right clicking on your project in the projects
tree view and pick your project as the current run configuration. Your project should be
marked as bold as shown below.
Trang 69
Now, right click on your project and choose Add New... from the menu. In the following
dialogs, create a C++ Source File and name it main.cpp. In the file, enter the following
code and save it.
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv)
{
QApplication a(argc, argv);
QLabel l("Hello World");
l.show();
return a.exec();
}
Now, run the application (Ctrl+R) and try stretching and moving the resulting window
about.
Trang 70
In main.cpp, create a main function and include the ValueObject header file. In your main
function, implement the following function body.
{
ValueObject o;
// Insert code here
}
return 0;
Using the function QObject::inherits(const char *className), write qDebug statements testing if o
inherits QObject and ValueObject.
Note! If using Qt Creator on Windows, you might have to run your code in
the debugger to see the qDebug printouts!
Try commenting out the Q_OBJECT macro from the valueobject.h header file. Discuss and
explain the results. Remember to re-enable the Q_OBJECT macro after having tested this.
Now, try testing a QFile object. Does it inhert QIODevice, QDataStream, QObject or QTemporaryFile?
Can you find this information in the documentation as well as through testing?
Properties
For this step, we keep the class that we created in the previous step.
Start by adding two member functions to the ValueObject class:
setValue,
value,
These methods set and get an int value. You will have to add a private int member
variable to keep that value. Do not forget to initialize the private value in the constructor.
Trang 71
return 0;
You will have to include the QVariant header file as well for the property calls to work.
Run the code, discuss and explain the results.
Now, add a Q_PROPERTY macro defining the value property with a READ and a WRITE
function. Add the macro just after the Q_OBJECT macro in the class declaration.
Re-run the code, discuss and explain the different result.
Memory Management
Continuing from the previous step, we now add a qDebug statement in the constructor
along with a destructor with a qDebug statement. Make sure that the destructor is virtual.
The qDebug statements should inform you when an object is constructed and when it is
destructed. In the destructor, add a reference to the QObject::objectName property as well.
Replace the property setting and debugging from the last step with the following line.
o.setObjectName("root");
Running the code should now yield an output looking something like this.
ValueObject constructed.
ValueObject root destructed.
Now, add the following code just after the setting of the object name of of o.
ValueObject *c1 = new ValueObject();
c1->setObjectName("child 1");
ValueObject *c2 = new ValueObject();
c2->setObjectName("child 2");
ValueObject *c1c1 = new ValueObject();
c1c1->setObjectName("child 1 of child 1");
ValueObject *c2c1 = new ValueObject();
c2c1->setObjectName("child 2 of child 1");
ValueObject *c = new ValueObject();
c->setObjectName("child");
Run the code and evaluate the result. The code is leaking memory.
Trang 72
Now, provide a parent pointer to the constructors of c1, c2, c1c1 and c2c1 so that the
ownership tree looks like the illustration below.
root
child 1
child 1
of child 1
child 2
child 2
of child 1
return 0;
Now, establish a connection from o1 to o2, making the value of o2 follow o1.
Run the code, discuss and explain the behavior.
Now establish another connection from o2 to o1, making the two ValueObject instances
follow each other.
Run the code, discuss and explain the behavior.
If the program hangs here, setting the same value over and over again,
you have forgotten to add a check in your setValue. If the value isn't
changed, the setValue slot should simply return.
Try to come up with situations in a user interface where the two connection relationships
are useful, i.e. one object following another, versus two objects following each other.
main.cpp,
The user interface, made available through the ui variable, holds the following set of
widgets:
buttonZero
Trang 74
buttonOne
buttonTwo
buttonThree
buttonFour
buttonFive
buttonSix
buttonSeven
buttonEight
buttonNine
buttonClear
buttonAllClear
buttonAdd
buttonSubtract
buttonCalculate
entryLabel
Trang 75
numEntered(int)
clear()
clearAll()
additionMode()
subtractionMode()
calculate()
The class also provides a signal, displayChanged(QString), used to update any display
showing the status of the calculator.
In the CalculatorInterface constructor, make all the connections you can see fit. Run the
code and discuss the result.
Add support for larger numbers (the current limit is the size of int)
Trang 76
Solution Tips
Step 1 - Inheritance
Test if the object o inherits from QObject using the following line.
qDebug("ValueObject inherits QObject: %s",
o.inherits("QObject")?"yes":"no");
Step 2 Properties
The class declaration looks like this when the member functions and private variable
have been added.
class ValueObject : public QObject
{
Q_OBJECT
public:
explicit ValueObject(QObject *parent = 0);
void setValue(int value);
int value() const;
private:
int m_value;
};
The property declaration to be added at the end of the exercise reads like this.
Q_PROPERTY(int value READ value WRITE setValue)
Trang 77
Trang 78
Trang 79
2. Ci t Qt:
- B ci QT SDK cho Desktop
- B ci QT Everywhere
C th pht trin ng dng Qt trn 3 nn tng my tnh khc nhau: Linux, Windows, hoc Mac.
Trong hng dn ny ch tp trung vo ci t Qt trn my tnh
Linux X86.
2.1. Ci t Qt SDK trn my tnh X86 Linux (Ubuntu)
Bc 1.Chun b file ci t qt-sdk-linux-x86-opensource-2010.05.1.bin
Download t trang ch http://qt.nokia.com/downloads (chn phin bn thch hp cho X86 Linux
32 bit), hoc copy vo my.
Bc 2.Di chuyn n th mc cha file ci t, cp quyn thc thi cho file nu cn. Dng lnh:
$ chmod u+x qt-sdk-linux-x86-opensource-2010.05.1.bin
Trang 80
Download tslib:
$ cd ~
$ mkdir tslib-arm
$ cd tslib-arm
$ apt-get source tslib
Configure tslib:
$ cd tslib-1.0
$ ./autogen.sh
$ ./configure --prefix=$HOME/tslib_arm/ --host=arm-none-linux-gnueabi
i cho qu trnh bin dch v ci t kt thc thnh cng. (Nu c li cn kim tra li v thc
Trang 81
Thm bin mi trng n ng dn trnh bin dch Qt (M file ~/.bashrc, thm bin mi
trng $HOME/qt-everywhere-opensource-src-4.7.2)
Sa file cu hnh bin dch qmake.conf cha ti $HOME/qt-everywhere-opensource-src4.7.2/mkspecs/qws/linux-arm-g++/qmake.conf nh sau.
#
# qmake configuration for building with arm-linux-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
Trang 82
# modifications to g++.conf
QMAKE_CC
= arm-none-linux-gnueabi-gcc
QMAKE_CXX
= arm-none-linux-gnueabi-g++
QMAKE_LINK
= arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB
= arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR
= arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY
= arm-none-linux-gnueabi-objcopy
QMAKE_STRIP
= arm-none-linux-gnueabi-strip
QMAKE_INCDIR
+= /opt/tslib/include
QMAKE_LIBDIR
+= /opt/tslib/lib
Load(qt_config)
(Ch : Bin mi trng c th c thm khng chnh xc hoc khng thnh cng, trong
trng hp trong file qmake.conf trn nn t ng dn tuyt i n cc trnh bin dch)
Sau , tin hnh cu hnh th vin Qt Everywhere 4.7.2 trc khi ci t
$ cd
$ cd qt-everywhere-opensource-src-4.7.2
./configure --prefix=/opt/qte -embedded arm -xplatform qws/linux-arm-g++ -qtmouse-tslib -little-endian -no-qt3support -fast -no-largefile -qt-sql-sqlite
-nomake tools -nomake demos -nomake examples -no-webkit -no-multimedia -nojavascript-jit
(Qu trnh cu hnh din ra mt thi gian), ch n khi thng bo thnh cng. Tin hnh dch th
vin:
$ make
(Qu trnh make din ra ~hour ph thuc vo cc option la chn khi configure trn). Trong
Trang 83
libQtCore.so.4
libQtGui.so.4
libQtNetwork.so.4
Trang 84
c khi ng. (Cc ng dng vit chy trn th vin ny cn c build li cng Qtopia
2.0). chy ng dng Qt trc tip, cn tt Qtopia trnh xung t. Thc hin nh sau:
- Trn KIT, dng vi m file cu hnh /etc/init.d/rcS, disable dng Qtopia.
Chnh sa cu hnh s dng touchscreen trn KIT
- Dng vi m file cu hnh /opt/tslib/etc/ts.conf, b ch thch dng lnh module_raw input
- Thm bin mi trng s dng th vin tslib, dng vi sa file /etc/profile, thm ni dung
nh sau (dng lib copy ln KIT):
export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/input/event0
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=TSLIB:/dev/input/event0
Trang 85
Trang 86
Trang 87
Trang 88
Chn Qt C++ Project/Qt GUI Application, thc hin tip cc bc theo hng dn Wizard ca
Qt Creator.
Lu chn cu hnh nn tng bin dch thit lp bin dch ng dng chy trn KIT
FriendlyArm (hoc bin dch chy trn desktop).
Bc 2. Ti Form chnh thit k mt giao din c bn nh sau:
Trang 89
- Chut phi vo nt Clear, chn Go to slot ->> chn Clicked() ->> OK.
Thm dng lnh sau cho s kin click ca pushbutton Clear:
ui->textEdit->setText(QString(" "));
Bc 3. Build Project
Ch trong ca s Build Settings, chn cu hnh bin dch qmake cho nn tng Qt FriendlyArm
(phin bn tng ng vi Qt Everywhere ci t)
Chn Build/Build All. ng dng c build thnh cng, kt qu c file thc thi (trong th
mc Project) s chuyn ln KIT chy. V d ny l file HelloQt).
Trang 90
2. Hot ng
Khi ta thc hin cc php tnh cng tr nhn chia cc s thc th ta check
vo option Real
Khi ta thc hin cc php tnh cng tr nhn chia c s thc ln s phc th
ta check vo option Clex
Sau khi thc hin xong 1 php tnh th kt qu ti khung nhp v th hin
php tnh khung trn, ta c th chnh sa cc php tnh khung php
trn v bm du bng cng cho ra kt qu.
Chng trnh c vit trn Qt creator
3. Code chng trnh calculator
+ calculatorwin.cpp
#include"calculatorwin.h"
#include<QDebug>
Trang 91
CalculatorWin::CalculatorWin()
:mathString( "" ), item( "0" ), isRealMode( true )
{
//initialize mian window
setupUi( this );
engine = new Engine();
timer = new QTimer();
mainLineEdit->setText( "0" );
mainLineEdit->setMaxLength( 9 );
mainLineEdit->setReadOnly( true );
expandLineEdit->setReadOnly( true );
realRadioButton->setChecked( true );
complexButton->setEnabled( false );
timer->start( 100 );
//connect signals with slots
connect( zeroButton, SIGNAL( clicked() ), this, SLOT( zeroButtonClicked() ) );
connect( oneButton, SIGNAL( clicked() ), this, SLOT( oneButtonClicked() ) );
connect( twoButton, SIGNAL( clicked() ), this, SLOT( twoButtonClicked() ) );
connect( threeButton, SIGNAL( clicked() ), this, SLOT( threeButtonClicked() ) );
connect( fourButton, SIGNAL( clicked() ), this, SLOT( fourButtonClicked() ) );
connect( fiveButton, SIGNAL( clicked() ), this, SLOT( fiveButtonClicked() ) );
connect( sixButton, SIGNAL( clicked() ), this, SLOT( sixButtonClicked() ) );
connect( sevenButton, SIGNAL( clicked() ), this, SLOT( sevenButtonClicked() ) );
connect( eightButton, SIGNAL( clicked() ), this, SLOT( eightButtonClicked() ) );
connect( nineButton, SIGNAL( clicked() ), this, SLOT( nineButtonClicked() ) );
connect( dotButton, SIGNAL( clicked() ), this, SLOT( dotButtonClicked() ) );
connect( clearButton, SIGNAL( clicked() ), this, SLOT( clearButtonClicked() ) );
connect( realRadioButton, SIGNAL( clicked() ), this, SLOT( setRealMode() ) );
connect( complexRadioButton, SIGNAL( clicked() ), this, SLOT( setRealMode() ) );
connect( complexButton, SIGNAL( clicked() ), this, SLOT( complexButtonClicked() ) );
connect( backButton, SIGNAL( clicked() ), this, SLOT( backButtonClicked() ) );
connect( addButton, SIGNAL( clicked() ), this, SLOT( addButtonClicked() ) );
connect( subButton, SIGNAL( clicked() ), this, SLOT( subButtonClicked() ) );
connect( signButton, SIGNAL( clicked() ), this, SLOT( signButtonClicked() ) );
connect( mulButton, SIGNAL( clicked() ), this, SLOT( mulButtonClicked() ) );
connect( divButton, SIGNAL( clicked() ), this, SLOT( divButtonClicked() ) );
connect(
frontBracketButton,
SIGNAL(
clicked()
),
this,
SLOT(
frontBracketButtonClicked() ) );
connect(
backBracketButton,
SIGNAL(
clicked()
),
this,
SLOT(
backBracketButtonClicked() ) );
connect( equalButton, SIGNAL( clicked() ), this, SLOT( equalButtonClicked() ) );
connect( upButton, SIGNAL( clicked() ), this, SLOT( upButtonClicked() ) );
connect( downButton, SIGNAL( clicked() ), this, SLOT( downButtonClicked() ) );
connect( clsHistoryButton, SIGNAL( clicked() ), this, SLOT( clsHistoryButtonClicked() ) );
Trang 92
Trang 93
{
dealWithNonZero( "8" );
}
void CalculatorWin::nineButtonClicked()
{
dealWithNonZero( "9" );
}
void CalculatorWin::dotButtonClicked()
{
if( isRealMode )
{
if( ( !item.contains(".") ) && ( item.at( item.length() - 1 ) != 'i' ) && ( item.at(
item.length() - 1 ) != '+' ) && ( item.at( item.length() - 1 ) != '-' ) )
{
item = item + ".";
mainLineEdit->setText( item );
}
}
else
{
if( ( item.count(".") < 2 ) && ( item.at( item.length() - 1 ) != 'i' ) && ( item.at(
item.length() - 1 ) != '+' ) && ( item.at( item.length() - 1 ) != '-' ) && ( item.at( item.length()
- 1 ) != '.' ) )
{
item = item + ".";
mainLineEdit->setText( item );
}
}
}
void CalculatorWin::complexButtonClicked()
{
if( !item.contains("i") )
{
item = item + "i";
mainLineEdit->setText( item );
}
}
void CalculatorWin::dealWithNonZero( QString number ) //function to deal with non-zero
number input
{
if( item == "0" )
{
Trang 94
item = number;
mainLineEdit->setText( item );
}
else if( ( item != "0" ) && ( item.at( item.length() - 1 ) != 'i' ) )
{
item = item + number;
mainLineEdit->setText( item );
}
}
void CalculatorWin::clearButtonClicked()
{
mainLineEdit->setText( "0" );
expandLineEdit->setText( "" );
item = "0";
mathString = "";
}
Trang 95
void CalculatorWin::addButtonClicked()
{
item = mainLineEdit->text();
if( ( !mathString.isEmpty() ) && ( mathString.at( mathString.length() - 1 ) == ')' ) )
{
mathString = mathString + "+";
item = "0";
expandLineEdit->setText( mathString );
}
else
{
if( isRealMode )
{
mathString = mathString + item + "+";
item = "0";
expandLineEdit->setText( mathString );
}
else
{
if( !item.contains( "+" ) )
{
if( !item.contains( "-" ) )
{
item = item + "+";
mainLineEdit->setText( item );
}
else if( ( ( item.count( "-" ) ) == 1 ) && ( item.at(0) == '-' ) )
{
item = item + "+";
mainLineEdit->setText( item );
}
else
{
mathString = mathString + "(" + item + ")" + "+";
item = "0";
expandLineEdit->setText( mathString );
}
}
else
{
mathString = mathString + "(" + item + ")" + "+";
item = "0";
expandLineEdit->setText( mathString );
}
}
Trang 96
}
}
void CalculatorWin::subButtonClicked()
{
item = mainLineEdit->text();
if( ( !mathString.isEmpty() ) && ( mathString.at( mathString.length() - 1 ) == ')' ) )
{
mathString = mathString + "-";
item = "0";
expandLineEdit->setText( mathString );
}
else
{
if( isRealMode )
{
mathString = mathString + item + "-";
item = "0";
expandLineEdit->setText( mathString );
}
else
{
if( ( ( !item.contains( "-" ) ) || ( ( item.at(0) == '-' ) && ( item.count( "-" ) ) == 1 ) )
&& ( !item.contains( "+" ) ) )
{
item = item + "-";
mainLineEdit->setText( item );
}
else
{
mathString = mathString + "(" + item + ")" + "-";
item = "0";
expandLineEdit->setText( mathString );
}
}
}
}
void CalculatorWin::signButtonClicked()
{
item = mainLineEdit->text();
if( item != "0" )
{
if( item.at(0) != '-' ) //insert a '+' before the begin of string
item.insert( 0, "+" );
//exchange '+' with '-'
Trang 97
Trang 98
}
else
{
if( !isRealMode )
{
if( item.at( item.length() - 1 ) == '+' || item.at( item.length() - 1 ) == '-' )
item.remove( item.length() - 1, 1 );
mathString = mathString + "(" + item + ")" + "/";
item = "0";
expandLineEdit->setText( mathString );
}
else
{
mathString = mathString + item + "/";
item = "0";
expandLineEdit->setText( mathString );
}
}
}
void CalculatorWin::frontBracketButtonClicked()
{
if( !mathString.isEmpty() )
{
if( mathString.at( mathString.length() - 1 ) == '+' || mathString.at( mathString.length() 1 ) == '-' || mathString.at( mathString.length() - 1 ) == '*' || mathString.at(
mathString.length() - 1 ) == '/' )
{
mathString = mathString + "(";
expandLineEdit->setText( mathString );
}
}
else
{
mathString = mathString + "(";
expandLineEdit->setText( mathString );
}
}
void CalculatorWin::backBracketButtonClicked()
{
item = mainLineEdit->text();
if( mathString.count( "(" ) - mathString.count( ")" ) ) //check the number of bracket
{
if( mathString.at( mathString.length() - 1 ) != ')' )
{
Trang 99
if( !isRealMode )
{
mathString = mathString + "(" + item + ")" + ")";
item = "0";
expandLineEdit->setText( mathString );
}
else
{
mathString = mathString + item + ")";
item = "0";
expandLineEdit->setText( mathString );
}
}
else
{
mathString = mathString + ")";
expandLineEdit->setText( mathString );
}
}
}
void CalculatorWin::equalButtonClicked()
{
item = mainLineEdit->text();
if( mathString == "" )
{
mathString = item;
expandLineEdit->setText( mathString );
*engine = mathString; //transfer the expression to engine
result = engine->calculate(); //calculate the expression and return the result
}
else if( ( mathString.at( mathString.length() - 1 ) == ')' ) || ( ( mathString.at(
mathString.length() - 1 ) >= '0' ) && ( mathString.at( mathString.length() - 1 ) <= '9' ) ) )
{
correctError(); //correct the errors in expression
*engine = mathString; //transfer the expression to engine
result = engine->calculate(); //calculate the expression and return the result
}
else
{
if( !isRealMode )
{
mathString = mathString + "(" + item + ")";
item = "0";
expandLineEdit->setText( mathString );
correctError(); //correct the errors in expression
Trang 100
Trang 101
else
resultStr = resultStr + "+" + imag + "i";
}
mainLineEdit->setText( resultStr );
}
void CalculatorWin::correctError() //function to correct the errors in input string
{
mathString.replace( "+-", "-" );
mathString.replace( "+i", "+1i" );
mathString.replace( "-i", "-1i" );
mathString.replace( "(i", "(1i" );
}
void CalculatorWin::upButtonClicked() //slot to load the last expression
{
if( !mathStack1.isEmpty() )
{
mainLineEdit->setText( "0" );
item = "0";
mathString = mathStack1.top();
mathStack1.pop();
mathStack2.push( mathString );
expandLineEdit->setText( mathString );
}
}
void CalculatorWin::downButtonClicked() //slot to load the next expression
{
if( !mathStack2.isEmpty() )
{
mainLineEdit->setText( "0" );
item = "0";
mathString = mathStack2.top();
mathStack2.pop();
mathStack1.push( mathString );
expandLineEdit->setText( mathString );
}
}
void CalculatorWin::clsHistoryButtonClicked()
history of expression
{
mainLineEdit->setText( "0" );
expandLineEdit->setText( "" );
item = "0";
Trang 102
mathString = "";
while( !mathStack1.isEmpty() )
mathStack1.pop();
while( !mathStack2.isEmpty() )
mathStack2.pop();
}
void CalculatorWin::setUpOrDownButtonEnbled() //slot to set up or down button enbled
{
if( mathStack1.isEmpty() )
{
upButton->setEnabled( false );
}
else
{
upButton->setEnabled( true );
}
if( mathStack2.isEmpty() )
{
downButton->setEnabled( false );
}
else
{
downButton->setEnabled( true );
}
}
void CalculatorWin::keyPressEvent( QKeyEvent *event )
event
{
switch( event->key() )
{
case Qt::Key_0:
zeroButton->click();
break;
case Qt::Key_1:
oneButton->click();
break;
case Qt::Key_2:
twoButton->click();
break;
case Qt::Key_3:
threeButton->click();
break;
case Qt::Key_4:
fourButton->click();
Trang 103
break;
case Qt::Key_5:
fiveButton->click();
break;
case Qt::Key_6:
sixButton->click();
break;
case Qt::Key_7:
sevenButton->click();
break;
case Qt::Key_8:
eightButton->click();
break;
case Qt::Key_9:
nineButton->click();
break;
case Qt::Key_Period:
dotButton->click();
break;
case Qt::Key_Plus:
addButton->click();
break;
case Qt::Key_Minus:
subButton->click();
break;
case Qt::Key_Asterisk:
mulButton->click();
break;
case Qt::Key_Slash:
divButton->click();
break;
case Qt::Key_I:
complexButton->click();
break;
case Qt::Key_Equal:
equalButton->click();
break;
case Qt::Key_Enter:
case Qt::Key_Return:
equalButton->click();
break;
case Qt::Key_Control:
if( isRealMode )
complexRadioButton->click();
else
realRadioButton->click();
Trang 104
break;
case Qt::Key_C:
clsHistoryButton->click();
break;
case Qt::Key_Delete:
clearButton->click();
break;
case Qt::Key_Backspace:
backButton->click();
break;
case Qt::Key_ParenLeft:
frontBracketButton->click();
break;
case Qt::Key_ParenRight:
backBracketButton->click();
break;
case Qt::Key_PageUp:
upButton->click();
break;
case Qt::Key_PageDown:
downButton->click();
break;
default:
break;
}
}
+ Comlex.cpp
#include"complex.h"
Complex::Complex( double realNum, double imagNum )
:real ( realNum ), imag ( imagNum )
{
//the body of funtion is empty
}
const Complex Complex::operator + ( const Complex &right ) //overloading operator '+'
{
Complex result;
result.real = this->real + right.real;
result.imag = this->imag + right.imag;
return ( result );
}
const Complex Complex::operator - ( const Complex &right ) //overloading operator '-'
{
Complex result;
Trang 105
Trang 106
if( ch == 'i' )
{
isReal = false;
indexOfi = i;
}
}
if( isReal )
{
this->real = rightStr.toDouble();
this->imag = 0.0;
}
else
{
for( int i = indexOfi - 1; i >= 0; i-- )
{
ch = rightStr.at(i);
if( ( ch == '+' ) || ( ch == '-' ) )
{
partOfRight = rightStr.mid( i, indexOfi - i );
rightStr.remove( i, indexOfi - i + 1 );
break;
}
}
if( partOfRight.isEmpty() )
{
partOfRight = rightStr.mid( 0, indexOfi );
rightStr.remove( 0, indexOfi + 1 );
}
this->imag = partOfRight.toDouble();
if( !rightStr.isEmpty() )
this->real = rightStr.toDouble();
else
this->real = 0.0;
}
return( *this );
}
bool Complex::isZero() //determine whether the number is zero
{
if( ( this->real == 0.0 ) && ( this->imag == 0.0 ) )
return true;
else
return false;
Trang 107
}
double Complex::getReal() //get the real part of complex
{
return ( real );
}
double Complex::getImag() //get the imag part of complex
{
return ( imag );
}
Trang 108
Chng 8
LP TRNH DRIVER
BI 1
DRIVER V APPLICATION
TRONG H THNG NHNG
I.
H thng nhng (embedded system) c ng dng rt nhiu trong cuc sng ngy
nay. Theo nh ngha, h thng nhng l mt h thng x l v iu khin nhng tc v
c trng trong mt h thng ln vi yu cu tc x l thng tin v tin cy rt cao.
N bao gm phn cng v phn mm cng phi hp hot ng vi nhau, ty thuc vo
ti nguyn phn cng m h thng s c phn mm iu khin ph hp. i khi chng ta
thng nhm ln h thng nhng vi my tnh c nhn. H thng nhng cng bao gm
phn cng (CPU, RAM, ROM, USB, ...) v phn mm (Application, Driver, Operate
System, ...). Th nhng khc vi my tnh c nhn, cc thnh phn ny c rt gn,
thay i cho ph hp vi mt mc ch nht nh ca ng dng sao cho ti u ha thi
gian thc hin p ng yu cu v thi gian thc (Real-time) theo tng mc .
Bi ny s i su vo tm hiu cu trc bn trong phn mm ca h thng nhng nhm
mc ch hiu c vai tr ca driver v application, phn phi nhim v hot ng cho
hai lp ny sao cho t hiu qu cao nht v thi gian.
II.
H thng nhng thng thng bao gm nhng thnh phn sau: Phn cng: B vi x
l trung tm, b nh, cc thit b vo ra; Phn mm: Cc Driver cho thit b, H iu
hnh v cc chng trnh ng dng.
Mi lin h gia cc thnh phn c minh ha trong s hnh 3-2.
Thnh phn th nht trong h thng nhng l phn cng. y l thnh phn quan
trong nht trong h thng. Lm nhim v thc t ha nhng dng lnh t phn mm yu
cu. Phn cng ca h thng nhng thng bao gm nhng thnh phn chnh sau:
Trang 109
Trang 110
thi. Cc loi ROM nh NAND Flash, NOR Flash, ... thng c dung lng ln nht
trong h thng nhng, dng cha nhng chng trnh ln (h iu hnh, rootfs,
bootstrapcode, ... ) lu di s dng trong nhng mc ch khc nhau khi ngi dng
(h iu hnh v user) cn s dng n. Chng tng t nh a cng trong my tnh
c nhn.
Cc thit b vo ra: y l nhng module c tch hp sn bn trong vi iu
khin. Chng c th l ADC module, Ethenet module, USB module, ... cc thit b ny c
vai tr giao tip gia h thng vi mi trng bn ngoi.
Thnh phn quan trng th hai trong mt h thng nhng l phn mm. Phn mm
ca h thng nhng thay i theo cu trc phn cng. H thng ch hot ng hiu qu
khi phn mm v phn cng c s tng thch nhau. i t thp ln cao thng thng
phn mm h thng nhng bao gm cc lp sau: Driver thit b, h iu hnh, chng
trnh ng dng.
Cc driver thit b (device driver): y l nhng phn mm c vit sn trc
tip iu khin phn cng h thng nhng. Mi mt h thng nhng c cu to t
nhng phn cng khc nhau, nhng vi iu khin vi nhng tp lnh khc nhau, nhng
module khc nhau ca cc hng khc nhau c c ch giao tip khc nhau, device driver
lm nhim v chun ha thnh nhng th vin chung (c m lnh ging nhau), phc v
cho h iu hnh v ngi vit chng trnh lp trnh d dng hn. Chng hn, nhiu h
thng c giao thc truy xut d liu khc nhau, nhng device driver s quy v 2 hm duy
nht mang tn read v write c v nhp thng tin cho h thng x l. phn bit
gia cc thit b vi nhau, device driver s cung cp mt ID duy nht cho thit b
nhm mc ch thun tin cho vic qun l. **Device driver s c trnh by rt r
trong nhng bi khc.
H iu hnh: y cng l mt phn mm trong h thng nhng, nhim v ca n
l qun l ti nguyn h thng. Bao gm qun l tin trnh, thi gian thc, truy xut vng
nh o v vng nh vt l, cc giao thc mng, ...
Chng trnh ng dng: Cc chng trnh ng dng l do ngi dng lp trnh.
Thng thng trong h thng nhng, cng vic lp trnh v bin dch thng thng
Trang 111
Trang 112
m bo an ton cho h thng khi khng cn hot ng. Ni cch khc, trc khi kt
thc, Device driver phi khi phc trng thi trc ca h thng tr li ti nguyn cho
cc Device driver khc s dng khi cn, trnh tnh trng xung t phn cng.
Mt Application c th thc thi nhng lnh m khng cn nh ngha trc , cc
lnh ny cha trong th vin lin kt ng ca h iu hnh. Khi vit chng trnh cho
Application, chng ta s tic kim c thi gian, cho ra sn phm nhan hn. Trong khi
, Device driver mun s dng lnh no th i hi phi nh ngha trc . Vic nh
ngha ny c thc hin khi chng ta dng khai bo #include <linux/library.h>, nhng
th vin ny phi thc s tn ti, ngha l cn dng m lnh C cha bin dch. Cc th
vin ny cha trong h thng m ngun ca h iu hnh trc khi c bin dch.
Mt chng trnh Application ang thc thi nu pht sinh mt li th khng cn hot
ng c na. Trong khi , khi mt tc v trong module b li, n ch nh hng n
cu lnh gi m thi (ngha l kt qu truy xut s khng ng) cc lnh tip theo sau vn
c th tip tc thc thi. Thng thng lc ny chng ta s thot khi chng trnh bng
lnh exit(n), m bo d liu x l l chnh xc.
Chng ta c hai thut ng mi, user space (khng gian ngi dng) v kernel space
(khng gian kernel). Khng gian y chng ta nn hiu l khng gian b nh o, do h
thng Linux nh ngha v qun l. Cc chng trnh ng dng Application c thc thi
trong user space, cn nhng Device driver khi c bin dch thnh tp tin .ko s c
lu tr trong kernel space. Kernel space v User space lin h nhau thng qua h iu
hnh (operating system).
Trong khi hu ht cc lnh trong tng tin trnh v tuyn c thc hin tun t nhau,
kt thc lnh ny ri mi thc hin lnh tip theo, trong user space; Th cc module trong
device driver c th cng mt lc phc v ng thi nhiu tin trnh, tuyn. Do
Device driver khi lp trnh phi m bo gii quyt c vn ny trnh tnh trng xung
t vng nh, phn cng trong qu trnh thc thi.
IV.Kt lun:
Chng ta tm hiu s lc v cu trc tng qut trong h thng nhng, hiu c
vai tr chc nng ca tng thnh phn. Bn cnh chng ta cng phn bit c
Trang 113
nhng c im khc nhau gia chng trnh trong user space v Device Driver trong
kernel space. Nhng kin thc ny rt quan trng khi bc vo lp trnh driver cho thit
b. Chng ta phi bit phn cng nhim v gia user application v kernel driver sao cho
t hiu qu cao nht.
Bi tip theo chng ta s i vo tm hiu cc loi driver trong h thng Linux, cch
nhn dng tng loi, cng nh cc thao tc cn thit khi lm vic vi driver.
Trang 114
BI 2
Mt trong nhng mc ch quan trng nht khi s dng h iu hnh trong h thng
nhng l lm sao cho ngi s dng khng nhn bit c s khc nhau gia cc loi
phn cng trong qu trnh iu khin. Ngha l h iu hnh s quy nhng thao tc iu
khin khc nhau ca nhiu loi phn cng khc nhau thnh mt thao tc iu khin chung
duy nht. V d nh, h iu hnh quy nh tt c nhng a, thit b vo ra, thit b
mng u di dng tp tin v th mc. Vic khi ng hay tt thit b ch n gin l
ng hay m tp tin (th mc) cn sau khi thao tc ng hay m h iu hnh lm g
l cng vic ca device driver.
Trong mt h thng nhng, khng phi ch c CPU mi c th x l thng tin m tt
c nhng thit b phn cng u c mt c cu iu khin c lp trnh sn, c trng
cho tng thit b. Mi mt th nh, USB, chut, USB Camera, iu l nhng h thng
nhng c lp, chng c tng nhim v ring, m trch mt cng vic x l thu thp
thng tin c th. Mi b iu khin ca cc thit b iu cha nhng thanh ghi lnh v
thanh ghi trng thi. V iu khin c th chng ta phi cung cp nhng s nh phn
cn thit vo thanh ghi lnh, c thanh ghi trng thi cho bit trng thi thc hin. Tng
t khi mun thu thp d liu, chng ta phi cung cp nhng m cn thit, theo nhng
bc cn thit do nh sn xut quy nh. Thay v phi lm nhng cng vic nhm chn
, chng ta s giao cho device driver m trch. Device driver thc cht l nhng hm
c lp trnh sn, np vo h iu hnh. C ng vo l nhng giao din chung, ng ra l
nhng thao tc ring bit iu khin tng thit b ca device driver .
Linux cung cp cho chng ta 3 loi device driver: Character driver, block driver, v
network driver. Character driver hot ng theo nguyn tc truy xut d liu khng c
vng nh m, ngha l thng tin s di chuyn lp tc t ni gi n ni nhn theo tng
byte. Block driver th khc, hot ng theo c ch truy xut d liu theo vng nh m.
Trang 115
1 root
root
1,
3 Apr 11
2002 null
crw-------
1 root
root
10,
1 Apr 11
2002 psaux
crw-------
1 root
root
4,
crw-rw-rw-
1 root
tty
4,
64 Apr 11
2002 ttys0
crw-rw----
1 root
uucp
4,
65 Apr 11
2002 ttyS1
crw--w----
1 vcsa
tty
7,
1 Apr 11
crw--w----
1 vcsa
tty
7, 129 Apr 11
2002 vcsa1
crw-rw-rw-
1 root
root
1,
2002 zero
5 Apr 11
2002 vcs1
Ct th nht cho chng ta thng tin v loi device driver. Theo thng tin trn th tt c
u l character driver v nhng k t u tin iu l c, tng t nu l block driver
th k t u l b. Chng ta ch n ct th 4 v 5, ti y c hai thng tin cch nhau
bng du , hai s ny c gi l Major v Minor. Mi thit b trong h iu hnh u
c mt s 32 bits ring bit qun l. S ny c chia thnh hai thng tin, thng tin
th nht l Major number. Major number l s c 12 bit, dng phn bit tng nhm
thit b vi nhau, hay ni cch khc nhng thit b cng loi s c chung mt s Major.
Trang 116
Cc thit b cng loi c cng s Major c phn bit nhau thng qua thng tin th hai
l s Minor. S Minor l s c chiu di 20 bit. Vi hai s Major v Minor, tng cng h
iu hnh c th qun l s thit b ti a l 2 12*220 tng ng vi 232.
Trong lp trnh driver, i khi chng ta mun thao tc vi hai thng tin Major v
Minor numbers. Kernel cung cp cho chng ta nhng hm rt hu ch thc hin nhng
cng vic ny. Sau y l mt s hm tiu biu:
#include <linux/types.h>
#include <linux/kdev_t.h>
int MAJOR (dev_t dev);
int MINOR (dev_t dev);
dev_t MKDEV (int major, int minor);
Trc khi s dng nhng hm ny, chng ta phi khai bo th vin ph hp cho
chng. th vin <linux/types.h> cha nh ngha kiu d liu dev_t, bin kiu ny dng
cha s nh danh cho thit b. Th vin <linux/kdev_t.h> cha nh ngha cho nhng
hm MAJOR(), MINOR(), MKDEV,
Hm MAJOR (dev_t dev) dng tch s Major ca thit b dev_t dev v lu vo
mt bin kiu int;
Hm MINOR (dev_t dev) dng tch s Minor ca thit b dev_t dev v lu vo
mt bin kiu int;
Hm MKDEV (int major, int minor) dng to thnh mt s nh danh thit b kiu
dev_t t hai s int major, v int minor;
i vi kernel 2.6 tr i th s device driver dev_t c 32 bit. Nhng i vi nhng
kernel i sau th dev_t c 16 bit.
Trang 117
III.
Kt lun:
Trang 118
BI 3
Character device driver l mt trong 3 loi driver trong h thng Linux. y l driver
d v ph bin nht trong cc ng dng giao tip va v nh i vi lp trnh nhng.
Character driver v cc loi driver khc u c h iu hnh qun l di dng tp tin
v th mc. H iu hnh s dng cc hm truy xut tp tin chun giao tip trao i
thng tin gia ngi lp trnh v thit b do driver iu khin. Chng hn nhng hm nh
read, write, open, release, close, c dng chung cho tt c cc
Trang 119
Trang 120
trng. Khi driver c s dng trn nhng my tnh khc, th s nh danh c chn c
th b trng vi cc driver khc. V th vic la chn mt s nh danh ng l cn thit.
V s nh danh ng s khng trng vi bt k s nh danh no tn ang tn ti trong
h thng.
V d, nu mun ng k mt character driver c tn l lcd_dev, s lng l 1, s
Major u tin l 2, chng ta tin hnh khai bo hm nh sau:
/*Khai bo bin lu tr m li tr v ca hm*/
int res;
Cng
tng
nh
hm
register_chrdev_region
(),
hm
Trang 121
Tham s th ba, unsigned int count, l s lng nh danh mun cp, tnh t s
Major c cp ng v s Minor unsigned int first minor;
Tham s th t, char *name, l tn ca driver thit b mun ng k.
V d khi mun ng k thit b tn lcd_dev, s Minor u tin l 0, s thit b
mun ng k l 1, s nh danh khi to ra c lu vo bin dev_t dev_id. Lc ny hm
alloc_chrdev_region () khai bo nh sau:
Tuy nhin vic dng k s nh danh ng cho thit b i khi cng c nhiu bt li.
Gi s s nh danh ca thit b cn c s dng cho nhng mc ch khc, v th s
nh danh lun thay i khi mi ln ci t driver s sinh ra li trong qu trnh thc thi
lnh. kt hp u im ca 2 phng php, chng ta s ng k driver thit b theo
cch sau:
/*Khai bo cc bin cn thit*/
int lcd_major; //Bin lu tr s Major
int lcd_minor; //Bin lu tr s Minor
dev_t dev_id; //Bin lu tr s nh danh thit b
int result; //Bin lu m li
Trang 122
register_chrdev_region
(dev,
lcd_nr_devs,
"lcd_dev");
} else {
"lcd:
can't
get
major
%d\n",
lcd_major);
return result;
}
Trang 123
iu hnh gip giao tip gia ngi lp trnh ng dng vi thit b vt l. Cu trc
file_operation c nh ngha trong th vin <linux/fs.h>. Mi mt tp tin thit b
c m trong h iu hnh linux u c h iu hnh dnh cho mt vng nh m t
cu trc tp tin, trong cu trc tp tin c rt nhiu thng tin lin quan phc v cho vic
thao tc vi tp tin (chng ta s nghin cu k trong phn sau). Mt trong nhng
thng tin ny l file_operations, dng m t nhng hm m driver thit b ang c m
h tr. C th ni mt cch khc mi tp tin thit b trong h thng linux tng t nh
mt vt th v file_operation l nhng cng dng ca vt th .
Cu trc file_operations l mt thnh phn trong cu trc file_structure khi tp tin
thit b c m. Mi thnh phn trong file_operations bao gm nhng lnh cn bn theo
chun do h iu hnh nh ngha, nhng nhng lnh ny cha c nh ngha thao tc
c th, y l nhim v ca ngi lp trnh driver. Chng ta phi lin kt nhng thao tc
mun lp trnh vi nhng dng hm chun ny.
Sau y chng ta s tm hiu mt s nhng thnh phn quan trong trong cu trc
file_structure:
struct module *owner
y khng phi l mt lnh trong driver m ch l con tr cho bit tn driver no qun
l nhng lnh c lin kt. Thng tin ny c thit lp thng qua macro
THIS_MODULE nh ngha trong th vin <linux/module.h>.
ssize_t (*read) (struct file *, char __user *, size_t, loff_t
*);
Trang 124
phn bit thit b ny vi thit b khc khi s dng nhiu thit b. Tham s th hai, char
__user *, l con tr c khai bo trong user space, cha thng tin mun ghi t ngi
s dng. Tham s th ba, size_t l kch thc d liu mun ghi (tnh bng byte).
Tham s th t, loff_t *, l con tr ch a ch d liu trong thit b cn ghi thng tin,
nu trng th mc nh l v tr u tin. Hm c gi tr tr v l kch thc d liu ghi
thnh cng.
int (*open) (struct inode *, struct file *);
Hm chun ny dc thc thi khi driver thit b khng cn s dng, thot khi h
thng linux. Cng tng t nh hm open, hm release c th khng cn khai bo trong
cu trc tp lnh file_operation. Tuy nhin thun li trong qu trnh lp trnh, chng ta
nn khai bo hm release_device trong driver c th tr v m li nu cn thit.
int (*ioctl) (struct inode *, struct file *, unsigned int,
unsigned long);
sau). Tham s th hai, struct file *, l cu trc tp tin ang m trong h thng
Trang 125
linux. Tham s th ba, unsigned int, l s unsigned int phn bit nhng lnh
khc nhau, c th gi y l s nh danh lnh. tham s th ba, dng unsigned long,
l tham s ca hm tng ng vi s nh danh lnh. Chng ta s nghin cu su cc s
dng hm trong nhng bi sau.
Sau y l mt v d cho thy cch gn chc nng cho cc hm s dng trong tp lnh
ca character device driver.
/*Khai bo cu trc lnh cho driver*/
struct file_operations lcd_fops = {
THIS_MODULE,
lcd _read,
lcd _write,
lcd _ioctl,
lcd _open,
lcd _release,
};
Tip theo chng ta s nghin cu cu trc khc ln hn trong character device driver.
Cu trc ny cha nhng thng tin thao tc tp tin cn thit khi tp tin ang m trong
c cu trc tp lnh file_operations.
IV.
Trang 126
Thng tin ny quy nh ch truy xut tp tin thit b. Mt tp tin khi c m trong
h thng s c th ch c php c, ch c php ghi, hay c hai bng cch s dng
cc bit c FMODE_READ v FMODE_WRITE. Chng ta nn kim tra ch truy xut ca
tp tin thit b khi s dng hm ioclt hay open. Nhng khi s dng hm read v write th
khng cn thit. V trc khi thc thi cc hm ny h thng s t ng kim tra cc c
hp l hay khng, nu khng h thng s b qua khng thc thi.
loff_t f_pos;
dng nhiu nht kim tra lnh thc hin c phi l lnh truy xut theo block hay
khng. Cn nhng thng tin truy xut khc thng thng c kim tra thng qua
f_mode. Cc nh ngha cho gi tr bit c cha trong th vin <linux/fcnt.h>
struct file_operations *f_op;
Thng tin ny cha nh ngha cc tp lnh tng ng ca tng tp tin thit b. Thng
tin ny c gii thch r trong phn trn.
void *private_data;
Trang 127
Mi mt cu trc inode structure i din cho mt tp tin thit b, thng tin ny trong
inode structure cha s nh danh thit b m chng ta to trong phn trc.
struct cdev *i_cdev;
struct cdev l kiu cu trc lu tr thng tin ca mt tp tin lu tr trong kernel.
Trang 128
Trc khi ci t thng tin vo kernel chng ta phi khai bo cho kernel dnh ra mt
khng gian vng nh ring, chun b cho qu trnh ci t. C hai cch thc hin cng
vic ny.
Cch 1: Khai bo cu trc trc khi nh ngha thng tin.
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
...
(Tng t cho nhng trng khc)
u tin chng ta khai bo con tr cu trc dng struc cdev cha con tr struct
cdev trng do hm cdev_alloc() tr v. Tip theo, nh ngha tng thng tin lin
quan cho cu trc va to ra. Chng hn, trong cu lnh trn, chng ta cp nht con tr
cu trc lnh cho cdev ny bng lnh gn c bn my_cdev->ops = &my_fops; trong
&my_fops l cu trc lnh c to thnh t trc c gn vo trng ops ca
cu trc my_cdev.
Cch 2: Thc hin nh ngha thng tin trc khi khai bo cho kernel.
struct cdev *my_cdev;
Trang 129
my_cdev->ops = &my_ops;
...
(Tip theo cho nhng trng khc)
cdev_init ( my_cdev, my_ops);
Nh vy, sau khi nh ngha xong cc trng cn thit cho cu trc struct cdev, chng
ta tin hnh gi hm cdev_init (); thng bo cho kernel dnh ra mt vng nh
ring lu tr cdev mi va to ra.
Cu trc ca hm cdev_init () nh sau:
void
cdev_init(struct
cdev
*cdev,
struct
file_operations
*fops);
Vi struct cdev *cdev l con tr cu trc lu thng tin driver c khai bo,
struct file_operations *fops l cu trc tp lnh ca driver.
Sau khi khai bo cho kernel dnh mt vng nh lu tr cu trc driver, cng vic cui
cng l triu gi hm cdev_add () ci t cu trc ny vo kernel. Cu trc ca
hm cdev_add nh sau:
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
Vi cdev *dev l cu trc driver mun tho b, khi driver c tho b, th kernel
khng th s dng nhng hm nh ngha trong kernel c na.
VII.
Trang 130
Tng kt:
Trang 131
BI 4
Trang 132
ssize_t
read(struct
file
*filp,
char
__user
*buff,
size_t
__user
*buff,
write(struct
file
*filp,
const
char
2. Gii thch:
Trong c hai hm trn, filp l con tr tp tin thit b mun truy xut d liu; count
l kch thc mun truy xut tnh bng n v byte. buff l con tr n nh khai bo
trong application lu d liu c v trong trng hp l hm read(), trong trng
hp l hm write() th chnh l con tr n vng nh rng cn ghi d liu n. Cui
cng offp l con tr dng long offset lu v tr con tr hin ti ca tp tin ang c truy
cp. Sau y chng ta s tm hiu k hn tng tham s trong hm.
Con tr const char __user *buff trong hm read(...) v write(...)
u l nhng con tr tr n mt vng nh trong user space do ngi lp trnh khai bo
lu d liu truy xut t driver thit b. Hn na driver hot ng trong mi trng
kernel. Gia user space v kernel space c nhng nguyn tc qun l b nh khc nhau.
Do , driver, hot ng trong mi trng kernel, khng th giao tip vi con tr ny,
hot ng trong mi trng user, mt cch trc tip m phi thng qua mt s hm c
bit.
Nhng hm giao tip ny c linux nh ngha trong th vin <asm/uaccess.h>.
Cc hm ny l:
unsigned long copy_to_user (void __user *to, const void
*from, unsigned long count); Cng dng ca hm l chp d liu t kernel
space sang user space; Trong , void __user *to l con tr tr n vng nh trong
user space lu d liu chp t kernel space; const void *from l con tr cha d
liu trong kernel space mun chp qua user space; unsigned long count l s bytes
d liu mun chp.
unsigned long copy_from_user (void *to, const void __user
*from, unsigned long count); Cng dng ca hm l chp d liu t user space
sang kernel space; Trong , void *to l con tr tr n vng nh trong kernel space
Trang 133
lu d liu chp t user space; const void __user *from l con tr tr cha d liu
trong user space mun chp qua kernel space; unsigned long count l s bytes d
liu mun chp.
Hai hm u c gi tr tr v kiu unsigned long. Trc khi truyn d liu chng
kim tra gi tr con tr vng nh c hp l hay khng. Nu khng hp l, th qu trnh
truyn d liu khng th thc hin v hm s tr v m li -EFAULT. Nu trong qu trnh
truyn d liu, gi tr con tr cp nht b li, th qu trnh truyn dng ngay ti thi im
, v nh th ch mt phn d liu c chp. Phn d liu truyn thnh cng s c
thng bo trong gi tr tr v di dng s byte. Chng ta cn c vo gi tr ny truyn
li thng tin nu cn thit. Nu khng c li xy ra, hm s tr v gi tr 0.
Chng ta s minh ha nguyn tc hot ng ca hm read() v write() thng
qua s hnh 3-3:
dev_write
write()
copy_from_user()
Trang 134
thi cp nht nhng thng tin cn thit phc v theo di qu trnh truyn d liu.
Cng vic ny c thc hin bi ngi lp trnh driver.
III.
Trn y chng ta tm hiu hai giao din read() v write() dng trao i d
liu qua li gia user space v kernel space, hay ni ng hn l gia driver thit b vt
l v chng trnh ng dng. Th nhng trong thc t, ngoi vic trao i d liu, mt
driver thit b cn phi thc hin nhiu cng vic khc v d: cp nht cc thng s giao
tip (tc baund, s bits d liu truyn nhn, ...) ca thit b vt l, iu khin trc tip
cc thanh ghi lnh phn cng, ng m cng giao tip, ... Linux cung cp cho mt giao
din chun khc phc v cho tt c cc thao tc iu khin trn, l giao din
ioctl().
cao, mang tnh cht ri rc. Trong trng hp d liu truyn theo tng khi, lin tc th
s dng hm read() v write() l mt la chn khn ngoan.
1. Cu trc lnh:
Hm ioctl() c cu trc nh sau:
#include <linux/ioctl.h>
int (*ioctl) (struct inode *inode, struct file *filp, unsigned
int cmd, unsigned long arg);
2. Gii thch:
Nh trn phn tch, tt c nhng giao din trong character device driver u khng
c nhng chc nng c th. Nhng tham s lnh ch mang tnh tng qut, ngi lp trnh
driver phi hiu r ngha tng tham s sau s nh ngha c th chc nng tng tham
s ny a vo s dng ty theo yu cu trong thc t. Sau y chng ta s tm hiu
cc tham s trong hm ioctl.
struct inode *inode v struct file *filp l con tr inode structure v
file structure tng ng vi tng thit b c m trong chng trnh. Hai tham s ny
u cha trong s m t tp tin (file descriptor) gi tt l fd, c tr v khi thc hin m
Trang 135
thit b thnh cng bi hm open(). (**Theo nguyn tc, trc khi thc hin giao tip
vi cc thit b trong h thng linux, chng ta phi truy cp n cu trc inode ca tp
tin thit b trn b nh, kch hot khi ng thit b bng hm open(), hm ny s quy
nh ch truy xut tp tin thit b ny, sau khi kch hot thnh cng hm open() s
tr v s m t tp tin fd, mang tt c thng tin ca thit b ang c m trong h
thng).
unsigned int cmd, l s unsigned int do ngi lp trnh driver quy nh. Mi
lnh trong ioctl c phn bit nhau thng qua s cmd ny.
S unsigned int cmd c 16 bits c chia thnh 2 phn. Phn u tin c 8 bits
MSBs c gi l s magic dng phn bit lnh ca thit b ny vi thit b khc. Phn
th hai c 8 bit LSBs dng phn bit nhng lnh khc nhau ca cng mt thit b. S
nh danh lnh ny tng t nh s nh danh thit b, phi c nh ngha duy nht
trong h thng linux. bit c s nh danh lnh no cn trng, chng ta s tm trong
tp tin Documentation/ioctl-number.txt. Tp tin ny cha thng tin v cch s dng hm
ioctl() v thng tin v s nh danh lnh c s dng trong h thng linux. Nhim
Trang 136
'B'
_IO(IOC_GPIODEV_MAGIC, 10)
#define GPIO_SET
_IO(IOC_GPIODEV_MAGIC, 11)
#define GPIO_CLEAR
_IO(IOC_GPIODEV_MAGIC, 12)
#define GPIO_DIR_IN
_IO(IOC_GPIODEV_MAGIC, 13)
#define GPIO_DIR_OUT
_IO(IOC_GPIODEV_MAGIC, 14)
<ch truy xut lnh>: ioctl c 4 trng thi lnh: (Quy nh bi 2 bits
trng thi)
_IO lnh ioctl khng c tham s;
_IOW lnh ioctl cha tham s dng nhn d liu t user (tng dng chc
nng ca hm copy_from_user());
_ IOR lnh ioctl cha tham s dng gi d liu sang user (tng ng chc
nng ca hm copy_to_user());
_IOWR lnh ioctl cha tham s dng cho hai nhim v, c v ghi d liu ca user.
<s magic thit b>: L s c trng cho tng thit b do ngi dng nh
ngha.
-
<s m lnh thit b>: L s c trng cho tng lnh trong mi thit b.
Trang 137
static int
gpio_ioctl(struct inode * inode, struct file * file, unsigned
int cmd, unsigned long arg)
{
int retval = 0;
/*Thc hin la chn lnh thc thi bng lnh switch vi tham s la chn l s nh
danh lnh cmd*/
switch (cmd)
{
case GPIO_GET:
Trang 138
Tng kt:
ny cng c ngha rng: Gia ngi s dng v thit b vt l c th giao tip trao i
thng tin vi nhau d dng thng qua hot ng ca driver vi s h tr ca giao din.
Bn cnh nhng giao din trn, linux cn h tr rt nhiu giao din khc, ng dng ca
nhng giao din ny khng nm trong cc driver c nghin cu trong gio trnh cho
nn chng s khng c cp n. i vi nhng driver ln, s c rt nhiu giao din
khc nhau xut hin, nhim v ca chng ta l tm hiu nguyn l hot ng ca giao
din da vo nhng kin thc hc. y cng chnh l mc ch cui cng m nhm
bin tp mun thc hin trong cun gio trnh ny.
Trc khi bc vo vit mt driver hon chnh, chng ta s tm hiu cc cu trc
vit mt driver n gin trong bi sau.
Trang 139
BI 5
TRNH T VIT
CHARACTER DEVICE DRIVER
Lp trnh driver l mt trong nhng cng vic quan trng m mt ngi lp trnh h
thng nhng cn phi nm vng. mt chng trnh ng dng hot ng ti u, ngi
lp trnh phi bit phn cng nhim v gia driver v application sao cho hp l. Trong
mt ng dng iu khin, nu driver m trch nhiu chc nng th chng trnh trong
application s tr nn n gin, nhng b li ti nguyn phn cng s d b xung t,
khng thun li cho cc driver khc dng chung ti nguyn. Ngc li nu driver ch
thc hin nhng cng vic rt n gin, th chng trnh trong application tr nn phc
tp, vic chuyn qua li gia cc tin trnh tr nn kh khn. Vic phn chia nhim v
ny i hi phi c nhiu kinh nghim lp trnh thc t vi h thng nhng mi c th
em li hiu qu ti u cho h thng.
Vi nhng kin thc tng qut trnh by trong nhng phn trc v driver m ch
yu l character device driver, chng ta c nhng khi nim ban u v vai tr ca
driver trong h thng nhng, cch thc iu khin thit b vt l, cc giao din giao tip
thng tin gia user space v kernel space, ... trong phn ny chng ta s i vo cc bc
c th vit hon chnh mt character device driver.
Cng vic pht trin mt ng dng iu khin mi thng tin hnh theo nhng bc
sau:
Tm hiu nhu cu iu khin ngoi thc t: T hot ng thc tin hay n t
hng xc nh yu cu, thi gian thc hin, gi c chi ph, ...
Phn tch yu cu iu khin: T nhng yu cu gii hn v thi gian, chi ph,
cht lng, ngi lp trnh tm ra phng php ti u ha h thng, la chn cng
ngh ph hp, ...; Lp danh sch cc yu cu cn thc hin trong h thng iu
khin;
Phn cng nhim v iu khin gia application v driver h thng hot ng
ti u;
Trang 140
C rt nhiu cch vit character driver nhng cng ging nh chng trnh ng dng
application, character driver cng c nhng cu trc chung, chun, t s ty bin theo
tng yu cu c th. y, chng ta s tm hiu hai dng cu trc: Cu trc dng 1, v
cu trc dng 2;
Cu trc dng 1: Bao gm nhng thao tc c bn nht, nhng a s nhng thao tc
kim tra li, ly s nh danh lnh, s nh danh thit b, ... ngi lp trnh driver phi t
mnh thc hin. C mt u im l ngi lp trnh c th ty bin theo yu cu ca ng
dng, c kh nng pht trin driver. Nhng b li, thi gian thc hin hon chnh driver
c th chy trong linux lu hn.
Trang 141
Cu trc dng 2: Nhng thao tc c bn trong vic thnh lp cc thng s cho driver
nh: Ly s nh danh lnh, thit b, khai bo ci t driver vo h thng, ... c gi gn
trong mt cu lnh duy nht. u im l thi gian thc hin hon chnh mt driver nhanh
hn, n gin hn, cc dch v kim tra li c h tr sn, gip trnh xy ra li trong
qu trnh s dng. Th nhng vic ty bin ca ngi dng nm trong mt gii hn cho
php.
Thng thng chng ta nn dng cu trc dng 2 cho nhng driver n gin, v
nhng kh nng trong cu trc ny hu ht cng tng t nh trong cu trc dng 1, cng
cho chng ta thc hin tt c nhng thao tc iu khin khc nhau.
Sau y chng ta s tm hiu chi tit tng cu trc c ci nhn c th hn v nhng
u v nhc im nu trn. Cc chng trnh driver cng c cu trc tng t nh cc
chng trnh trong C, ch khc l chng c thm nhng hm chun nh ngha ring cho
vic giao tip iu khin gia user space v kernel space v cn nhiu c im khc
na, s c chng ta cp trong mi phn cu trc;
1. Cu trc chng trnh character device driver dng 1:
/*Bc 1: Khai bo th vin cho cc hm dng trong chng trnh, th vin dng
trong kernel space khc vi th vin dng trong user space. Th vin trong driver l
nhng hm, bin, hng s, ... c nh ngha sn v hu ht c lu trong th mc
linux/ trong cu trc m ngun ca linux. Do khi khai bo, chng ta phi ch r
ng dn n th mc ny */
#include <linux/module.h> //Th vin th nht trong th mc linux
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
......
Trang 142
struct cdev
struct file_operations
lnh
/*Bc 4: Khai bo nhng bin, cu trc cn dng trong chng trnh driver*/
unsigned int variable_0;
trong
unsigned long variable_1;//m lnh C, v C++
struct clk *device_clock_0;//
....
/*Bc 5: Khai bo, nh ngha nhng hm con, chng trnh con c s dng
trong driver*/
/*Chng trnh con th nht, c hai tham s parameter_0 v parameter_1 cng
kiu int*/
void sub_program_0 (int parameter_0, int parameter_1) {
Trang 143
/*Bc 6: nh ngha hm init cho driver, hm init l hm c thc thi u tin khi
thc hin ci t driver vo h thng linux bng lnh shell insmod driver_name.ko*/
/*Hm init c mt vai tr quan trng trong lp trnh driver. Ban u hm s gi
thc thi cc hm xc nh s nh danh thit b; Cp nht cc thng s ca cu
trc tp tin, cu trc lnh; ng k cc cu trc vo h thng linux; Khi to cc
thng s iu khin ban u cho cc thit b ngoi vi m driver iu khin*/
/*Hm init c kiu d liu tr v dng int, static trong trng hp ny ngha l
hm init ch dng ring cho driver s hu*/
static int __init at91adc_init (void) {
1,
allocate fail);
ret = -ENODEV; //Tr v m li cho bin ret;
return ret; //Tr v m li cho hm init;
}
Trang 144
cdev_init ( &device_cdev,
ngha;
device_devno,
1 );
/*Chp nht nhng thng tin cn thit cho cu trc tp tin va c h thng
dnh ra*/
device_cdev.owner = THIS_MODULE; /*Cp nht ngi s hu cu trc
tp tin*/
device_cdev.ops = &device_fops; /*Cp nht cu trc lnh c
nh ngha*/
/*ng k thit b vo h thng */
ret = cdev_add ( &device_cdev, //Tr n cu trc tp tin c khi
to;
device_devno, //S nh danh thit b c xc nh;
1 ); //S thit b mun ng k;
Trang 145
/*Bc 8: Khai bo hm open, y l hm c thc thi ngay sau khi lnh open trong
user space thc thi. Nhng lnh cha trong hm ny thng thng dng cp nht d
liu ban u cho chng trnh driver, khi to mi trng hot ng ban u h
thng lm vic n nh*/
static
int
device_open
(struct
inode
*inode,
struct
file
*filp)
{
Trang 146
/*Ni thc thi nhng lnh trc khi driver b ng, khng cn s dng*/
return 0;
}
/*Bc 10: Khai bo cc hm read(), write(), ioctl() trong h thng khi cn s dng*/
/*Hm read() c thng tin t driver qua chng trnh trong user*/
static ssize_t device_read (struct file *filp, char __iomem
*buf, size_t bufsize, loff_t *f_pos) {
/*Hm ioctl nh ngha cc trng thi lnh thc thi theo s nh danh lnh t
chng trnh ng dng bn user*/
static int
gpio_ioctl (struct inode * inode, struct file * file, unsigned
int cmd, unsigned long arg) {
Trang 147
switch (cmd) {
case LENH_0:
/*Bc 11: Gn cc con tr hm giao din chun vo cu trc lnh file structure*/
struct file_operations gpio_fops = {
.read
= device_read,
.write
= device_write,
.ioctl
= device_ioctl,
.open
.release
= device_open,
= device_release,
};
ci t*/
module_exit (device_exit); /*Hm device_exit() thc hin khi driver
c g b*/
/*Bc 13: Khai bo cc thng tin lin quan n driver*/
Trang 148
Trang 149
Ch ng driver thit b khi bin kiu atomic_t bng 1. Ch m khi bin kiu
atomic_t bng 0.
ng thit b, thc hin tng bin kiu atomic_t. M thit b, thc hin gim bin
kiu atomic_t.*/
/*Bc 6: Khai bo v nh ngha hm open, l hm c thc thi khi thc hin lnh
open() trong user application*/
static
int
device_open
(struct
inode
*inode,
struct
file
*file) {
/*Thc hin kim tra bin atomic_t trong qu trnh m thit b nhiu ln*/
if (!atomic_dec_and_test(&device_open_cnt)) {
DRVNAME
":
/*Tr v m li bn*/
Trang 150
Device
with
minor
ID
%d
return -EBUSY;
}
/*Thc hin nhng cng vic tip theo nu m tp tin thit b thnh cng*/
...
/*Bc 7: Khai bo v nh ngha hm close(), c thc hin khi thc thi hm close
trong user application*/
static
int
device_close
(struct
inode
*inode,
struct
*file) {
Trang 151
file
/*Thc hin k thut ly s minor dng cho thit b bng hng s nh ngha sn
trong th vin linux/miscdevice.h*/
.minor = MISC_DYNAMIC_MINOR,
/*Bc 10: Khai bo nh ngha hm init thc hin khi ci t driver vo h thng*/
/*Tng t nh trong dng 1, tuy nhin vi k thut mi ny, trong hm init chng ta
khng cn phi ly s nh danh thit b, khi to vng nh cho driver, ci t driver
vo h thng. Tt c nhng cng vic ny c thc hin bi mt hm duy nht l
misc_register()*/
static int __init device_mod_init(void) {
misc_register(&devive_dev);
/*Thc hin nhng cng vic khi phc h thng trc khi driver b tho g*/
...
Trang 152
II.
Sau khi lp trnh dirver, cng vic tip theo l bin dch driver bin tp tin m ngun
C thnh tp tin ngn ng my driver trc khi ci t vo h iu hnh. Sau y l cc
bc bin dch driver.
Bin dch driver c 2 dng, u tin bin dch driver khi tp tin m ngun driver thuc
mt b phn trong cu trc m ngun m ca kernel, khi driver c bin dch cng
lc vi kernel, cch ny ch p dng khi driver hot ng n nh, hn na chng ta
khng cn ci t li driver khi khi ng li h thng. Phng php th hai l bin dch
driver khi n nm ngoi cu trc m ngun m ca kernel, driver c th c bin dch
trong khi kernel ang chy, u im ca phng php ny l thi gian thc hin nhanh,
thch hp cho vic th nghim driver mi, th nhng mi ln h thng khi ng li,
driver s b mt do phi ci t li khi khi ng. Khi driver hot ng n nh
chng ta mi bin dch driver theo cch 1.
Bin dch driver hon ton khc vi bin dch chng trnh ng dng. Chng trnh
ng dng c nhng th vin chun trong h thng linux, nn khi bin dch ta ch vic
chp tp tin chng trnh vo trong mt th mc bt k trong cu trc root file system v
gi lnh bin dch. Nhng i vi driver, nhng th vin s dng khng nm sn trong
h thng, m nm trong cu trc m ngun m ca kernel. V th trc khi bin dch
driver chng ta phi gii nn tp tin m ngun m ca kernel vo cu trc root file
system. Sau to tp tin Makefile dng lnh make trong shell bin dch driver. Cu
trc Makefile c hng dn k trong phn lp trnh h thng nhng cn bn. Trong
phn ny chng ta ch to ra Makefile vi ni dung cn thit c th bin dch c
driver.
Bin dch driver c tin hnh theo cc bc sau:
Trang 153
Trang 154
Trong phn I, chng ta trnh by hai cu trc chung vit hon chnh mt
character device driver, mi cu trc u c nhng u v nhc im ring. Nhng u
v nhc im ny cn c biu hin r trong vic ci t driver vo h thng.
Sau khi bin dch thnh cng driver, xut hin tp tin .ko trong th mc cha tp
tin m ngun, chng ta dng nhng cu lnh trong shell hon tt cng on cui cng
a driver vo hot ng trong h thng, tin hnh kim tra chc nng. Ty theo k thut
p dng lp trnh driver m s c nhng thao tc ci t khc nhau:
1. Ci t driver khi p dng cu trc dng 1:
Tin hnh theo cc bc sau:
-
IV.
Tng kt:
Trang 155
Trong bi sau, chng ta s thc hnh vit mt character device driver mang tn l
helloworld. Driver ny s p dng tt c nhng k thut c hc. Nu cn thit, cc
bn c th xem li l thuyt c trc khi qua bi sau nm c nhng vn ct li
trong lp trnh driver.
Trang 156
BI 6
M u:
Trang 157
Sau khi chp thng tin cho user, driver thng bo cho ngi lp trnh bit qu trnh
chp thnh cng hay khng.
b. Giao din write():
Giao din write() dng chp thng tin t user space qua kernel space. Thng tin
t user l d liu kiu s do ngi dng nhp vo chuyn qua kernel thng qua giao din
write() lu vo mt bin trong kernel, bin ny cng l ni lu thng tin c chuyn
c th thc hin c tt c nhng chc nng khc. th hin c nhng chc nng
ny ca hm, chng ta lp trnh mt v d sau:
Xy dng giao din ioctl() thnh mt hm ton hc, thc hin cc php ton cng,
tr, nhn, chia. Cc tham s c truyn t user, sau khi tnh ton xong, kt qu c gi
ngc li user. Cc php ton c la chn thng qua cc s nh danh lnh.
2. Application:
Trang 158
Chng trnh trong user, s dng k thut ty chn trong hm main() kim tra tt
c nhng chc nng do chng trnh trong driver h tr. Mi chc nng s c thc
hin do ngi s dng la chn.
Trc khi i vo vit chng trnh c th, chng ta s tm hiu h iu hnh linux
thc hin ty chn trong hm main() nh th no:
Hm main() l hm c thc hin u tin khi chng trnh ng dng c gi
thc thi. T hm ny, ngi lp trnh s tin hnh tt c nhng chc nng nh to lp tin
trnh, tuyn, gi cc chng trnh con, ... Thng thng hm main() c khai bo nh
sau:
void main(void) {
/*Cc lnh do ngi lp trnh nh ngha*/
}
Tham s th hai char **argv l mng con tr lu ni dung tng tham s nhp
trong cu lnh gi chng trnh thc thi trong shell;
Trang 159
giao din hm cn thit thc hin chc nng cng, tr , nhn, chia, c v ghi c lp
trnh trong dirver. Thao tc c th s c chng ti ch thch trong tng dng lnh ca
dirver v application.
III.
trnh
application:
Chng
trnh
application
mang
tn
helloworld_app.c
(M lnh v gii thch chng trnh application cha trong CD nh km)
3. Thc thi chng trnh:
Cc bc bin dch v kt qu thc thi d n cha trong CD nh km
IV.
Tng kt:
Nh vy chng ta hon thnh cng vic vit hon chnh mt driver n gin da
vo cc bc mu trong bi hc trc. Cc bn cng hiu nguyn l hot ng ca
hm main c tham s, cch la chn tham s hot ng trong tng trng hp c th theo
yu cu.
Vi nhng thao tc trn, cc bn c th t mnh vit nhng dirver n gin trong x
l tnh ton, xut nhp thng bo, ... Th nhng, trong thc t, driver khng phi ch
dng trong vic truy xut nhng k t thng bo. Nhim v chnh ca n l iu khin
cc thit b phn cng thng qua cc hm giao tip vi cc cng vo ra, truy xut thanh
Trang 160
ghi lnh, d liu, ...ca thit b, thu thp thng tin lu vo vng nh m trong driver ch
chng trnh trong user truy xut. c th giao tip vi cc thit b phn cng thng
qua cc cng vo ra, trong bi sau chng ta s nghin cu cc hm giao tip gpio do linux
h tr sn.
Trang 161
BI 7
CC HM H TR GPIO
I. Tng quan v GPIO:
GPIO, vit tt ca cm t General Purpose Input/Output, l mt th vin phn mm
iu khin cc cng vo ra tch hp trn vi iu khin hay cc ngoi vi IO lin kt vi vi
iu khin . Hu ht cc vi iu khin u h tr th vin ny, gip cho vic lp trnh
cc cng vo ra tr nn thun tin hn. Cc tp lnh vo ra v iu khin, cch quy nh
s chn, ... hu ht tng t nhau so vi cc loi vi khin khc nhau. iu ny lm tng
tnh linh hot, gim thi gian xy dng h thng.
Theo nh quy nh chun, mi mt chn IO trn vi iu khin s tng ng vi mt
s GPIO ca th vin ny. S GPIO c quy nh nh sau: i vi vi iu khin
ARM9260, s cng vo ra l 3x32 cng, tng ng vi 3 ports, l cc Port A, Port B,
v Port C. Mi chn quy nh trong GPIO theo quy lut sau:
BASEx32+PIN;
Trong BASE l s c s ca Port. Port A c c s l 1, Port B l 2, Port C l 3.
PIN l s th t ca tng chn trong Port. Chn 0 c gi tr PIN l 32, 1 l 33, ... V d,
chn th 2 ca Port A c s GPIO l 33; Chn th 2 ca Port B c s GPIO l 65, ...
tng t cho cc chn cn li trn vi iu khin. i vi cc vi iu khin khc c s
Port ln hn ta ch vic tun theo quy lut trn tm s GPIO ph hp.
GPIO cho cc loi vi iu khin khc nhau iu c chung nhng tnh cht:
Mi chn trong GPIO u c th c hai ch input v output, ty vo loi vi iu
khin m GPIO ang s dng.
Trong ch input, cc chn GPIO c th lp trnh tr thnh ngun ngt h
thng.
V nhiu chc nng khc na, trong quyn sch ny chng ta ch tm hiu nhng
chc nng ph bin nht phc v giao tip vi cc chn IO trong cc chng trnh ng
dng.
Trang 162
Cng vic cui cng l a d liu n chn GPIO, nu l ng ra; hoc c d liu t
chn GPIO, nu l ng vo; ta s dng hai hm sau:
int gpio_get_value(unsigned gpio); //c d liu;
void gpio_set_value(unsigned
gpio, int
value);
//Xut
liu;
Do th vin gpio dng chung cho nhiu loi vi iu khin khc nhau, nn s lng
chn IO ca tng loi cng khc nhau. Cn thit phi cung cp mt hm kim tra s tn
ti ca chn trong h thng. Hm gpio_is_valid() lm nhim v ny. Hm c tham
s l int number l s chn gpio mun kim tra. Hm tr v gi tr 0 nu s chn gpio
Trang 163
Cng vic kim tra c thc hin u tin khi mun thao tc vi mt chn no
trong gpio. Nu hp l cc lnh tip theo s c thc hin. Ngc li, in ra thng bo
cho ngi dng v thot ra khi driver.
2. Hm gpio_request():
C php ca hm ny nh sau:
#include <linux/gpio.h>
int gpio_request ( unsigned gpio, const char *lable);
Sau khi kim tra tnh hp l ca chn gpio, cng vic tip theo l khai bo s dng
chn gpio . Linux kernel cung cp cho chng ta hm gpio_request() thc hin
cng vic ny. Hm gpio_request c hai tham s. Tham s th nht unsigned gpio
l chn gpio mun khai bo s dng; Tham s th hai const char *lable l tn
mun t cho gpio, phc v cho qu trnh thao tc vi chn gpio d dng hn. Tham s
ny c th trng bng cch dng hng s rng NULL.
Sau y l on chng trnh mu minh ha cch s dng hm gpio_request():
/*Nhng on lnh trc*/
Trang 164
...
3. Hm gpio_free():
C php ca hm ny nh sau:
#include <linux/gpio.h>
void gpio_free (unsigned gpio);
4. Hm gpio_direction_input():
C php ca hm ny nh sau:
#include <linux/gpio.h>
int gpio_direction_input (unsigned gpio);
Trang 165
5. Hm gpio_direction_output():
C php ca hm ny nh sau:
#include <linux/gpio.h>
int gpio_direction_output (unsigned gpio, int value);
chn gpio mun ci t. Tham s th hai, int value, l gi tr ban u ca gpio khi n
Trang 166
6. Hm gpio_get_value():
C php ca hm ny nh sau:
#include <linux/gpio.h>
int gpio_get_value (unsigned gpio);
Trang 167
...
7. Hm gpio_set_value():
C php ca hm ny nh sau:
#include <linux/gpio.h>
void gpio_set_value (unsigned gpio, int value);
Trang 168
8. Hm gpio_to_irq():
C php ca hm ny nh sau:
#include <linux/gpio.h>
int gpio_to_irq (unsigned gpio);
Trang 169
(70, 1);
(70, 1);
IRQF_TRIGGER_FALLING,
"MyIRQ", NULL);
/*Tr v m li cho hm gi */
return ret;
}
Nh vy trnh li trong qu trnh khi to ngt cho chn gpio, trc tin chng ta
phi ci t nhng thng s cn thit cho gpio , chng hn nh chn gpio phi hp l
v ch ng vo.
Trang 170
III.
Kt lun:
Trang 171
BI 8
Trang 172
ng thi. Trong kernel, nhng hm thao tc vi thi gian hot ng bn ngoi tm kim
sot ca h iu hnh, s dng trc tip ti nguyn phn cng ca h thng, c th l thi
gian hot ng ca vi x l trung tm trong vi iu khin. V th nu s dng khng ph
hp th h iu hnh s hot ng khng n nh, xy ra nhng li v thi gian thc trong
khi thc hin tc v. Nhng thi gian thc hin ca cc hm ny s nhanh hn, v khng
qua trung gian l h iu hnh, ph hp vi yu cu iu khin ca driver l nhanh chng
v chnh xc.
Trong bi ny, u tin chng ta s tm hiu nguyn tc qun l thi gian trong kernel,
sau l cc hm tng tc, x l thi gian thc, cch s dng nh thi trong timer, v
cui cng l mt s k thut tr hon thi gian trong kernel.
II. n v thi gian trong kernel:
qun l chnh xc thi gian, h iu hnh s dng b nh thi timer tch hp sn
trn vi iu khin m n hot ng. B nh thi (timer) c t cho mt gi tr c nh
sao cho c th sinh ra ngt theo chu k cho trc. Khong thi gian ca mt chu k ngt
c gi l tick. Trong mt giy c khong N ticks c hon thnh. Hay ni cch khc,
tc tick l N Hz. Gi tr N c nh ngha bi ngi s dng trc khi bin dch
kernel. Thng thng mt s h iu hnh c gi tr mc nh l N = 100 v y cng l
gi tr mc nh ca h iu hnh chy trn kit KM9260.
Gi tr ca HZ c nh ngha nh sau:
# define USER_HZ 100
*/
v
# define HZ 100
Trang 173
jiffies:
Trang 174
IV.
Trang 175
thao tc vi thi gian thc nm trong th vin <linux/time.h>. S khc bit gia hai
th vin ny l vai tr ca chng trong h thng. <time.h> cha trong lp user, giao
tip vi kernel, tng t nh cc hm giao din trung gian giao tip gia ngi dng vi
thi gian thc trong kernel, v th th vin cha nhng hm ch yu phc v cho ngi
dng; i vi th vin <linux/time.h> hot ng trong lp kernel, cha nhng hm
c lp trnh sn phc v ch yu cho h thng kernel, gip ngi lp trnh driver qun
l thi gian thc tin li hn, v d nh cc hm x l thi gian ngt, nh thi, so snh
thi gian, ... im c bit l thi gian thc trong kernel ch yu qun l di dng s
giy tuyt i, khng theo dng ngy thng nm nh trong user.
Cc kiu cu trc thi gian, ngha cc tham s trong nhng hm thi gian a phn
tng t nh trong th vin <time.h> trong user application nn chng s c trnh
by s lc trong khi gii thch.
1. Cc kiu, cu trc thi gian:
a. Cu trc timespec: cu trc ny c nh ngha nh sau:
struct timespec {
__kernel_time_t
long
tv_sec;
tv_nsec;
/* seconds */
/* nanoseconds */
};
Trong , tv_sec dng lu thng tin ca giy; tv_nsec dng lu thng tin nano
giy ca giy hin ti.
b. Cu trc timeval: Cu trc ny c nh ngha nh sau:
struct timeval {
__kernel_time_t
tv_sec;
__kernel_suseconds_t
tv_usec;
/* seconds */
/* microseconds */
};
Trong , tv_sec dng lu thng tin v s giy; tv_usec dng lu thng tin v
micro giy ca giy hin ti.
c. Cu trc timezone: Cu trc ny c nh ngha nh sau:
struct timezone {
Trang 176
int
tz_minuteswest;
int
tz_dsttime;
};
(a->tv_sec
==
b->tv_sec)
&&
(a->tv_nsec
==
b-
>tv_nsec);
}
trong cu trc, tv_sec v tv_nsec, nu hai thnh phn ny bng nhau th hai cu trc
thi gian ny bng nhau. Khi hm tr v gi tr true, ngc li tr v gi tr false;
b. timespec_compare: Hm c nh ngha nh sau:
static inline int timespec_compare(const struct timespec *lhs,
const struct timespec *rhs)
{
if (lhs->tv_sec < rhs->tv_sec)
return -1;
if (lhs->tv_sec > rhs->tv_sec)
return 1;
return lhs->tv_nsec - rhs->tv_nsec;
}
Nhim v ca hm l so snh hai cu trc thi gian kiu timespec, const struc
timespec *lhs v const struct timespec *rhs. Kt qu l mt trong 3 trng
hp sau:
Trang 177
Nhim v ca hm l so snh hai cu trc thi gian kiu timeval, const struct
timeval *lhs v const struc timeval *rhs. Kt qu tr v l mt trong 3
trng hp:
Nu lhs < rhs th tr v gi tr nh hn 0;
Nu lhs = rhs th tr v gi tr bng 0;
Nu lhs > rhs th tr v gi tr ln hn 0;
3. Cc php ton thao tc trn thi gian:
a. mktime: Hm c nh ngha nh sau:
extern unsigned long mktime(
const unsigned int year, const unsigned int mon,
const unsigned int day, const unsigned int hour,
const unsigned int min, const unsigned int sec);
Nhim v ca hm l chuyn cc thng tin thi gian dng ngy thng nm ngy gi
pht giy thnh thng tin thi gian dng giy tnh t thi im epoch.
b. set_normalized_timespec: Hm c nh ngha nh sau:
extern
void
set_normalized_timespec(struct
Trang 178
timespec
*ts,
Sau khi chuyn cc thng tin ngy thng nm ... thnh s giy tnh t thi im epoch
bng cch s dng hm mktime, thng tin tr v cha phi l mt cu trc thi gian
chun c th x l c trong kernel. bin thnh cu trc thi gian chun ta s dng
hm set_normalize_timespec chuyn s giy dng unsigned long thnh cu trc
thi gian timespec.
Hm c 3 tham s. Tham s th nht, struct timespec *ts, l con tr tr n
cu trc timespec c nh ngha trc lu gi tr thng tin thi gian tr v sau khi
chuyn i xong; Tham s th hai, time_t sec, l s giy mun chuyn i sang cu
trc timespec (c lu vo trng tv_sec); Tham s th ba, long nsec, l s
nano giy ca giy ca thi im mun chuyn i.
Nhim v ca hm l cng hai cu trc thi gian kiu timespec, const struct
timespec lhs v const struct timespec rhs. Kt qu tr v dng timespec l
inline
struct
timespec
timespec_sub(struct
timespec
Trang 179
di dng timespec. Thng thng hm dng tnh ton khong thi gian gia hai
thi im.
e. timespec_add_ns: Hm c nh ngha nh sau:
static
__always_inline
void
timespec_add_ns(struct
timespec
NSEC_PER_SEC,
&ns);
a->tv_nsec = ns;
}
Nhim v ca hm ny l cng thm mt khong thi gian tnh bng nano giy vo
cu trc timespec c a vo hm. Hm c hai tham s. Tham s th nht, struct
timespec *a, l cu trc timespec mun cng thm. Tham s th hai, u64 ns, l s
Nhim v ca hm l ly v thng tin thi gian hin ti ca h thng. Thng tin thi
gian hin ti c tr v cu trc dng struct timeval *tv trong tham s ca hm.
b. do_settimeofday: Hm c nh ngha nh sau:
extern int do_settimeofday(struct timespec *tv);
int
do_sys_settimeofday(struct
timespec
*tv,
struct
timezone *tz);
Trang 180
struct timespec *tv, l thng tin thi gian mun cp nht. Tham s th hai, sruct
timezone *tz, l cu trc lu thng tin chnh lch mi gi mun cp nht.
Nhim v ca hm l chuyn thng tin thi gian di dng nano giy, const s64
nsec, thnh thng tin thi gian dng timespec lm gi tr tr v cho hm.
Trang 181
Nhim v ca hm l chuyn thng tin thi gian dng nano giy, const s64 nsec,
thnh thng tin thi gian dng timeval lm gi tr tr v cho hm.
V.
trc
timer_list
linux
kernel
<linux/timer.h> nh sau:
struct timer_list {
struct list_head entry;
unsigned long expires;
void (*function) (unsigned long);
unsigned long data;
Trang 182
nh
ngha
trong
th
vin
Sau khi kernel dnh cho timer mt vng nh, timer vn cn trng cha c gn
nhng thng s cn thit, cng vic ny ca ngi lp trnh driver:
/*Khi to gi tr khong thi gian mun tr hon, n v tnh bng tick*/
my_timer.expires = jiffies
+ delay;
Trang 183
Tuy nhin lnh ny ch thc hin thnh cng khi timer khng cn hot ng, ngha l
khi timer cn ang ch chu k ngt tip theo dng lnh del_timer() s khng hiu
qu. Mun khc phc li ny, chng ta phi dng lnh del_timer_sync(), lnh ny
s ch cho n khi timer hon thnh chu k ngt gn nht mi xa timer .
3. V d:
on chng trnh sau s nh thi xut thng tin ra mn hnh hin th vi chu k l
1s. Mi ln xut s thay i thng tin, thng bo nhng ln xut thng tin l khc nhau;
/*Khai bo bin cc b lu gi tr mun xut ra mn hnh, gi tr ban u bng 0*/
Trang 184
int counter = 0;
(Driver:
Hello,
the
counters
value
is
%d\n,
counter++);
/*Thc hin khi to timer trong khi ci t driver vo h thng, trong hm init()*/
static int
__init my_driver_init (void) {
VI.
Tr hon thi gian l mt trong nhng vn quan trng trong lp trnh driver cng
nh trong lp trnh application. Trong phn trc chng ta tm hiu nhng lnh tr
Trang 185
hon thi gian t khong thi gian nh tnh theo nano giy n khong thi gian ln hn
tnh bng giy. Ty thuc vo yu cu chnh xc cao hay thp m chng ta p dng k
thut tr hon thi gian cho ph hp. Kernel cng h tr cc k thut tr hon khc nhau
ty theo yu cu m p dng k thut no ph hp nht sao cho khng nh hng n
hot ng ca h thng.
1. Vng lp v tn:
K thut tr hon thi gian u tin l vng lp busy loop. y l cch tr hon thi
gian c in v n gin nht, p dng cho tt c cc h thng. K thut tr hon ny c
dng nh sau:
/*Khai bo thi im tng lai mun thc hin tr hon*/
unsigned long timeout = jiffies + HZ/10; //Tr hon 10ms;
Vi cch tr hon thi gian trn, chng ta dng bin jiffies so snh vi thi im
tng lai lm iu kin cho lnh while () thc hin vng lp. Nh vy chng ta ch c
th tr hon mt khong thi gian ng bng mt s nguyn ln ca tick. Hn na, khc
vi lp user, vng lp trong kernel khng c chia tin trnh thc hin. V th vng lp
v tn trong kernel s chim ht thi gian lm vic ca CPU v nh th cc hot ng
khc s khng c thc thi, h thng s b ngng li tm thi. iu ny rt nguy him
cho cc ng dng i hi tin cy cao v thi gian thc. Cch tr hon thi gian ny rt
him khi c s dng trong nhng h thng ln.
gii quyt vn ny, ngi ta dng k thut chia tin trnh trong lc thc hin tr
hon nh sau:
while (time_before(jiffies, timeout))
schedule(); //Hm ny cha trong th vin <linux/sched.h>
Trang 186
Chng ta cng c th p dng nhng lnh so snh thi gian thc trong phn trc
thc hin tr hon thi gian vi chnh xc cao hn.
2. Tr hon thi gian bng nhng hm h tr sn:
Linux kernel cng cung cp cho chng ta nhng hm thc hin tr hon thi gian vi
chnh xc cao, thch hp cho nhng khong thi gian nh. l nhng hm:
void udelay(unsigned long usec); Hm dng tr hon thi gian c
phn gii micr giy;
void ndelay(unsigned long nsec); Hm tr hon thi gian c phn
gii nan giy;
void mdelay(unsigned long msec); Hm tr hon thi gian c phn
gii mili giy;
**Cc hm tr hon thi gian ny ch thch hp cho nhng khong thi gian nh hn
1 tick trong kernel. Nu ln hn s lm nh hng n hot ng ca c h thng v bn
cht y vn l nhng vng lp v tn, chim thi gian hot ng ca CPU.
3. Tr hon thi gian bng hm schedule_timeout ():
K thut ny khc vi hai k thut trn, dng hm schedule_timeout() s lm
cho chng trnh driver dng li ti thi im khai bo, ri vo trng thi ng trong sut
thi gian tr hon. Thi gian tr hon do ngi lp trnh ci t. s dng hm ny, ta
tin hnh cc bc sau:
/*Ci t chng trnh driver vo trng thi ng*/
set_current_state (TASK_INTERRUPTIBLE);
**Trong time_interval l khong thi gian tnh bng tick mun ci t tn hiu
nh thc chng trnh ang trong trng thi ng.
VII.
Kt lun:
Trang 187
Chng ta cng tm hiu cc hm thao tc vi thi gian thc trong kernel, vi nhng
hm ny chng ta c th xy dng cc ng dng c lin quan n thi gian thc trong h
thng.
C nhiu cc khc nhau thc hin tr hon trong kernel tng t nh trong user.
Nhng chng ta phi bit cch chn phng php ph hp khng lm nh hng n
hot ng ca ton h thng.
n y chng ta c th bc vo cc bi thc hnh, vit driver v ng dng cho mt
s phn cng c bn trong nhng bi sau. Hon thnh nhng bi ny s gip cho chng
ta c c ci nhn thc t hn v lp trnh h thng nhng.
Trang 188
**lc
ny
tp
tin
chng
trnh
driver
to
thnh
vi
tn
1_1_single_led_dev.ko
Trang 189
1_1_single_led_app.c
Trang 190
Bi 2:
IU KHIN SNG TT 1 LED
I.
Phc tho d n:
Kin thc v mi quan h gia driver v application trong h thng nhng, cng
nh vic trao i thng tin qua li da vo cc giao din chun;
Kin thc v giao din chun ioctl trong giao tip gia driver (trong kernel) v
application (trong user);
Kin thc v gpio trong linux kernel;
Lp trnh chng trnh ng dng c s dng k thut hm main c nhiu tham s
giao tip vi ngi dng;
Bin dch v ci t c driver, application np vo h thng v thc thi;
**Tt c nhng kin thc yu cu nu trn u c chng ti trnh by k trong
nhng phn trc. Nu cn ngi hc c th quay li tm hiu bc vo ni dung ny
hiu qu hn.
a. Yu cu d n:
D n ny c yu cu l iu khin thnh cng 1 led n thng qua driver v
application. Ngi dng c th iu khin led sng tt v c v trng thi ca mt chn
gpio theo yu cu nhp t dng lnh shell.
u tin, ngi dng xc nh ch vo ra cho chn gpio mun iu khin.
Trang 191
Trang 192
Nu l lnh set, thng tin tip theo phi cung cp l 1 hoc 0 v chn gpio mun
xut d liu;
Nu l lnh get, thng tin tip theo ngi dng phi cung cp l s chn gpio
mun ly d liu. Sau khi ly d liu, xut ra mn hnh hin th thng bo cho
ngi dng bit.
II.
Thc hin:
e. Kt ni phn cng:
Thc hin kt ni phn cng theo s sau:
VCC
U1
PC0
9
8
7
6
5
4
3
2
VCC
1
19
A8
A7
A6
A5
A4
A3
A2
A1
R1
B8
B7
B6
B5
B4
B3
B2
B1
11
12
13
14
15
16
17
18
DIR
G
74HC245
R1
330
D1
R1
330
D3
LED
D4
LED
D5
LED
D6
LED
D7
LED
D8
LED
330
LED
R1
330
R1
330
R1
330
R1
330
R1
330
R2
4k7
D2
LED
R2
4k7
PA23
PB10
SW1
Trang 193
**lc
ny
tp
tin
chng
trnh
driver
to
thnh
vi
tn
1_1_single_led_dev.ko
1_1_single_led_app.c
1_1_single_led_app
Trang 194
Trang 195
Bi 2:
IU KHIN SNG TT 8 LED
I.
Phc tho d n:
Trang 196
Lu iu khin nh sau:
Trang 197
Thc hin:
U1
PB8
PB10
PA23
PB16
PA24
PB11
PB9
PB7
VCC
9
8
7
6
5
4
3
2
1
19
A8
A7
A6
A5
A4
A3
A2
A1
B8
B7
B6
B5
B4
B3
B2
B1
11
12
13
14
15
16
17
18
DIR
G
74HC245
R1
R2
330
D2
R8
330
D3
LED
D4
LED
D5
LED
D6
LED
D7
LED
D8
LED
330
LED
R3
330
R4
330
R5
330
R6
330
R7
330
LED
Trang 198
all:
1_2_port_led_app.c
1_2_port_led_app
Trang 199