Nắm được kiến trúc tổng quan, đặc điểm v{ hoạt 
động của một hệ nhúng.
 Biết thiết kế hệ nhúng cơ bản (nguyên lý, mạch)
 Nắm được kiến trúc vi điều khiển
 Biết lập trình vi điều khiển từ cơ bản đến n}ng cao 
với c|c dòng vi điều khiển phổ biến.
 Nghiên cứu ph|t triển hệ nhúng ARM Linux với c|c 
giao tiếp v{o ra cơ bản, n}ng cao, cơ chế x}y dựng 
device driver 
              
                                            
                                
            
 
            
                 334 trang
334 trang | 
Chia sẻ: Mr Hưng | Lượt xem: 998 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Kỹ thuật máy tính - Hệ nhúng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
t + KIT) qua cáp chéo và sử dụng IP 
cùng dải: 
• Linux host: 192.168.1.30 
• Linux target: 192.168.1.230 (default) 
246 
Embedded System HungPN-HUST 
Ví dụ chương trình Hello 
 Soạn thảo m~ nguồn chương trình (sử dụng gedit, 
eclipse, v.v) 
247 
#include 
int main (int argc, char* argv[]) 
{ 
 printf (“Ten chuong trinh la „%s‟.\n”, argv[0]); 
 printf (“Chuong trinh co %d tham so \n”, argc - 1); 
 /* Neu co bat cu tham so dong lenh nao*/ 
 if (argc > 1) { 
 /* Thi in ra*/ 
 int i; 
 printf (“Cac tham so truyen vao la:\n”); 
 for (i = 1; i < argc; ++i) 
 printf (“ Tham so %d: %s\n”, i, argv[i]); 
 } 
 return 0; 
} 
Embedded System HungPN-HUST 
Biên dịch chéo chương trình 
 Cách 1: Sử dụng lệnh của cross compiler 
• VD: arm-linux-gcc –o Hello Hello.c 
• Kết quả: biên dịch ra một file thực thi có tên là Hello từ một 
file mã nguồn là Hello.c, file này có hỗ trợ khả năng debug 
 Cách 2: Tạo và sử dụng Makefile 
• make là một tool cho phép quản lý quá trình biên dịch, liên 
kết  của một dự án với nhiều file mã nguồn. 
• Tạo Makefile lưu các lệnh biên dịch theo định dạng của 
Makefile 
• Sử dụng lệnh make để chạy Makefile và biên dịch chương 
trình 
248 
Embedded System HungPN-HUST 
Cấu trúc Makefile 
 Makefile cấu th{nh từ c|c target, variables v{ 
comments 
 Target có cấu trúc như sau: 
target: dependencies 
[tab] system command 
 target: make target 
 Dependencies: c|c th{nh phần phụ thuộc (file m~ 
nguồn, c|c file object) 
 System command: c|c c}u lệnh (lệnh biên dịch, lệnh 
linux) 
249 
Embedded System HungPN-HUST 
Ví dụ Makefile đơn giản 
CC=arm-linux-gcc 
all: Hello.c 
 $(CC) –o Hello Hello.c 
clear: 
 rm Hello 
 Biên dịch chương trình: make all 
 Xóa file sinh ra trước đó: make clear 
250 
Embedded System HungPN-HUST 
Đưa chương trình lên KIT 
 Sử dụng phần mềm gFTP kết nối host v{ KIT 
251 
Embedded System HungPN-HUST 
5.3. Lập trình Arm Linux 
 5.3.1. Cơ chế giao tiếp thiết bị 
 5.3.2. Lập trình giao tiếp vào ra cơ bản 
 5.3.3. Lập trình RS232 trên Linux 
 5.3.4. Lập trình giao tiếp usb joystick 
 5.3.5. Lập trình device driver 
252 
Embedded System HungPN-HUST 
5.3.1. Cơ chế giao tiếp thiết bị 
Phần mềm ứng dụng 
Device files 
Device Drivers 
Phần cứng 
User Space 
Kernel Space 
(Toàn quyền truy xuất trực tiếp 
tài nguyên phần cứng của hệ 
thống) 
Các hàm giao tiếp chuẩn: 
•open 
•close 
•read 
•write 
•ioctl 
• 
253 
Mô hình giao tiếp ứng dụng – thiết bị trên hệ điều h{nh 
Embedded System HungPN-HUST 
Cơ chế giao tiếp thiết bị 
 File thiết bị (device file): Hệ điều h{nh đối xử với c|c 
thiết bị ngoại vi phần cứng tương tự như c|c file dữ 
liệu thông thường. 
 Qu| trình ứng dụng giao tiếp với thiết bị l{ qu| trình 
đọc/ghi file thiết bị đó thông qua driver. 
 Linux quản lý c|c file thiết bị trong thư mục /dev (Sử 
dụng lệnh ls –l /dev để xem) 
 Phân loại device files 
• Character device: thiết bị phần cứng đọc, ghi một chuỗi c|c 
byte dữ liệu 
• Block device: thiết bị phần cứng đọc, ghi một khối dữ liệu 
(Đứng trên phương diện giao tiếp của driver) 
254 
Embedded System HungPN-HUST 
Cơ chế giao tiếp thiết bị 
 Để quản lý c|c file thiết bị, hệ điều h{nh sử dụng số 
hiệu định danh device number cho mỗi thiết bị. Số 
hiệu n{y gồm 2 gi| trị: 
• Major device number: X|c định thiết bị n{y sử dụng 
driver nào 
• Minor device number: ph}n biệt giữa c|c thiết bị 
kh|c nhau sử dụng cùng một driver 
255 
Embedded System HungPN-HUST 
Cơ chế giao tiếp thiết bị 
 Kiểm tra danh s|ch c|c thiết bị 
• C|c file thiết bị (device file) nằm trong thư mục /dev 
• Gõ lệnh ls –al /dev 
• Các thông tin: 
Loại thiết bị: character (c) hay block (b) device 
T{i khoản người dùng 
Tên thiết bị 
Major number và Minor number 
Mount point 
256 
Embedded System HungPN-HUST 
Cơ chế giao tiếp thiết bị 
 Cơ chế lập trình giao tiếp: 
• Sử dụng cơ chế giao tiếp file v{ c|c h{m do driver 
cung cấp 
• C|c h{m mở đóng file thiết bị: open, close 
• H{m điều khiển cổng v{o ra: ioctl 
• H{m đọc/ghi file thiết bị: read, write 
•  
• Được qui định trong cấu trúc file operations của 
driver. 
257 
Embedded System HungPN-HUST 
5.3.2. Lập trình giao tiếp vào ra cơ bản 
Lập trình giao tiếp GPIO 
A. Lập trình giao tiếp LED 
 Sử dụng led driver đ~ có 
 4 led đơn, ghép nối qua GPB5,6,7,8 
 Điều khiển led on/off, tạo hiệu ứng: nhấp nh|y, 
chạy đuổi,  
 Cần sử dụng h{m trễ (delay): sleep, usleep (thư 
viện sys/time.h) 
258 
https://sites.google.com/site/embedded247/
escourse/gpioprogramming 
Embedded System HungPN-HUST 
Mô hình giao tiếp điều khiển led 
Phần mềm ứng dụng 
Device files 
Device Drivers 
Phần cứng 
leds.c 
/dev/leds 
Mini2440_leds.c 
GPIO Port 
(GPB5,6,7,8) 
Hàm giao tiếp: 
• open 
• close 
• ioctl 
259 
Embedded System HungPN-HUST 
Lập trình điều khiển led 
 Mở file thiết bị: fd=open(“/dev/leds”, 0) 
• fd: file description (int, định danh file thiết bị) 
• /dev/leds: device file name (tên file thiết bị) 
• 0: WRITE_ONLY (chế độ mở để ghi) 
 H{m điều khiển ioctl(fd, onoff, led_no) 
• ioctl: input output control (out 0, 1) 
• Điều khiển bật/tắt led đơn có số hiệu led_no 
 M~ nguồn driver cho led đơn: 
 linux-2.6.32.2/drivers/char/mini2440_leds.c 
260 
Embedded System HungPN-HUST 
M~ nguồn minh họa 
261 
#include 
#include 
#include 
#include 
int main(int argc, char **argv){ 
 int on; 
 int led_no; int fd; 
 //Nhận tham số từ dòng lệnh, kiểm tra điều kiện tham số hợp lệ 
 if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || 
 sscanf(argv[2],"%d", &on) != 1 || on 1 || led_no 3) { 
 fprintf(stderr, "Usage: leds led_no 0|1\n"); 
 exit(1); 
 } 
 //Mở file thiết bị leds 
 fd = open("/dev/leds", 0); 
 if (fd < 0) { 
 perror("error open device leds\n"); 
 exit(1); 
 } 
 ioctl(fd, on, led_no); //Điều khiển bật/tắt led có số hiệu led_no 
 close(fd); //Đóng file thiết bị 
 return 0; 
} 
Embedded System HungPN-HUST 
Minh họa giao tiếp v{o ra cơ bản 
B. Lập trình giao tiếp nút bấm 
 Giao tiếp qua driver đ~ có 
 Đọc trạng th|i c|c nút bấm sử dụng phương ph|p 
thăm dò (polling) 
262 
Embedded System HungPN-HUST 
Mô hình giao tiếp nút bấm 
Phần mềm ứng dụng 
Device files 
Device Drivers 
Phần cứng 
Buttons.c 
/dev/buttons 
Mini2440_buttons.c 
GPIO Port 
Hàm giao tiếp: 
•open 
•close 
•read 
263 
Embedded System HungPN-HUST 
Lập trình giao tiếp nút bấm 
 Mở file thiết bị: 
 buttons_fd=open(“/dev/buttons”, O_RDONLY) 
• buttons_fd: file description 
• /dev/buttons: device file 
 H{m đọc dữ liệu 
read(buttons_fd, current_buttons, 
 sizeof(current_buttons)) 
• Đọc trạng th|i c|c nút bấm 
 H{m đóng file thiết bị: close(buttons_fd) 
 M~ nguồn driver cho nút bấm 
 linux-2.6.32.2/drivers/char/mini2440_buttons.c 
264 
Embedded System HungPN-HUST 
M~ nguồn minh họa 
265 
#include  
int main(void){ 
 int buttons_fd; char buttons[6] = {'0', '0', '0', '0', '0', '0'}; 
 buttons_fd = open("/dev/buttons", O_RDONLY); 
 if (buttons_fd < 0) { 
 perror("open device buttons"); 
 exit(1);} 
 for (;;) { 
 char current_buttons[6]; int count_of_changed_key; int i; 
 if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof 
 current_buttons) { perror("read buttons:"); exit(1);} 
 count_of_changed_key = 0; 
 for (i = 0; i < sizeof buttons / sizeof buttons[0]; i++) { 
 if (buttons[i] != current_buttons[i]) { 
 buttons[i] = current_buttons[i]; 
 printf("%skey %d is %s", count_of_changed_key? ", ": "", i+1, 
 buttons[i] == '0' ? "up" : "down"); 
 count_of_changed_key++;} 
 } 
 if (count_of_changed_key) printf("\n"); 
 } 
 close(buttons_fd); return 0;} 
Embedded System HungPN-HUST 
Lập trình giao tiếp sử dụng gpiolib 
 2 c|ch sử dụng giao tiếp gpio (từ Linux user space) 
• Cách 1: Viết gpio driver (trên không gian nh}n hệ 
điều h{nh, kernel space), giao tiếp qua driver n{y. 
(Ví dụ với led, button đ~ l{m) 
• Cách 2: giao tiếp c|c ch}n gpio trực tiếp từ không 
gian người dùng (user space) dựa trên API thư viện 
gpiolib cung cấp. Linux cung cấp giao diện GPIO 
sysfs cho phép thao t|c với bất kỳ ch}n GPIO từ 
userspace. 
266 
Embedded System HungPN-HUST 
Lập trình giao tiếp sử dụng gpiolib 
 Tất cả c|c giao diện điều khiển GPIO thông qua sysfs 
nằm trong thư mục /sys/class/gpio 
 Kiểm tra bằng lệnh: ls /sys/class/gpio 
267 
Embedded System HungPN-HUST 
Lập trình giao tiếp sử dụng gpiolib 
 Giao diện n{y cung cấp c|c files điều khiển sau đ}y: 
268 
Embedded System HungPN-HUST 
Lập trình giao tiếp GPIO sử dụng gpiolib 
 Minh họa giao tiếp gpiolib sử dụng linux command 
Chi tiết: 
https://sites.google.com/site/embedded247/ddcour
se/giao-tiep-gpio-tu-userspace-1 
269 
Cấu hình chân GPF5 (micro2440) output, và xuất giá trị 0 
ra chân này 
echo 165 > /sys/class/gpio/export 
echo “out” > /sys/class/gpio/gpio165/direction 
echo 0 > /sys/class/gpio/gpio165/value 
Embedded System HungPN-HUST 
Minh họa lập trình giao tiếp gpiolib 
 File gpio.h 
270 
#ifndef GPIO_H 
#define GPIO_H 
int gpio_export(unsigned int gpio); //export pin to user space 
int gpio_unexport(unsigned int gpio); //unexport pin from user 
space 
int gpio_dir_out(unsigned int gpio); //Config pin as output 
int gpio_dir_in(unsigned int gpio); //Config pin as input 
int gpio_set_value(unsigned int gpio, unsigned int value); //Ghi 
gia tri cua mot pin gpio output 
int gpio_get_value(unsigned int gpio, unsigned int *value); //Doc 
gia tri cua mot pin gpio input 
int gpio_set_edge(unsigned int gpio, char *edge); 
#endif 
Embedded System HungPN-HUST 
Minh họa lập trình giao tiếp gpiolib 
 File gpio.c (ví dụ h{m đăng ký ch}n gpio sử dụng) 
271 
int gpio_export(unsigned int gpio){ 
 int fd, len; 
 char buf[64]; 
 fd = open("/sys/class/gpio/export", O_WRONLY); 
 if (fd < 0) { 
 perror("gpio/export"); 
 return fd; 
 } 
 len = snprintf(buf, sizeof(buf), "%d", gpio); 
 write(fd, buf, len); 
 //Ghi gpio vao file export 
 close(fd); 
 return 0; 
} 
Embedded System HungPN-HUST 
 Demo: Ứng dụng giao tiếp Board mở rộng, điều 
khiển led đơn, 7 seg, buttons. 
272 
Minh họa lập trình giao tiếp gpiolib 
Embedded System HungPN-HUST 
5.3.3. Lập trình RS232 trên Linux 
Giới thiệu chuẩn RS232 
Lập trình giao tiếp RS232 trên Linux 
273 
Embedded System HungPN-HUST 
Chuẩn RS232 
 Chuẩn đấu nối trên PC 
UART UART 
UART (Universal Asynchronous receiver/transmitter) 
274 
Embedded System HungPN-HUST 
Chuẩn RS232 
 Chuẩn đầu nối trên PC 
• Chân 1 (DCD-Data Carrier Detect): 
phát hiện tín hiệu mang dữ liệu 
• Chân 2 (RxD-Receive Data): nhận dữ 
liệu 
• Chân 3 (TxD-Transmit Data): truyền 
dữ liệu 
• Chân 4 (DTR-Data Terminal Ready): 
đầu cuối dữ liệu sẵn sàng 
• Chân 5 (Signal Ground): đất của tín 
hiệu 
• Chân 6 (DSR-Data Set Ready): dữ liệu 
sẵn sàng 
• Chân 7 (RTS-Request To Send): yêu 
cầu gửi 
• Chân 8 (CTS-Clear To Send): Xóa để 
gửi 
• Chân 9 (RI-Ring Indicate): báo chuông 
275 
Embedded System HungPN-HUST 
Chuẩn RS232 
 Khuôn dạng khung truyền 
• PC truyền nhận dữ liệu qua cổng nối tiếp RS-232 thực 
hiện theo kiểu không đồng bộ (Asynchronous) 
• Khung truyền gồm 4 thành phần 
1 Start bit (Mức logic 0): bắt đầu một gói tin, đồng bộ xung 
nhịp clock giữa DTE và DCE 
Data (5,6,7,8 bit): dữ liệu cần truyền 
1 parity bit (chẵn (even), lẻ (odd), mark, space): bit cho phép 
kiểm tra lỗi 
Stop bit (1 hoặc 2 bit): kết thúc một gói tin 
276 
Embedded System HungPN-HUST 
Chuẩn RS232 
 Kịch bản truyền 
Ghép nối không bắt tay giữa hai thiết bị 
(Khác nhau về mức điện áp) 
277 
Embedded System HungPN-HUST 
Lập trình giao tiếp chuẩn RS232 trên Linux 
 C|c bước cơ bản gồm: 
• Khởi tạo: Khai b|o thư viện 
• Bước 1: Mở cổng COM 
• Bước 2: Thiết lập tham số cấu hình cổng COM 
• Bước 3: Đọc/ghi cổng (gửi/nhận dữ liệu) 
• Bước 4: Đóng cổng 
278 
Embedded System HungPN-HUST 
Khai b|o thư viện 
 #include 
 #include 
 #include 
 #include // UNIX standard function 
 #include // File control definitions 
 #include // Error number definitions 
 #include // POSIX terminal control 
 #include // time calls 
279 
Embedded System HungPN-HUST 
Bước 1: Mở cổng 
 Sử dụng lệnh mở file 
int fd = open ("/dev/ttySAC0", O_RDWR); 
 “/dev/ttySAC0”: Tên file thiết bị cổng COM muốn 
mở 
 fd >0 nếu mở file th{nh công 
 fd<0 nếu mở file thất bại 
280 
Embedded System HungPN-HUST 
Bước 2: Thiết lập tham số 
 Sử dụng cấu trúc termios 
struct termios port_settings; 
 Thiết lập tham số (9600, 8, n, 1) 
cfsetispeed(&port_settings, B9600); 
cfsetospeed(&port_settings, B9600); 
port_settings.c_cflag &= ~PARENB; 
port_settings.c_cflag &= ~CSTOPB; 
port_settings.c_cflag &= ~CSIZE; 
port_settings.c_cflag |= CS8; 
tcsetattr(fd, TCSANOW, &port_settings); 
281 
Embedded System HungPN-HUST 
Bước 3: Đọc, ghi cổng 
 Đọc cổng: sử dụng lệnh đọc file 
n=read(fd,&result,sizeof(result)); 
N: số ký tự đọc được 
Result: chứa kết quả 
 Ghi cổng: sử dụng lệnh ghi file 
n=write(fd,“Hello World\r",12); 
N:số ký tự đ~ ghi 
 fd: file id (có được từ thao t|c mở file th{nh công) 
282 
Embedded System HungPN-HUST 
Bước 4: Đóng cổng 
 Đóng cổng: sử dụng lệnh đóng file 
close (fd); 
fd: file ID (có được từ thao t|c mở file th{nh công) 
https://sites.google.com/site/embedded247/esco
urse/rs232programming 
283 
Demo 
Embedded System HungPN-HUST 
5.3.4. Lập trình giao tiếp usb 
 Tìm hiểu giao thức USB 
 Lập trình giao tiếp thiết bị usb joystick 
284 
Embedded System HungPN-HUST 
Tìm hiểu giao thức usb 
Giới thiệu chuẩn USB: 
 Năm 1995: USB 1.0 
• Tốc độ Low-Speed: 1.5 Mbps 
• Tốc độ tối đa (Full-Speed): 12 Mbps 
 Năm 1998: USB 1.1 (Sửa lỗi của USB 1.0) 
• Tốc độ tối đa (Full-Speed): 12 Mbps 
 Năm 2001: USB 2.0 
• Tốc độ tối đa (High-Speed): 480 Mbps 
 Năm 2008: USB 3.0 
• Tốc độ tối đa (Super-Speed): 4.8 Gbps 
 Tín hiệu 
• Truyền kiểu nối tiếp 
• Tín hiệu trên hai đường D+ và D- là tín hiệu vi sai 
 285 
Embedded System HungPN-HUST 
Mô hình bus USB 
286 
Embedded System HungPN-HUST 
Vai trò của c|c th{nh phần 
 Vai trò của USB host: 
• Trao đổi dữ liệu với c|c thiết bị ngoại vi 
• Điều khiển bus: 
Quản lý được c|c thiết bị kết nối v{o đường bus v{ 
khả năng của mỗi thiết bị đó: sử dụng cơ chế điểm 
danh (Enumeration) 
Ph}n xử, quản lý luồng dữ liệu trên bus, đảm bảo c|c 
thiết bị đều có cơ hội trao đổi dữ liệu 
• Kiểm tra lỗi: thêm c|c m~ kiểm tra lỗi v{o gói tin 
cho phép ph|t hiện lỗi v{ yêu cầu truyền lại gói tin 
• Cung cấp nguồn điện cho tất cả c|c thiết bị 
 287 
Embedded System HungPN-HUST 
Vai trò của c|c th{nh phần 
 Vai trò của thiết bị ngoại vi 
• Trao đổi dữ liệu với host 
• Ph|t hiện c|c gói tin hay yêu cầu (request) được gửi 
tới thiết bị để xử lý phù hợp 
• Kiểm tra lỗi: tương tự như Host, c|c thiết bị ngoại vi 
cũng phải chèn thêm c|c bit kiểm tra lỗi v{o gói tin 
gửi đi 
• Quản lý nguồn điện: c|c thiết bị có thể sử dụng 
nguồn điện ngo{i hay nguồn từ bus. Nếu sử dụng 
nguồn từ bus, thường có chế độ tiết kiệm điện năng. 
288 
Embedded System HungPN-HUST 
Endpoint & pipes 
 Mỗi qu| trình truyền nhận dữ liệu bao gồm một 
hay nhiều giao dịch (transactions), mỗi giao dịch 
gồm một hay nhiều packets 
-> Để hiểu được c|c giao dịch, c|c packet v{ nội dung 
của chúng -> cần tìm hiểu hai kh|i niệm Endpoint 
và Pipes 
289 
Embedded System HungPN-HUST 
Endpoint 
 Endpoint của thiết bị: 
• L{ “điểm cuối” trong kênh giao tiếp giữa host v{ usb 
device. 
• Endpoint l{ bộ đệm (gửi, nhận) nằm trên thiết bị. 
• C|c Endpoint được đ|nh địa chỉ v{ x|c định hướng 
In Endpoint: bộ đệm gửi (host lấy dữ liệu về) 
Out Endpoint: bộ đệm nhận (host gửi dữ liệu v{o) 
• Tất cả c|c thiết bị đều phải có Endpoint 0, đ}y l{ 
endpoint mặc định để gửi c|c thông tin điều khiển 
290 
Embedded System HungPN-HUST 
Endpoint 
291 
Embedded System HungPN-HUST 
Pipes 
 Pipes: kết nối Endpoint của thiết bị tới Host 
• Phải thiết lập pipe trước khi muốn trao đổi dữ liệu 
• Host thiết lập pipe trong qu| trình điểm danh 
(Enumeration) 
• C|c Pipe sẽ được hủy khi thiết bị ngắt kết nối khỏi 
bus 
• Tất cả c|c thiết bị đều có một đường ống điều khiển 
(control pipe) mặc định sử dụng Endpoint 0 
292 
Embedded System HungPN-HUST 
Device Classes 
 C|c thiết bị ngoại vi chuẩn (chuột, m|y in, ổ nhớ flash) có 
đặc tính truyền nhận dữ liệu chung -> Hệ điều h{nh có thể 
cung cấp driver chung cho c|c nhóm, c|c nh{ sản xuất thiết 
bị không cần viết driver riêng. 
 C|c thiết bị đặc thù riêng: cần có driver từng loại 
 C|c nhóm thiết bị đ~ được định nghĩa 
• Audio 
• Communication devices 
• Human interface (HID) 
• IrDA Bridge 
• Mass Storage 
• Cameras and scanners 
• Video 
293 
Embedded System HungPN-HUST 
Qu| trình trao đổi dữ liệu 
 C|c thiết bị USB có thể trao đổi dữ liệu với Host 
theo 4 kiểu ho{n to{n kh|c nhau, cụ thể: 
• Truyền điều khiển (control transfer) 
• Truyền ngắt (interrupt transfer) 
• Truyền theo khối (bulk transfer) 
• Truyền đẳng thời (isochronous transfer) 
294 
Embedded System HungPN-HUST 
C|c kiểu truyền 
 Truyền điều khiển: để điều khiển phần cứng, c|c 
yêu cầu điều khiển được truyền. Chúng l{m việc 
với mức ưu tiên cao v{ với khả năng kiểm so|t lỗi 
tự động. Tốc độ truyền lớn vì có đến 64 byte trong 
một yêu cầu (request) có thể được truyền. 
 Truyền ngắt: c|c thiết bị, cung cấp một lượng dữ 
liệu nhỏ, tuần ho{n chẳng hạn như chuột, b{n phím 
đều sử dụng kiểu truyền n{y. Hệ thống sẽ hỏi theo 
chu kỳ, chẳng hạn 10ms một lần xem có c|c dữ liệu 
mới gửi đến. 
295 
Embedded System HungPN-HUST 
C|c kiểu truyền 
 Truyền theo khối: khi có lượng dữ liệu lớn cần 
truyền v{ cần kiểm so|t lỗi truyền nhưng lại không 
có yêu cầu thúc ép về thời gian truyền thì dữ liệu 
thường được truyền theo khối. VD: m|y in, m|y 
quét 
 Truyền đẳng thời: khi có khối lượng dữ liệu lớn 
với tốc độ dữ liệu đ~ được quy định, ví dụ như card 
}m thanh. Theo c|ch truyền n{y một gi| trị tốc độ 
x|c định được duy trì. Việc hiệu chỉnh lỗi không 
được thực hiện vì những lỗi truyền lẻ tẻ cũng 
không g}y ảnh hưởng đ|ng kể. 
296 
Embedded System HungPN-HUST 
Lập trình giao tiếp thiết bị USB Joystick 
297 
https://sites.google.com/site/embedded247
/escourse/joystickprogramming 
Embedded System HungPN-HUST 
Cấu trúc js_event trên Linux 
 Linux định nghĩa cấu trúc js_event để lưu c|c thông 
tin khi có ph|t sinh sự kiện (khởi tạo thiết bị, 
người dùng bấm nút chức năng, nút chỉnh hướng) 
 Định nghĩa trong include/linux/joystick.h 
298 
Embedded System HungPN-HUST 
Cấu trúc js_event 
 Nội dung c|c trường dữ liệu 
• Time: nh~n thời gian ph|t sinh sự kiện 
• Value: gi| trị, phụ thuộc v{o nút chức năng hay nút chỉnh 
hướng 
Nếu l{ nút chức năng: 0/1 (1: pressed, 0: released) 
Nếu l{ nút chỉnh hướng: -32768 -> 32767 
(Ph}n biệt hướng x, y phụ thuộc v{o gi| trị number=0/1) 
• Type: loại sự kiện 
Khởi tạo thiết bị: 0x80 
Nút chỉnh hướng: 0x02 
Nút chức năng: 0x01 
• Number: x|c định nút được nhấn (trường hợp type =1 hoặc 
x|c định nút chỉnh hướng x, y trong trường hợp type =2) 
299 
Embedded System HungPN-HUST 
Lập trình kết nối joystick 
 Mở file thiết bị: 
 joystick_fd = open(JOYSTICK_DEVNAME, 
O_RDONLY | O_NONBLOCK); 
 JOYSTICK_DEVNAME: tên của file thiết bị, thường 
là /dev/input/js0 
 O_RDONLY | O_NONBLOCK: mở file chỉ đọc ở chế 
độ NONBLOCK 
300 
Embedded System HungPN-HUST 
Lập trình kết nối joystick 
 Đọc dữ liệu từ thiết bị (khi có ph|t sinh sự 
kiện) 
 bytes = read(joystick_fd, jse, sizeof(*jse)); 
 joystick_fd: con trỏ file có được khi mở file 
 jse: biến cấu trúc js_event 
 bytes: Tổng số file đọc được, nếu số n{y bằng kích 
thước của cấu trúc js_event thì qu| trình đọc th{nh 
công 
301 
Embedded System HungPN-HUST 
Demo giao tiếp usb joystick 
 Các sự kiện khi khởi tạo thiết bị 
302 
Embedded System HungPN-HUST 
Demo giao tiếp usb joystick 
 Các sự kiện khi người dùng nhấn các nút 
303 
Embedded System HungPN-HUST 
QT Joystick Demo 
304 
Embedded System HungPN-HUST 
5.3.5. Lập trình Device Driver 
 Giới thiệu về Kernel Module 
 Cơ chế x}y dựng Device Driver 
305 
Embedded System HungPN-HUST 
Kernel Module 
 Hoạt động trên Kernel Space, có thể truy xuất tới 
c|c t{i nguyên của hệ thống 
 Kernel Module cho phép thêm mới c|c module một 
c|ch linh hoạt, tr|nh việc phải biên dịch lại nh}n hệ 
điều h{nh 
 Kernel Module l{ cơ chế hữu hiệu để ph|t triển c|c 
device driver 
 Xem danh s|ch c|c module đang chạy: lsmod 
306 
Embedded System HungPN-HUST 
Kernel Module 
 C|c bước để thêm một kernel module v{o hệ thống 
• Viết m~ nguồn: chỉ sử dụng c|c thư viện được cung 
cấp bởi kernel, không sử dụng được c|c thư viện 
bên ngoài 
• Biên dịch m~ nguồn module 
• C{i đặt module: dùng lệnh 
 insmod Tên_Module.ko 
• Gỡ module: dùng lệnh rmmod Tên_Module 
• Xem c|c thông tin log: sử dụng System Log Viewer 
307 
Embedded System HungPN-HUST 
M~ nguồn kernel module 
308 
//File: hello_kernel_module.c 
#include 
#include 
#include 
static int hello_init(void) 
{ 
 printk(KERN_ALERT "Khoi tao thanh cong\n"); 
return 0; 
} 
static void hello_exit(void) 
{ 
 printk(KERN_ALERT "Ket thuc thanh cong\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 
Embedded System HungPN-HUST 
 Viết Makefile biên dịch kernel module 
 Biên dịch bằng lệnh make được file 
 hello_kernel_module.ko 
Kernel Module Makefile 
obj-m += hello_kernel_module.o 
all: 
 make -C /lib/modules/$(shell uname -r)/build 
M=$(PWD) modules 
clean: 
 make -C /lib/modules/$(shell uname -r)/build 
M=$(PWD) clean 
309 
Embedded System HungPN-HUST 
C{i đặt kernel module v{o hệ thống 
 Cài đặt module v{o hệ thống (runtime) sử dụng 
lệnh insmod 
 insmod hello_kernel_module .ko 
 Gỡ kernel module dùng lệnh rmmod 
 Trên Ubuntu để kiểm tra qu| trình c{i đặt xem 
module đ~ c{i đặt th{nh công hay chưa mở 
System/Log Viewer xem mục kernel log) 
310 
Embedded System HungPN-HUST 
Lập trình linux device driver 
 Sử dụng cơ chế lập trình kernel module để x}y 
dựng c|c device driver 
 Qui trình x}y dựng device driver: 
• Viết m~ nguồn (cấu trúc tương tự kernel module). 
• Biên dịch m~ nguồn (dùng Makefile) (được file .ko) 
• C{i đặt sử dụng lệnh insmod 
• Đăng ký tên file thiết bị (device file) với hệ thống 
Đăng ký tự động trong m~ nguồn 
Hoặc sử dụng lệnh mknod để tạo device file (trong 
thư mục /dev) 
 mknod [options] NAME Type [Major Minor] 
311 
Embedded System HungPN-HUST 
Ví dụ: Hello Driver 
312 
Embedded System HungPN-HUST 
Tham khảo + Demo 
Demo 
313 
https://sites.google.com/site/embedded247/ddcourse/
kernelmoduleprogramming 
Embedded System HungPN-HUST 
5.4. Lập trình nền tảng Qt 
5.4.1. Giới thiệu Qt 
5.4.2. Cài đặt môi trường phát triển Qt 
5.4.3. Làm quen với lập trình Qt 
314 
Embedded System HungPN-HUST 
5.4.1. Giới thiệu Qt 
 Qt Development Frameworks được sáng lập năm 1994 
bởi TrollTech 
 2008: TrollTech sáp nhập vào Nokia 
 Hiện nay Qt thuộc sở hữu của Digia 
 Qt l{ một Framework ph|t triển ứng dụng đa nền tảng 
(desktop, mobile, embedded). 
 Hỗ trợ các nền tảng: Windows, Linux, Embedded 
Linux, Win CE, Symbian, Maemo 
315 
Embedded System HungPN-HUST 
Giới thiệu QT 
 Qt cho phép viết ứng dụng một lần v{ biên dịch chéo 
trên nhiều nền tảng hệ điều h{nh khác nhau mà không 
phải viết lại m~. Tuy nhiên, m~ nguồn cần được biên 
dịch trên nền tảng m{ muốn ứng dụng được thực thi. 
 Lập trình Qt theo chuẩn C++. 
 Qt Framework bao gồm: 
• a cross-platform class library (Thư viện c|c lớp hướng 
đối tượng) 
• integrated development tools (C|c công cụ ph|t triển 
tích hợp) 
• a cross-platform IDE. (Môi trường ph|t triển ứng dụng) 
 Tham khảo: qt.nokia.com; qtcentre.org 
 316 
Embedded System HungPN-HUST 
QT được sử dụng rộng r~i 
317 
Embedded System HungPN-HUST 
Kiến trúc Qt 
318 
Embedded System HungPN-HUST 
5.4.2. Cài đặt Qt SDK 
 Cài đặt Qt SDK trên máy phát triển (Linux, 
Windows, MacOS) 
 File cài đặt 
 qt-sdk-linux-x86-opensource-2010.05.1.bin 
Phiên bản mới:  
 Thực thi file cài đặt: 
$ ./qt-sdk-linux-x86-opensource-2010.05.1.bin 
 Đợi qu| trình c{i đặt diễn ra th{nh công, mặc định 
thư mục c{i đặt chứa tại 
 $HOME/qtsdk-2010.01/qt/bin 
319 
Embedded System HungPN-HUST 
C{i đặt Qt SDK 
 Sau khi c{i đặt xong Qt SDK, công cụ Qt Creator cho 
phép ph|t triển ứng dụng với lựa chọn mặc định 
biên dịch trên m|y tính Linux. 
 Để biên dịch chéo ứng dụng thực thi trên KIT 
FriendlyArm (Embedded Linux) cần c{i đặt Qt 
Everywhere 
 https://sites.google.com/site/embedded247/esco
urse/qtinstall 
320 
Embedded System HungPN-HUST 
Cài đặt Qt Everywhere 
 Bước 1: Cài đặt QT Em
            Các file đính kèm theo tài liệu này:
 baigianghenhung_4539.pdf baigianghenhung_4539.pdf