ARM Linux Course(1)

117
1 Khóa học LẬP TRÌNH NHÚNG ARM-LINUX GV: Phạm Ngọc Hưng, Phạm Văn Thuận Bộ môn Kỹ thuật Máy tính Viện CNTT&TT- ĐH BKHN email: [email protected] Website: https://sites.google.com/site/embedded247/ Lập trình nhúng ARM-Linux Mục tiêu khóa học Sau khi kết thúc khóa học n{y, học viên có thể Nắm được kiến trúc một hệ thống nhúng nền tảng ARM + hệ điều h{nh nhúng Linux. Tùy biến, biên dịch, c{i đặt hệ điều h{nh nhúng Linux trên KIT FriendlyArm 2440. Lập trình giao tiếp v{o ra GPIO cơ bản trên hệ nhúng Arm- Linux (giao tiếp gpio) Lập trình giao tiếp c|c chuẩn v{o ra RS232, USB, ADC Sử dụng driver, v{ cơ chế viết driver trên hệ nhúng Linux. Nắm được c|c kỹ thuật lập trình giao tiếp giữa c|c tiến trình trên linux, kỹ thuật lập trình đa luồng, lập trình socket Lập trình giao diện đồ họa Qt trên Linux B{i tập, Case Study. 2

Transcript of ARM Linux Course(1)

Page 1: ARM Linux Course(1)

1

Khóa học

LẬP TRÌNH NHÚNG ARM-LINUX

GV: Phạm Ngọc Hưng, Phạm Văn Thuận

Bộ môn Kỹ thuật Máy tính

Viện CNTT&TT- ĐH BKHN

email: [email protected]

Website: https://sites.google.com/site/embedded247/

Lập trình nhúng ARM-Linux

Mục tiêu khóa học

Sau khi kết thúc khóa học n{y, học viên có thể • Nắm được kiến trúc một hệ thống nhúng nền tảng ARM + hệ

điều h{nh nhúng Linux.

• Tùy biến, biên dịch, c{i đặt hệ điều h{nh nhúng Linux trên KIT FriendlyArm 2440.

• Lập trình giao tiếp v{o ra GPIO cơ bản trên hệ nhúng Arm-Linux (giao tiếp gpio)

• Lập trình giao tiếp c|c chuẩn v{o ra RS232, USB, ADC

• Sử dụng driver, v{ cơ chế viết driver trên hệ nhúng Linux.

• Nắm được c|c kỹ thuật lập trình giao tiếp giữa c|c tiến trình trên linux, kỹ thuật lập trình đa luồng, lập trình socket

• Lập trình giao diện đồ họa Qt trên Linux

• B{i tập, Case Study.

2

Page 2: ARM Linux Course(1)

2

Lập trình nhúng ARM-Linux

Nội dung khóa học

Bài 1. Giới thiệu lập trình nhúng Arm Linux

Bài 2. Biên dịch, c{i đặt hệ điều hành nhúng Linux

Bài 3. Môi trường lập trình nhúng Arm Linux

Bài 4. Lập trình vào ra GPIO cơ bản

Bài 5. Lập trình vào ra nâng cao

Bài 6. C|c kỹ thuật lập trình nâng cao

Bài 7. Lập trình Qt cơ bản

Bài 8. Lập trình Qt n}ng cao

3

Lập trình nhúng ARM-Linux

Nội dung khóa học

CASE STUDY

• Lập trình ứng dụng Qt giao tiếp rs232

• Lập trình usb device driver (giao tiếp usb giữa KIT micro2440 và Keil Arm7 Board)

• Lập trình mạng Qt

4

Page 3: ARM Linux Course(1)

3

Lập trình nhúng ARM-Linux

Tài liệu tham khảo

Tài liệu tham khảo chính:

• Micro2440 User Manual

• S3C2440 MicroController User’s Manual

• Beginning Linux Programming

• Advanced Linux Programming

• Linux Device Driver

• C++ GUI programming with QT

• Website: https://sites.google.com/site/embedded247/

5

Lập trình nhúng ARM-Linux

Bài số 1

Giới thiệu

Lập trình nhúng Arm Linux

6

Page 4: ARM Linux Course(1)

4

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 1

Sau khi kết thúc b{i học n{y, học viên có thể

• Nắm được tổng quan về lập trình nhúng

• Trình b{y tổng quan về kiến trúc ARM, c|c dòng vi xử lý ARM

• Trình b{y được cấu trúc phần cứng v{ c|c chức năng của hệ nhúng KIT FriendlyArm micro2440

7

Lập trình nhúng ARM-Linux

Nội dung bài học

1.1. Giới thiệu về lập trình nhúng

1.2. Tổng quan về kiến trúc ARM

1.3. Giới thiệu KIT FriendlyArm micro2440

1.3. Môi trường ph|t triển ứng dụng trên KIT FriendlyArm

8

Page 5: ARM Linux Course(1)

5

Lập trình nhúng ARM-Linux

1.1. Giới thiệu lập trình nhúng

Lập trình ứng dụng trên hệ nhúng phụ thuộc vào nền tảng (platform) phần cứng, phần mềm của hệ nhúng đó.

Hệ nhúng không có hệ điều hành:

• Thường sử dụng c|c vi điều khiển

hiệu năng tương đối thấp

(8051, ATMega, PIC, ARM7, …)

• Lập trình bằng C, ASM

• Môi trường, công cụ lập trình tùy theo từng dòng vi điều khiển (CodeVision, AVR Studio, Keil…)

• Phù hợp c|c ứng dụng điều khiển v{o/ra cơ bản, c|c giao tiếp ngoại vi cơ bản.

9

Lập trình nhúng ARM-Linux

Giới thiệu lập trình nhúng

Hệ nhúng có hệ điều hành:

• Dựa trên c|c vi điều khiển, vi xử lý (CPU) có hiệu năng cao (Ví dụ: AVR 32, ARM 9, ARM 11, …)

• Nhiều nền tảng hệ điều h{nh nhúng : uCLinux, Embedded Linux, Windows CE, …

• Môi trường, công cụ lập trình tùy thuộc nền tảng hệ điều h{nh: C/C++, QT SDK (Nokia), .Net Compact FrameWork (Microsoft), …

• Ứng dụng nhiều b{i to|n phức tạp: GPS Tracking/Navigator, Xử lý ảnh, ứng dụng Client/Server, …

10

Page 6: ARM Linux Course(1)

6

Lập trình nhúng ARM-Linux

Giới thiệu lập trình nhúng

Các thiết bị di động thông minh:

• Xu hướng công nghệ hiện nay

• Nhiều nền tảng: iOS, Android, Windows Phone, Symbian OS/Maemo,

• Môi trường, công cụ:

iOS: Xcode + iOS SDK (ngôn ngữ Object-C)

Android: C, Java + Android SDK, Eclipse/Netbean

Windows Phone: SDK + Visual Studio (C#)

• C|c ứng dụng phong phú: Google Play Store, Apple Store, Windows Market Place, …

11

Lập trình nhúng ARM-Linux

Giới thiệu lập trình nhúng

Khóa học n{y hướng tới:

• Lập trình hệ nhúng nền tảng ARM + Linux

• Minh họa trên KIT FriendlyArm micro 2440

• Lập trình C/C++, lập trình giao diện đồ họa QT

Lý do:

• ARM ? > 90% thị phần thiết bị nhúng,

l{ dòng vi xử lý hiệu năng cao.

• Embedded Linux ? M~ nguồn mở, khả năng can thiệp, hiểu s}u hệ thống. Nhiều OS kh|c (iOS, Android) dựa trên Linux kernel

12

Page 7: ARM Linux Course(1)

7

Lập trình nhúng ARM-Linux

ARM:

• Advanced RISC Machine

• Acorn RISC Machine

ARM l{ kiến trúc tập lệnh RISC 32 bit (Instruction Set Architecture – ISA) ph|t triển bởi Arm Holdings (1983).

Phổ biến nhất trong c|c kiến trúc tập lệnh 32 bit.

Được sử dụng rộng r~i trong c|c hệ thống nhúng: mobile phones, PDAs, tablets, digital media, music players, calculators, routers, …

98% of 1 billion mobile phones (in 2005);

13

1.2. Giới thiệu kiến trúc ARM

Lập trình nhúng ARM-Linux

Kiến trúc ARM

Kế thừa các đặc điểm của kiến trúc tập lệnh RISC • Số lượng thanh ghi lớn v{ có kích thước bằng nhau (32bit)

• Kiến trúc tập lệnh RISC, độ d{i từ lệnh 32 bit, khuôn dạng lệnh 3 địa chỉ to|n hạng.

• Chế độ địa chỉ đơn giản (ít chế độ địa chỉ hơn kiến trúc CISC)

Phát triển các đặc trưng mới của ARM • C|c lệnh có kết hợp với lệnh dịch hoặc c|c lệnh logic

• Chế độ địa chỉ tự động tăng-giảm để tối ưu hóa c|c vòng lặp

• Nạp v{ lưu (load/store) nhiều lệnh cùng lúc cho phép n}ng cao thông lượng

14

Page 8: ARM Linux Course(1)

8

Lập trình nhúng ARM-Linux

Architecture Family

ARMv1 ARM1

ARMv2 ARM2, ARM3

ARMv3 ARM6, ARM7

ARMv4 StrongARM, ARM7TDMI, ARM9TDMI

ARMv5 ARM7EJ, ARM9E, ARM10E, XScale

ARMv6 ARM11, ARM Cortex-M

ARMv7 ARM Cortex-A, ARM Cortex-M, ARM

Cortex-R

ARMv8 Support 64-bit data and addressing

15

Các dòng ARM

Lập trình nhúng ARM-Linux

Các dòng ARM (tiếp)

Kiến trúc các dòng ARM

16

Page 9: ARM Linux Course(1)

9

Lập trình nhúng ARM-Linux

Thumb Instruction Set: tập lệnh 16 bit cho phép tăng mật độ lệnh

Jazelle: công nghệ cho phép tăng tốc c|c ứng dụng viết bằng Java

SIMD, NEON: công nghệ n}ng cao hiệu năng cho c|c ứng dụng Video/Audio

TrustZone: công nghệ n}ng cao tính bảo mật

17

Một số công nghệ trong ARM

Lập trình nhúng ARM-Linux

So sánh các dòng ARM

Phân nhóm theo hiệu năng và tính hữu dụng

18

Page 10: ARM Linux Course(1)

10

Lập trình nhúng ARM-Linux

Kiến trúc ARM và lịch sử phát triển

ARM được rất nhiều h~ng ph|t triển v{ sản xuất, ở Việt Nam phổ biến chip ARM của c|c h~ng

• ATMEL: AT91SAM7, AT91SAM9…

• NXP: LPC2138, LPC2148, LPC2300…

• TI (Texas Instrument): TMS470, TMS570…

• SAMSUNG: S3C2440

• …

19

Lập trình nhúng ARM-Linux

Đặc điểm của chip (microprocessor) S3C2440

• Core:

ARM920T core , 16 Kbytes Data Cache, 16 Kbytes Instruction cache

Xung nhịp 400MHz (thường dùng), 533 MHz (max)

• Memories

Giao diện bus AMBA (Advanced Microcontroller Bus Architecture)

4 KByte SRAM nội

20

Kiến trúc vi điều khiển S3C2440

Page 11: ARM Linux Course(1)

11

Lập trình nhúng ARM-Linux

Lõi vi xử lý ARM920T

21

Lập trình nhúng ARM-Linux

Ngoại vi S3C2440

22

Page 12: ARM Linux Course(1)

12

Lập trình nhúng ARM-Linux

Đặc điểm của chip S3C2440 (tiếp) • Ngoại vi (Peripherals)

USB Host/Device

10/100 Mbps Ethernet MAC Controller

SPI, I2C…

32 bit Timer/Counter

3 USARTs

Multimedia Card Interface

ADC 10 bit 8 kênh

Giao tiếp cảm biến ảnh (Image Sensor)

Điều khiển LCD

Điều khiển AC97 audio codec

23

Kiến trúc vi điều khiển S3C2440

Lập trình nhúng ARM-Linux

Kiến trúc vi điều khiển S3C2440

Đặc điểm của chip S3C2440 (tiếp)

• Hệ thống

4 kênh DMA (Direct Memory Access)

Boot hệ thống từ NOR Flash, NAND Flash, SDCard, Ethernet

Bộ điều khiển ngắt n}ng cao AIC (Advanced Interrupt Controller)

• Vào ra

130 ch}n v{o ra lập trình được

24

Page 13: ARM Linux Course(1)

13

Lập trình nhúng ARM-Linux

R0->R12: thanh ghi

công dụng chung

R13: Stack Pointer

R14: Link Register

R15: Program Counter

CPSR: Current

Program Status

Register

SPSR_SVC: Saved

Program Status

Register

25

Tập thanh ghi và chế độ hoạt động

Lập trình nhúng ARM-Linux

Thanh ghi trạng thái chương trình

Các cờ kết quả hoạt động của ALU

Điều khiển cho phép/cấm ngắt

Thiết lập chế độ hoạt động

26

Page 14: ARM Linux Course(1)

14

Lập trình nhúng ARM-Linux

Tập lệnh của S3C2440

Tập lệnh ARM chia th{nh c|c nhóm lệnh

• Lệnh rẽ nh|nh (Branch)

• Lệnh xử lý dữ liệu (Data Processing)

• Trao đổi thanh ghi trạng th|i (Status Register Transfer)

• Nạp v{ lưu (Load and Store)

• Ph|t sinh ngoại lệ (Exception-Generating)

27

Lập trình nhúng ARM-Linux

Bản đồ bộ nhớ

Bus địa chỉ 32 bit

• Địa chỉ bắt đầu: 0x00000000

• Địa chỉ kết thúc: 0x40000000

• Chia th{nh nhiều bank nhớ, mỗi bank 128 MB, tổng không gian bộ nhớ 1GB

6 bank nhớ cho ROM, SRAM (viết tắt SROM)

2 bank nhớ cho ROM, SRAM, SDRAM, ….

Hỗ trợ cả hai kiểu lưu trữ: little endian, big endian

28

Page 15: ARM Linux Course(1)

15

Lập trình nhúng ARM-Linux 29

Lập trình nhúng ARM-Linux

Bản đồ bộ nhớ

Hỗ trợ hai chế độ khởi động chính

Với chế độ khởi động từ Nand Flash, 4 Kbytes BootSram được |nh xạ v{o vùng nhớ chọn bởi nGCS0.

Với chế độ khởi động từ Nor Flash, Nor Flash được |nh xạ v{o vùng nhớ chọn bởi nGCS0.

Vùng nhớ cho SDRAM bắt đầu tại địa chỉ 0x30000000 v{ kết thúc ở địa chỉ 0x34000000.

(NOR Flash chứa sẵn BIOS firmware)

30

Page 16: ARM Linux Course(1)

16

Lập trình nhúng ARM-Linux

1.3. Giới thiệu KIT nhúng micro2440

31

Lập trình nhúng ARM-Linux

Giới thiệu KIT nhúng micro2440

32

Page 17: ARM Linux Course(1)

17

Lập trình nhúng ARM-Linux 33

Giới thiệu KIT nhúng micro2440

Lập trình nhúng ARM-Linux

Giới thiệu KIT nhúng micro2440

Thông số kỹ thuật

34

Page 18: ARM Linux Course(1)

18

Lập trình nhúng ARM-Linux

Giới thiệu KIT nhúng micro2440

35

Lập trình nhúng ARM-Linux

1.4. Môi trường phát triển ứng dụng

Mô hình sử dụng ph|t triển ứng dụng trên KIT FriendlyArm mini/macro 2440

36

Page 19: ARM Linux Course(1)

19

Lập trình nhúng ARM-Linux

Môi trường phát triển ứng dụng

Phần mềm

• M|y tính Linux (Ubuntu 9.04 hoặc mới hơn)

• Trình biên dịch chéo (C/C++ cross compiler): Cross toolchains (arm linux gcc 4.4.3)

• gFTP (Công cụ truyền nhận file theo giao thức FTP)

• minicom (phần mềm giao tiếp cổng Com trên Linux)

• USB push (Công cụ truyền file qua USB trên Linux)

• QT SDK, QT Embedded (Môi trường IDE để ph|t triển ứng dụng giao diện đồ họa trên nền tảng Qt Framework, dựa trên C/C++)

37

Lập trình nhúng ARM-Linux

Môi trường phát triển ứng dụng

Môi trường phát triển ứng dụng theo nhóm

38

Page 20: ARM Linux Course(1)

20

Lập trình nhúng ARM-Linux

Thảo luận

39

Lập trình nhúng ARM-Linux

Bài số 2

Biên dịch, cài đặt

Hệ điều hành nhúng Linux

40

Page 21: ARM Linux Course(1)

21

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 2

Sau khi kết thúc b{i học n{y, học viên có thể

• Nắm được tổng quan về hệ điều h{nh nhúng Linux (Embedded Linux OS)

• Nắm được c|c kh|i niệm cơ bản về Bootloader, kernel, root file system

• Biết c|ch nạp hệ điều h{nh nhúng Linux xuống KIT FriendlyArm Micro2440

• Biết c|ch tùy biến, biên dịch nh}n hệ điều h{nh

41

Lập trình nhúng ARM-Linux

Nội dung bài học

2.1. Tổng quan về hệ điều h{nh nhúng Linux

2.2. Quy trình c{i đặt hệ điều h{nh nhúng Linux

2.3. Biên dịch nh}n hệ điều h{nh nhúng Linux

42

Page 22: ARM Linux Course(1)

22

Lập trình nhúng ARM-Linux

2.1. Tổng quan Embedded Linux OS

Hệ điều h{nh (OS) ?

• Hệ điều h{nh bản chất l{ phần mềm hệ thống

Quản lý t{i nguyên phần cứng m|y tính

Cung cấp c|c h{m dịch vụ cho phép c|c ứng dụng tương t|c với t{i nguyên hệ thống

43

Lập trình nhúng ARM-Linux

Tổng quan Embedded Linux OS

Đặc trưng cơ bản của hệ điều h{nh

Quản lý t{i nguyên hệ thống (phần cứng, phần mềm)

Trung gian giữa phần cứng v{ phần mềm, giúp phần cứng l{m việc trong suốt với phần mềm ứng dụng

Cung cấp giao diện h{m chuẩn cho phần mềm ứng dụng

Lợi ích của hệ điều h{nh

• Tăng tính ổn định, tin cậy của hệ thống

• Tăng tính khả chuyển (portability)

44

Page 23: ARM Linux Course(1)

23

Lập trình nhúng ARM-Linux

Sơ đồ phân cấp hệ thống

45

Lập trình nhúng ARM-Linux

Kiến trúc hệ điều hành Unix

46

Page 24: ARM Linux Course(1)

24

Lập trình nhúng ARM-Linux

Kiến trúc hệ điều hành nhúng

Hệ điều h{nh nhúng (embedded os) ?

• L{ hệ điều h{nh c{i đặt cho c|c hệ thống nhúng (embedded system)

• Được thiết kế: compact, efficient, reliable.

47

Lập trình nhúng ARM-Linux

Kiến trúc hệ điều hành nhúng

Đặc trưng của hệ điều h{nh nhúng

• Tăng tính tin cậy (reliability)

• Tăng tính khả chuyển (portability)

• Khả năng tương thích mềm: dễ d{ng n}ng cấp hay thu gọn để tương thích với nền tảng hệ thống

• Thu gọn, đòi hỏi ít bộ nhớ hơn. Có thể hỗ trợ khởi động từ bộ nhớ ROM, Flash (hệ thống không có ổ cứng)

• Cung cấp c|c cơ chế lập lịch (scheduler) hỗ trợ thời gian thực (Realtime OS – RTOS)

48

Page 25: ARM Linux Course(1)

25

Lập trình nhúng ARM-Linux

Hệ điều hành thời gian thực

Hệ thống thời gian thực (Realtime): c|c phần mềm, phần cứng hoạt động thỏa m~n c|c r{ng buộc về thời gian

Ph}n loại:

• Hard Realtime: không đ|p ứng deadline -> lỗi hệ thống

• Soft Realtime: không đ|p ứng deadline -> giảm chất lượng dịch vụ (QoS)

49

Lập trình nhúng ARM-Linux

Hệ điều hành thời gian thực

50

Page 26: ARM Linux Course(1)

26

Lập trình nhúng ARM-Linux

Cấu trúc nhân hệ điều hành

51

Lập trình nhúng ARM-Linux

Hệ thống file trong Linux

Một số thư mục quan trọng

• /home: thư mục người dùng

• /dev: chứa c|c file thiết bị

• /bin: chứa c|c file thực thi của hệ thống

• /etc: chứa c|c file cấu hình

• /var: chứa c|c file log

• /opt: chứa c|c gói chương trình c{i đặt thêm

• /proc: chứa thông tin về c|c tiến trình, c|c th{nh phần phần cứng, phần mềm đang chạy trong hệ thống

• /usr: chứa c|c file thực thi, t{i liệu liên quan tới người dùng

52

Page 27: ARM Linux Course(1)

27

Lập trình nhúng ARM-Linux

Embedded Linux

Hỗ trợ rất nhiều kiến trúc vi xử lý (cả 32 bit v{ 64 bit)

• Intel X86, ARM, PowerPC, MIPS, AVR32, …

Không hỗ trợ c|c vi điều khiển hiệu năng thấp

Hỗ trợ cả kiến trúc có v{ không có khối quản lý bộ nhớ (MMU)

C|c hệ thống có thể dùng chung toolchains, bootloader v{ kernel, c|c th{nh phần kh|c phải riêng biệt v{ tương thích với từng hệ thống

53

Lập trình nhúng ARM-Linux

Quá trình boot hệ thống Linux trên PC

54

Page 28: ARM Linux Course(1)

28

Lập trình nhúng ARM-Linux

Quá trình boot hệ thống Linux nhúng

55

Lập trình nhúng ARM-Linux

Quá trình boot hệ thống Linux nhúng

Boot loader: chương trình mồi, thực hiện kiểm tra phần cứng hệ thống v{ nạp nh}n (kernel) của hệ điều h{nh

Kernel: nh}n hệ điều h{nh, chứa c|c th{nh phần cơ bản nhất

Root file system: hệ thống file, chứa c|c modules bổ sung v{ c|c phần mềm ứng dụng

56

Page 29: ARM Linux Course(1)

29

Lập trình nhúng ARM-Linux

2.2. Quy trình cài đặt Embedded Linux

Bước 1: C{i đặt bootloader (VD: U-Boot, Supervivi)

Bước 2: C{i đặt kernel

Bước 3: C{i đặt hệ thống file (root file system)

57

Lập trình nhúng ARM-Linux

Cài đặt trên môi trường Windows

Công cụ

• Phần mềm HyperTerminal: kết nối với KIT micro2440 qua cổng COM

• Phần mềm DNW: kết nối với KIT micro2440 qua cổng USB

C|ch thức

• Phần mềm HyperTerminal (giao tiếp với BIOS trên Nor Flash qua cổng rs232) truyền c|c lệnh điều khiển

• Phần mềm DNW trao đổi file

58

Page 30: ARM Linux Course(1)

30

Lập trình nhúng ARM-Linux

Cài đặt trên môi trường Linux

Công cụ:

• Phần mềm minicom: kết nối với KIT micro2440 qua cổng COM

• Phần mềm usbpush: kết nối với KIT micro2440 qua cổng USB

C|ch thức

• Phần mềm minicom cho phép giao tiếp serial, truyền c|c lệnh điều khiển

• Phần mềm usbpush nạp file xuống KIT

59

Lập trình nhúng ARM-Linux

Cài đặt hệ điều hành nhúng Linux

Demo

<Xem hướng dẫn chi tiết trong tài liệu

hướng dẫn cài đặt và sử dụng KIT

micro2440>

60

Page 31: ARM Linux Course(1)

31

Lập trình nhúng ARM-Linux

2.3. Biên dịch nhân Linux

Khi n{o cần biên dịch lại nh}n?

• Khi n}ng cấp hệ thống lên c|c phiên bản mới hơn

• Khi cần sửa lỗi, cấu hình, tùy chỉnh c|c module

Qu| trình biên dịch nh}n

• Download nh}n tại địa chỉ: kernel.org (Hoặc trong CD đi kèm KIT)

• File nén linux-2.6.32.2.tar (tùy phiên bản);

• Giải nén được thư mục to{n bộ m~ nguồn của nh}n (ví dụ thư mục linux-2.6.32.2)

61

Lập trình nhúng ARM-Linux

Biên dịch nhân Linux

Qu| trình biên dịch nh}n (tiếp):

• V{o thư mục chứa m~ nguồn nh}n (linux-2.6.32.2)

• Cấu hình trước khi biên dịch bằng lệnh:

make menuconfig

• Xuất hiện giao diện cấu hình, tùy chỉnh phù hợp với hệ thống.

• Thực hiện biên dịch bằng lệnh: make zImage

• Biên dịch th{nh công kết quả sẽ l{ file zImage (trong thư mục linux-2.6.32.2/arch/arm/mach-s3c2440) , sẽ được nạp (porting) xuống KIT

62

Page 32: ARM Linux Course(1)

32

Lập trình nhúng ARM-Linux

Biên dịch nhân Linux

Demo

<Xem hướng dẫn chi tiết trong tài liệu

hướng dẫn cài đặt và sử dụng KIT

micro2440>

63

Lập trình nhúng ARM-Linux

Thảo luận

64

Page 33: ARM Linux Course(1)

33

Lập trình nhúng ARM-Linux

Bài số 3

Môi trường

Lập trình nhúng Arm Linux

65

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 3

Sau khi kết thúc b{i học n{y, sinh viên có thể

• Trình b{y c|c th{nh phần cần thiết cho việc ph|t triển ứng dụng nhúng trên Linux

• Biết c|ch c{i đặt c|c công cụ, môi trường ph|t triển

• Trình b{y được cấu trúc một chương trình cơ bản, viết v{ biên dịch chương trình C đầu tiên “Hello” chạy trên KIT micro2440

66

Page 34: ARM Linux Course(1)

34

Lập trình nhúng ARM-Linux

Nội dung bài học

3.1. Môi trường ph|t triển ứng dụng nhúng Linux

3.2. C{i đặt môi trường ph|t triển

3.3. Lập trình ứng dụng HelloWorld

67

Lập trình nhúng ARM-Linux

3.1. Môi trường phát triển

Mô hình lập trình hệ thống nhúng

C|c th{nh phần cần thiết để ph|t triển ứng dụng nhúng trên Linux

68

Page 35: ARM Linux Course(1)

35

Lập trình nhúng ARM-Linux

Mô hình lập trình hệ thống nhúng

• Host: hệ thống chứa môi trường phát triển

•Target: hệ nhúng cần phát triển ứng dụng

69

Lập trình nhúng ARM-Linux

Môi trường lập trình KIT micro 2440

• M|y host c{i hệ điều h{nh Linux (Ubuntu)

• Trình biên dịch chéo Cross toolchains (arm-linux-gcc 4.4.3): biên dịch ứng dụng (viết bằng C/C++)

• Công cụ viết m~ nguồn chương trình C (dùng gedit, eclipse)

• gFTP: truyền nhận file Host<->KIT qua giao thức TFTP

• Telnet: kết nối KIT qua Ethernet (sử dụng cross cable)

70

Page 36: ARM Linux Course(1)

36

Lập trình nhúng ARM-Linux

3.2. Cài đặt môi trường phát triển

Cấu hình mạng LAN (host + 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)

71

Lập trình nhúng ARM-Linux

Cài đặt trình biên dịch chéo

Bước 1: Giải nén arm-linux-gcc-4.4.3.tar.gz

tar –zxvf arm-linux-gcc-4.4.3.tar.gz

Bước 2: Cập nhật biến môi trường PATH

• Thêm đường dẫn tới thư mục bin của arm-linux-gcc-4.4.3 (Cập nhật biến môi trường PATH trong file .bashrc trong đường dẫn chỉ ra bởi biến $HOME)

Bước 3: Kiểm tra trình biên dịch

• Mở cử sổ console, gõ lệnh: arm-linux-gcc --version

• Thông b|o về phiên bản của arm-linux-gcc hiện ra => qu| trình c{i đặt th{nh công

72

Page 37: ARM Linux Course(1)

37

Lập trình nhúng ARM-Linux

Kiểm tra trình biên dịch chéo

73

Lập trình nhúng ARM-Linux

Cài đặt phần mềm gFTP

Bước 1: Cài đặt phần mềm gFTP

• Gõ lệnh: sudo apt-get install gftp

Bước 2: Kiểm tra kết nối giữa Host và Target

• Mở phần mềm gFTP: Applications->Internet->gFTP

• Thiết lập các tham số

Địa chỉ IP của KIT: 192.168.1.230

Username: root

Password: ktmt (có thể đổi bằng lệnh passwd)

• Mở kết nối

74

Page 38: ARM Linux Course(1)

38

Lập trình nhúng ARM-Linux

Kết nối sử dụng gFTP

75

Lập trình nhúng ARM-Linux

Cài đặt phần mềm debug GDB

Bước 1: download m~ nguồn gdb (version 7.0)

• Cách 1: apt-get source gdb

• Cách 2: http://ftp.gnu.org/gnu/gdb/

Bước 2: Biên dịch v{ c{i đặt gdb client trên m|y HOST

Bước 3: Biên dịch v{ c{i đặt gdb server trên m|y TARGET

(Chi tiết xem trong tài liệu hướng dẫn cài đặt môi trường phát triển ứng dụng)

76

Page 39: ARM Linux Course(1)

39

Lập trình nhúng ARM-Linux

3.3. Xây dựng ứng dụng HelloWorld

Cấu trúc chương trình đơn giản

C|ch thức biên dịch chương trình

Nạp file thực thi xuống KIT v{ chạy ứng dụng

77

Lập trình nhúng ARM-Linux

Cấu trúc chương trình

Tu}n thủ cấu trúc chương trình ANSII C

78

Page 40: ARM Linux Course(1)

40

Lập trình nhúng ARM-Linux

Chương trình Hello World

Soạn thảo m~ nguồn chương trình C bằng gedit (file Hello.c)

79

#include <stdio.h>

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;

}

Lập trình nhúng ARM-Linux

Cách thức biên dịch chương trình

Cách 1: Sử dụng lệnh của cross compiler

• VD: arm-linux-gcc –g –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

Cách 3: Sử dụng automake và autoconf

• Tạo makefile tự động

80

Page 41: ARM Linux Course(1)

41

Lập trình nhúng ARM-Linux

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)

81

Lập trình nhúng ARM-Linux

VD 1: Makefile đơn giản

CC=arm-linux-gcc

all: Hello.c

$(CC) –g –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

82

Page 42: ARM Linux Course(1)

42

Lập trình nhúng ARM-Linux

VD 2: Makefile liên kết

Hello.c Display.c

Display.h

include

include

void display(int index, char* str)

void display(int index, char* str)

83

Lập trình nhúng ARM-Linux

VD2: Makefile liên kết

Hello.c

Compiler

Hello.o

Display.c

Compiler

Display.o

Linker

Hello File thực thi

84

Page 43: ARM Linux Course(1)

43

Lập trình nhúng ARM-Linux

VD 2: Makefile liên kết

CC=arm-linux-gcc

OUTPUT=Hello

all:Hello.o display.o

$(CC) -o $(OUTPUT) Hello.o display.o

Hello.o:Hello.c

$(CC) -c Hello.c

display.o:display.c

$(CC) -c display.c

85

Lập trình nhúng ARM-Linux

Nạp file thực thi xuống KIT

Bước 1: sử dụng phần mềm gFTP chuyển file Hello (đ~ được biên dịch trước đó) xuống KIT, ví dụ xuống thư mục: /ktmt

Bước 2: telnet xuống KIT, chuyển tới thư mục /ktmt, thực thi chương trình

• Gõ lệnh: ./Hello

• Nếu chương trình chưa có quyền thực thi, thực hiện cấp quyền: sudo chmod +x Hello

Bước 3: quan s|t kết quả

86

Page 44: ARM Linux Course(1)

44

Lập trình nhúng ARM-Linux

Thảo luận

87

Lập trình nhúng ARM-Linux

Bài số 4

Lập trình vào ra GPIO cơ bản

88

Page 45: ARM Linux Course(1)

45

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 4

Sau khi kết thúc b{i học n{y, sinh viên có thể

• Nắm được nguyên tắc lập trình giao tiếp v{o ra cơ bản trên hệ điều h{nh Linux nhúng

• Lập trình giao tiếp thiết bị (ghép nối GPIO) với driver đ~ có (led, button)

• Biết c|ch lập trình giao tiếp GPIO mở rộng dựa trên giao diện sysfs (gpiolib)

89

Lập trình nhúng ARM-Linux

Nội dung bài học

4.1. Cơ chế lập trình giao tiếp thiết bị

4.2. Lập trình điều khiển led đơn

4.3. Lập trình giao tiếp nút bấm

4.4. Lập trình giao tiếp GPIO mở rộng

90

Page 46: ARM Linux Course(1)

46

Lập trình nhúng ARM-Linux

4.1. Cơ chế lập trình giao tiếp thiết bị

Device files, Device number

Kiểm tra danh s|ch device driver, thiết bị

Cơ chế giao tiếp

91

Lập trình nhúng ARM-Linux

Mô hình giao tiếp ứng dụng – 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

•…

92

Page 47: ARM Linux Course(1)

47

Lập trình nhúng ARM-Linux

Device files, Device number

Device files: ls –l /dev

• Device file không phải l{ file thông thường, không phải l{ một vùng dữ liệu trên hệ thống file

• Qu| trình đọc ghi device file

Giao tiếp với device driver

Đọc, ghi phần cứng của thiết bị

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

93

Lập trình nhúng ARM-Linux

Device files, Device number

Device number: mỗi thiết bị được x|c định bởi hai gi| trị

• Major device number: x|c định thiết bị n{y sử dụng drvier nào

• Minor device number: ph}n biệt giữa c|c thiết bị kh|c nhau cùng sử dụng chung một device driver

94

Page 48: ARM Linux Course(1)

48

Lập trình nhúng ARM-Linux

Kiểm tra danh sách thiết bị

Kiểm tra danh s|ch c|c thiết bị

• Gõ lệnh ls –al /dev

Giải thích thông tin

Loại thiết bị: char device hay block device

Tài khoản người dùng

Tên thiết bị

Major và minor number

Mount ponint

95

Lập trình nhúng ARM-Linux

Kiểm tra danh sách thiết bị

Kiểm tra danh s|ch c|c nhóm thiết bị

• Gõ lệnh cat /proc/devices

96

Page 49: ARM Linux Course(1)

49

Lập trình nhúng ARM-Linux

Cơ chế lập trình giao tiếp thiết bị

Cơ chế lập trình

• Sử dụng c|c h{m v{o ra file

open

close

read

write

• Sử dụng h{m điều khiển v{o ra: ioctl

97

Lập trình nhúng ARM-Linux

4.2. Lập trình điều khiển led đơn

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)

98

Page 50: ARM Linux Course(1)

50

Lập trình nhúng ARM-Linux

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

Hàm giao tiếp:

•open

•close

•ioctl

99

Lập trình nhúng ARM-Linux

Lập trình điều khiển led đơn

fd=open(“/dev/leds”,0)

• fd: file id

• /dev/leds: device file

• 0: WRITE_ONLY

ioctl(fd, on, led_no)

• Ioctl: IO control

• Điều khiển bật/tắt led đơn có số hiệu led_no

Driver cho led đơn:

linux-2.6.32.2/drivers/char/mini2440_leds.c

100

Page 51: ARM Linux Course(1)

51

Lập trình nhúng ARM-Linux

Mã nguồn minh họa

101

Lập trình nhúng ARM-Linux

4.3. Lập trình giao tiếp nút bấm

Giao tiếp qua driver đ~ có

102

Page 52: ARM Linux Course(1)

52

Lập trình nhúng ARM-Linux

Mô hình giao tiếp điều khiển 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

103

Lập trình nhúng ARM-Linux

Lập trình ghép nối nút bấm

buttons_fd=open(“/dev/buttons”,0)

• buttons_fd: file id

• /dev/buttons: device file

read(buttons_fd,current_buttons,sizeof(current_buttons)

• Đọc trạng th|i c|c nút bấm

close(buttons_fd): đóng file

M~ nguồn driver cho nút bấm

linux-2.6.32.2/drivers/char/mini2440_buttons.c

104

Page 53: ARM Linux Course(1)

53

Lập trình nhúng ARM-Linux

Mã nguồn chương trình đọc nút bấm

105

Lập trình nhúng ARM-Linux

4.4. Lập trình giao tiếp GPIO mở rộng

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.

106

Page 54: ARM Linux Course(1)

54

Lập trình nhúng ARM-Linux

Lập trình giao tiếp GPIO mở rộng

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

107

Lập trình nhúng ARM-Linux

Lập trình giao tiếp GPIO mở rộng

Giao diện n{y cung cấp c|c files điều khiển sau đ}y:

108

Page 55: ARM Linux Course(1)

55

Lập trình nhúng ARM-Linux

Lập trình giao tiếp GPIO mở rộng

Ví dụ minh họa

Chi tiết xem b{i viết:

https://sites.google.com/site/embedded247/ddcourse/giao-tiep-gpio-tu-userspace-1

109

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

Lập trình nhúng ARM-Linux

Demo: Ứng dụng giao tiếp Board mở rộng, điều khiển led đơn, 7 seg, buttons. (Xem b{i thực h{nh)

110

Lập trình giao tiếp gpio sysfs

Page 56: ARM Linux Course(1)

56

Lập trình nhúng ARM-Linux

Thảo luận

111

Lập trình nhúng ARM-Linux

Bài số 5

Lập trình vào ra nâng cao

112

Page 57: ARM Linux Course(1)

57

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 5

Sau khi kết thúc b{i học n{y, sinh viên có thể

• Lập trình giao tiếp chuẩn RS232 trên kit nhúng Micro2440

• Lập trình ghép nối USB Joystick qua cổng USB

• Trình b{y cơ chế x}y dựng Device Driver

113

Lập trình nhúng ARM-Linux

Nội dung bài học

5.1. Giới thiệu chuẩn RS232

5.2. Lập trình giao tiếp chuẩn RS232

5.3. Giới thiệu chuẩn USB

5.4. Lập trình giao tiếp USB Joystick

5.5. Lập trình ghép nối ADC

5.6. Giới thiệu cơ chế lập trình Device Driver

114

Page 58: ARM Linux Course(1)

58

Lập trình nhúng ARM-Linux

5.1. Giới thiệu chuẩn RS232

Mức điện |p đường truyền

Chuẩn đầu nối trên m|y tính PC

Khuôn dạng khung truyền

Tốc độ truyền

Kịch bản truyền

115

Lập trình nhúng ARM-Linux

Chuẩn RS232

Mức điện áp đường truyền (Chuẩn RS-232C)

116

Page 59: ARM Linux Course(1)

59

Lập trình nhúng ARM-Linux

Chuẩn RS232

Chuẩn đấu nối trên PC

UART UART

UART (Universal Asynchronous receiver/transmitter) 117

Lập trình nhúng ARM-Linux

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

118

Page 60: ARM Linux Course(1)

60

Lập trình nhúng ARM-Linux

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

119

Lập trình nhúng ARM-Linux

Chuẩn RS232

Kịch bản truyền

• Không có bắt tay (none-handshaking): máy thu có khả

năng đọc các ký tự thu trước khi máy phát truyền ký tự

tiếp theo

Kết nối không cần bắt tay giữa hai thiết bị

(cùng mức điện áp)

120

Page 61: ARM Linux Course(1)

61

Lập trình nhúng ARM-Linux

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) 121

Lập trình nhúng ARM-Linux

5.2. Lập trình giao tiếp chuẩn RS232

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

• 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

122

Page 62: ARM Linux Course(1)

62

Lập trình nhúng ARM-Linux

Khai báo thư viện

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h> // UNIX standard function

#include <fcntl.h> // File control definitions

#include <errno.h> // Error number definitions

#include <termios.h> // POSIX terminal control

#include <time.h> // time calls

123

Lập trình nhúng ARM-Linux

Bước 1: Mở cổng

Sử dụng lệnh mở file

int fd = open ("/dev/ttySAC0", O_RDWR);

fd >0 nếu mở file th{nh công

fd<0 nếu mở file thất bại

124

Page 63: ARM Linux Course(1)

63

Lập trình nhúng ARM-Linux

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);

125

Lập trình nhúng ARM-Linux

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)

126

Page 64: ARM Linux Course(1)

64

Lập trình nhúng ARM-Linux

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)

127

Lập trình nhúng ARM-Linux

Demo

128

Page 65: ARM Linux Course(1)

65

Lập trình nhúng ARM-Linux

5.3. 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

129

Lập trình nhúng ARM-Linux

Tín hiệu chuẩn USB

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

130

Page 66: ARM Linux Course(1)

66

Lập trình nhúng ARM-Linux

Mô hình bus USB

131

Lập trình nhúng ARM-Linux

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ị

132

Page 67: ARM Linux Course(1)

67

Lập trình nhúng ARM-Linux

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.

133

Lập trình nhúng ARM-Linux

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

134

Page 68: ARM Linux Course(1)

68

Lập trình nhúng ARM-Linux

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

135

Lập trình nhúng ARM-Linux

Endpoint

136

Page 69: ARM Linux Course(1)

69

Lập trình nhúng ARM-Linux

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

137

Lập trình nhúng ARM-Linux

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

138

Page 70: ARM Linux Course(1)

70

Lập trình nhúng ARM-Linux

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)

139

Lập trình nhúng ARM-Linux

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.

140

Page 71: ARM Linux Course(1)

71

Lập trình nhúng ARM-Linux

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ể.

141

Lập trình nhúng ARM-Linux

5.4. Lập trình giao tiếp USB Joystick

142

Page 72: ARM Linux Course(1)

72

Lập trình nhúng ARM-Linux

Cấu trúc JOYINFO trên Windows

Windows định nghĩa cấu trúc JOYINFO để lưu c|c thông tin về tình trạng c|c nút bấm trên Joystick

Nút trái, phải

Nút lên, xuống

Các nút chức

năng: 1, 2, 3, 4,

L1, L2, R1, R2,

Select, Start

143

Lập trình nhúng ARM-Linux

Cấu trúc JOYINFO

wXpos

• wXpos=0 -> nút sang tr|i được bấm

• wXpos=65535 -> nút sang phải được bấm

wYpos

• wYpos=0 -> nút lên được bấm

• wYpos=65535 -> nút xuống được bấm

wButtons: mỗi bit biểu diễn trạng th|i của một nút chức năng

• VD: Button 1 -> bit 0, Button 2 -> bit 1…

144

Page 73: ARM Linux Course(1)

73

Lập trình nhúng ARM-Linux

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

145

Lập trình nhúng ARM-Linux

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)

146

Page 74: ARM Linux Course(1)

74

Lập trình nhúng ARM-Linux

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

147

Lập trình nhúng ARM-Linux

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

148

Page 75: ARM Linux Course(1)

75

Lập trình nhúng ARM-Linux

Demo

149

Lập trình nhúng ARM-Linux

Kết quả demo

C|c sự kiện khi khởi tạo thiết bị

150

Page 76: ARM Linux Course(1)

76

Lập trình nhúng ARM-Linux

Kết quả demo

C|c sự kiện khi người dùng nhấn c|c nút

151

Lập trình nhúng ARM-Linux

QT Joystick Demo

152

Page 77: ARM Linux Course(1)

77

Lập trình nhúng ARM-Linux

5.6. Lập trình ghép nối ADC

Giới thiệu ADC

Minh họa lập trình ADC

153

Lập trình nhúng ARM-Linux

Giới thiệu ADC

ADC: Analog to Digital Converter

• Thông số quan trọng của ADC

• Dải điện |p chuyển đổi

• ADC 8 bit, 10 bit, 12 bit…

• Bao nhiêu kênh?

• Độ ph}n ly

154

Page 78: ARM Linux Course(1)

78

Lập trình nhúng ARM-Linux

Minh họa lập trình ADC

Khai b|o thư viện

155

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <linux/fs.h>

#include <errno.h>

#include <string.h>

Lập trình nhúng ARM-Linux

Minh họa lập trình ADC

156

int main(void){

fprintf(stderr, "press Ctrl-C to stop\n");

int fd = open("/dev/adc", 0);

if (fd < 0) {

perror("open ADC device:");

return 1;

}

for(;;) {

char buffer[30];

int len = read(fd, buffer, sizeof buffer -1);

if (len > 0) {

buffer[len] = '\0';

int value = -1;

sscanf(buffer, "%d", &value);

printf("ADC Value: %d\n", value);

} else {

perror("read ADC device:");

return 1;

}

usleep(500* 1000); }

close(fd); }

Page 79: ARM Linux Course(1)

79

Lập trình nhúng ARM-Linux

5.6. Lập trình Device Driver

Giới thiệu về Kernel Module

Cơ chế x}y dựng Device Driver

157

Lập trình nhúng ARM-Linux

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

158

Page 80: ARM Linux Course(1)

80

Lập trình nhúng ARM-Linux

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

159

Lập trình nhúng ARM-Linux

Mã nguồn kernel Module

160

Page 81: ARM Linux Course(1)

81

Lập trình nhúng ARM-Linux

Kernel Module Makefile

obj-m += hello.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

161

Lập trình nhúng ARM-Linux

Device Driver

Thêm c|c device driver theo cơ chế sử dụng Kernel Module

C|c thao t|c thêm driver v{o hệ thống

• Viết m~ nguồn (cấu trúc tương tự kernel Module). Đăng ký Major ID

• Biên dịch m~ nguồn

• C{i đặt sử dụng lệnh insmod

• Sử dụng lệnh mknod để tạo device file trong /dev

mknod [options] NAME Type [Major Minor]

162

Page 82: ARM Linux Course(1)

82

Lập trình nhúng ARM-Linux

Ví dụ: Hello Driver

163

Lập trình nhúng ARM-Linux

Demo

164

Page 83: ARM Linux Course(1)

83

Lập trình nhúng ARM-Linux

Case Study

Lập trình giao tiếp giữa 2 KIT truyền nhận dữ liệu qua USB:

• KIT FriendlyArm: là usb host có usb driver

• KIT AT91SAM7: là usb device có usb core

Tham khảo: Video, M~ nguồn.

165

Demo

Lập trình nhúng ARM-Linux

Thảo luận

166

Page 84: ARM Linux Course(1)

84

Lập trình nhúng ARM-Linux

Bài số 6

Các kỹ thuật lập trình nâng cao

167

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 6

Sau khi kết thúc b{i học n{y, sinh viên có thể

• Nắm được kh|i niệm tiến trình (process), cơ chế liên lạc giữa c|c tiến trình, lập trình gửi, nhận tín hiệu giữa 2 tiến trình

• Hiểu kh|i niệm luồng (thread)

• Lập trình ứng dụng đa luồng (multithread)

• Lập trình socket trên Linux

168

Page 85: ARM Linux Course(1)

85

Lập trình nhúng ARM-Linux

Nội dung bài học

6.1. Tiến trình (process)

6.2. Cơ chế liên lạc giữa c|c tiến trình

6.3. Luồng (thread)

6.4. Lập trình ứng dụng đa luồng

6.5. Lập trình socket trên Linux

169

Lập trình nhúng ARM-Linux

6.1. Tiến trình (Process)

Tiến trình (process) được tạo ra khi ta thực thi một chương trình (program)

Kỹ thuật lập trình n}ng cao thường sử dụng nhiều tiến trình kết hợp trong một ứng dụng để xử lý nhiều công việc.

Ví dụ: Mở nhiều chương trình Word (mỗi cửa sổ soạn thảo nội dung một file kh|c nhau), mỗi thể hiện (instance) l{ một tiến trình (process)

170

Page 86: ARM Linux Course(1)

86

Lập trình nhúng ARM-Linux

Số hiệu tiến trình

Làm thế nào để phân biệt các tiến trình ?

Mỗi tiến trình được x|c định bởi số hiệu (định danh):

• PID (Process ID): số hiệu tiến trình

• PPID (Parent Process ID): số hiệu tiến trình cha

• Có kiểu dữ liệu pid_t (thư viện sys/types.h)

171

Lập trình nhúng ARM-Linux

PID, PPID

Lập trình C/C++ cung cấp hàm hệ thống để:

Lấy về PID: sử dụng hàm getpid()

Lấy về PPID: sử dụng hàm getppid()

Hàm getpid() và getppid() trả giá trị kiểu pid_t

(bản chất là kiểu int)

172

Page 87: ARM Linux Course(1)

87

Lập trình nhúng ARM-Linux

Xem tiến trình đang chạy

Lệnh Linux: ps

Xem nhiều thông tin hơn:

ps -e -o pid,ppid,command

Trong đó:

-e để xem tất cả tiến trình

-o pid,ppid,command để xem c|c thông tin tương ứng: pid, ppid v{ command (lệnh để thực thi tiến trình)

173

Lập trình nhúng ARM-Linux

Dừng tiến trình

Có thể dừng một tiến trình đang chạy bằng lệnh kill với tham số l{ số hiệu tiến trình muốn dừng.

Lệnh kill mặc định gửi tới tiến trình tiến hiệu SIGTERM để yêu cầu kết thúc.

kill PID Có thể sử dụng tổ hợp phím tắt Ctrl+C để dừng tiến

trình (bản chất cũng gửi tín hiệu terminate)

174

Page 88: ARM Linux Course(1)

88

Lập trình nhúng ARM-Linux

Tạo tiến trình mới

Cách 1: sử dụng h{m system

H{m system() trong C cung cấp c|ch để thực thi một c}u lệnh hệ thống trong chương trình C (như l{ được thực thi từ dòng lệnh). H{m trả về trạng th|i kết thúc của lệnh.

175

Lập trình nhúng ARM-Linux

Tạo tiến trình mới

Cách 2: sử dụng h{m fork v{ exec (trên linux, thư viện unistd.h)

176

Page 89: ARM Linux Course(1)

89

Lập trình nhúng ARM-Linux

6.2. Cơ chế liên lạc giữa các tiến trình

Làm thế nào để các tiến trình có thể liên lạc (giao tiếp) với nhau ?

Signal l{ cơ chế cho phép giao tiếp giữa c|c tiến trình

Signal l{ cơ chế không đồng bộ

Khi tiến trình nhận được signal, tiến trình phải xử lý signal ngay lập tức

Linux hỗ trợ 32 SIGNAL

177

Lập trình nhúng ARM-Linux

Danh sách signal thường dùng

Kiểu SIGNAL Lý do gửi SIGNAL

SIGHUP Báo cho chương trình khi thoát khỏi terminal

SIGINT Khi người dùng nhấn Ctrl + C để tắt chương trình

SIGILL Khi chương trình chạy lệnh không hợp lệ

SIGABRT Khi chương trình nhận được lệnh abort

SIGKILL Khi chương trình nhận được lệnh kill (đóng chương

trình)

SIGUSR1 Tùy biến theo ứng dụng

SIGUSR2 Tùy biến theo chương trình

178

Page 90: ARM Linux Course(1)

90

Lập trình nhúng ARM-Linux

Gửi SIGNAL tới process

Cách 1: sử dụng shell command

kill [-SIGNAL_TYPE] PID

Cách 2: sử dụng h{m kill trong chương trình C, cho phép process n{y gửi signal tới process kh|c

kill(PID, SIGNAL_TYPE)

Vấn đề:

Cơ chế xử lý signal gửi đến tiến trình ?

(Sử dụng cấu trúc sigaction)

179

Lập trình nhúng ARM-Linux

6.3. Giới thiệu về luồng (thread)

Luồng (thread) cơ chế cho phép chương trình thực hiện nhiều công việc song song

Luồng phải nằm trong một tiến trình (process)

Có thể liên hệ process l{ con đường (từ A->B), còn luồng l{ c|c l{n đường kh|c nhau.

Một chương trình có thể được lập trình sử dụng kỹ thuật đa luồng (multithread) để cho phép l{m được nhiều công việc đồng thời.

180

Page 91: ARM Linux Course(1)

91

Lập trình nhúng ARM-Linux

6.3. Giới thiệu về luồng (thread)

Một chương trình mặc định chạy một luồng -> luồng chính

Luồng chính có thể tạo ra c|c luồng kh|c, c|c luồng sẽ chạy đồng thời -> tăng tốc chương trình

C|c luồng chia sẻ không gian nhớ, truy xuất file v{ các tài nguyên khác.

181

Tham số của một luồng:

thread ID: số hiệu luồng (kiểu dữ liệu pthread_t)

Lập trình nhúng ARM-Linux

6.4. Lập trình xử lý đa luồng

Tạo luồng

Truyền tham số cho luồng

Nhận gi| trị trả về từ luồng

Tắt luồng

182

Page 92: ARM Linux Course(1)

92

Lập trình nhúng ARM-Linux

Tạo luồng

Khai b|o thư viện: pthread.h

H{m tạo luồng: pthread_create

thread: thread id

attr: các thuộc tính của luồng, mặc định để NULL

start_routine: hàm thực thi trong luồng

arg: các tham số truyền cho luồng

Biên dịch chương trình:

gcc –o multithread multithread.c -pthread

183

Lập trình nhúng ARM-Linux

Mã nguồn tạo luồng

184

Page 93: ARM Linux Course(1)

93

Lập trình nhúng ARM-Linux

Truyền tham số cho luồng

Khai báo cấu trúc dữ liệu chứa dữ liệu cần truyền cho luồng. Ví dụ:

struct arg {

//Ky tu can in

char character;

//So lan can in

int count;

};

Truyền dữ liệu cho luồng khi tạo luồng qua tham số arg

Chương trình con thực thi luồng nhận tham số về và xử lý

185

Lập trình nhúng ARM-Linux

Mã nguồn truyền tham số cho luồng

186

Page 94: ARM Linux Course(1)

94

Lập trình nhúng ARM-Linux

Tắt luồng

Sử dụng h{m pthread_cancel:

thread: nhận tham số thread id của luồng

muốn tắt

187

Lập trình nhúng ARM-Linux

Mã nguồn tắt luồng

188

Page 95: ARM Linux Course(1)

95

Lập trình nhúng ARM-Linux

Case study

B{i 1: Lập trình chương trình đa luồng tạo c|c hiệu ứng led + đọc trạng th|i nút bấm để thay đổi hiệu ứng, tăng tốc.

B{i 2: Lập trình chương trình đa luồng giao tiếp RS232

189

Lập trình nhúng ARM-Linux

6.5. Lập trình Socket trên Linux

Giới thiệu lập trình socket

Mô hình lập trình

Minh họa

190

Page 96: ARM Linux Course(1)

96

Lập trình nhúng ARM-Linux

Giới thiệu lập trình socket

Socket: Kết nối đầu cuối giữa 2 tiến trình/2 m|y qua mạng (mô hình client/server)

Tiến trình client kết nối đến tiến trình server yêu cầu trao đổi dữ liệu

Client cần biết về địa chỉ v{ sự tồn tại của server, trong khi server không cần biết về client cho đến khi nó được kết nối đến.

Mỗi khi thiết lập kết nối, cả 2 bên có thể gửi v{ nhận dữ liệu

Liên hệ như kết nối trong một cuộc gọi điện thoại

191

Lập trình nhúng ARM-Linux

Giới thiệu lập trình socket

C|c hệ thống (Windows, Linux, …) đều cung cấp c|c h{m hệ thống lập trình socket

Có 2 loại socket sử dụng rộng r~i:

• Stream socket

• Datagram socket

Stream sockets: Dựa trên giao thức TCP (Tranmission Control Protocol), l{ giao thức hướng luồng (stream oriented).

Datagram sockets: Dựa trên giao thức UDP (User Datagram Protocol), l{ giao thức hướng thông điệp (message oriented)

192

Page 97: ARM Linux Course(1)

97

Lập trình nhúng ARM-Linux

Mô hình lập trình socket

Mô hình lập trình socket TCP giữa 2 tiến trình client/server

193

Lập trình nhúng ARM-Linux

Chương trình minh họa

2 tiến trình (M~ nguồn tham khảo):

• server.c

• client.c

Biên dịch v{ chạy 2 chương trình n{y (trên cùng một m|y local host, hoặc 2 m|y riêng biệt kết nối mạng)

194

Page 98: ARM Linux Course(1)

98

Lập trình nhúng ARM-Linux

Demo

Lập trình giao tiếp socket giữa KIT micro 2440 v{ PC

195

Demo

Lập trình nhúng ARM-Linux

Thảo luận

196

Page 99: ARM Linux Course(1)

99

Lập trình nhúng ARM-Linux

Bài số 7

Lập trình nền tảng QT

197

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 7

Sau khi kết thúc b{i học n{y, sinh viên có thể

• Nắm được c|c vấn đề cơ bản, đặc trưng của nền tảng Qt

• C{i đặt Qt Creator (Qt SDK) trên m|y ph|t triển (Ubuntu)

• L{m quen với lập trình ứng dụng giao diện đồ họa sử dụng nền tảng Qt

• C{i đặt Qt Everywhere để ph|t triển ứng dụng cho nền tảng Arm Embedded Linux

198

Page 100: ARM Linux Course(1)

100

Lập trình nhúng ARM-Linux

Nội dung bài học

7.1. Giới thiệu QT

7.2. C{i đặt môi trường ph|t triển Qt

7.3. L{m quen với lập trình QT

7.4. C{i đặt Qt Everywhere (Qt Embedded)

199

Lập trình nhúng ARM-Linux

7.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

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…

200

Page 101: ARM Linux Course(1)

101

Lập trình nhúng ARM-Linux

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++.

201

Lập trình nhúng ARM-Linux

Giới thiệu QT

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

202

Page 102: ARM Linux Course(1)

102

Lập trình nhúng ARM-Linux

QT được sử dụng rộng rãi

203

Lập trình nhúng ARM-Linux

Kiến trúc Qt

204

Page 103: ARM Linux Course(1)

103

Lập trình nhúng ARM-Linux

7.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

(http://qt.nokia.com/downloads)

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 205

Lập trình nhúng ARM-Linux

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

206

Page 104: ARM Linux Course(1)

104

Lập trình nhúng ARM-Linux

7.3. Làm quen với lập trình QT

Sử dụng môi trường ph|t triển Qt Creator (IDE)

Chương trình HelloQt

Cơ chế Signals/Slot

207

Lập trình nhúng ARM-Linux

Môi trường phát triển Qt Creator IDE

208

Page 105: ARM Linux Course(1)

105

Lập trình nhúng ARM-Linux

Các thành phần Qt Creator

209

Lập trình nhúng ARM-Linux

Các điều khiển (widgets) cơ bản

QLabel

QPushButton

QLineEdit

QTextEdit

QSpinBox

QComboBox

Qslider

V.v…

210

Page 106: ARM Linux Course(1)

106

Lập trình nhúng ARM-Linux 211

Chương trình HelloQt

#include <QApplication>

#include <QLabel>

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

QLabel *label = new QLabel("Hello Qt!");

label->show();

return app.exec();

}

Tạo project HelloQt

Trong file main.c bổ sung đoạn m~:

Biên dịch, chạy chương trình:

Lập trình nhúng ARM-Linux 212

Chương trình HelloQt

Giải thích ?

Sửa đoạn m~ với HTML style

#include <QApplication>

#include <QLabel>

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

//QLabel *label = new QLabel("Hello Qt!");

QLabel *label = new QLabel("<h2><i>Hello</i> "

"<font color=red>Qt!</font></h2>");

label->show();

return app.exec();

}

Page 107: ARM Linux Course(1)

107

Lập trình nhúng ARM-Linux

Cơ chế event – handler

Xử lý c|c sự kiện (sự kiện tương t|c người dùng, sự kiện của hệ thống)

Cho phép tạo c|c kết nối (connections) giữa sự kiện (signals) với h{m xử lý (slot)

Có 2 c|ch tạo:

• Tạo tự động (wizard)

• Tạo bằng tay (manual, hand-code)

213

Cơ chế signals - slot

Lập trình nhúng ARM-Linux

Tạo bằng code (dùng phương thức Qobject::connect)

214

Minh họa cơ chế signals/slot

Page 108: ARM Linux Course(1)

108

Lập trình nhúng ARM-Linux

Minh họa cơ chế Signals/Slot

Tạo bằng code connect(sender, SIGNAL(signal), receiver, SLOT(slot));

Trong đó: sender, receiver l{ con trỏ Qobjects, signal v{ slot l{ c|c tên h{m không có tham số.

• Các macro SIGNAL() và SLOT() biến đổi tham số thành string.

VD: đồng bộ giữa 2 điều khiển slider v{ spinBox

215

Lập trình nhúng ARM-Linux

Minh họa cơ chế Signals/Slot

216

Tạo tự động (wizard): chuột phải v{o đối tượng muốn xử lý sự kiện, chọn Go to slot, tìm slot l{ h{m xử lý sự kiện tương ứng muốn dùng.

Ví dụ xử lý sự kiện nút bấm (QPushButton)

Page 109: ARM Linux Course(1)

109

Lập trình nhúng ARM-Linux

Qt Documentations

Documentation in Qt Assistant (or QtCreator)

Qt’s examples

Qt developer network:

• http://developer.qt.nokia.com/

Qt Center Forum:

• http://www.qtcentre.org

217

Lập trình nhúng ARM-Linux

Lập trình hướng đối tượng C++

Đối tượng (Objects) v{ Lớp (Class):

• Khai b|o lớp, đối tượng, kế thừa, gọi c|c phương thức, …

• Sử dụng đối tượng kiểu stack/heap.

Tính đa hình (Polymorphism): virtual methods

Tính cộng t|c (Colloborations)

218

Page 110: ARM Linux Course(1)

110

Lập trình nhúng ARM-Linux

7.4. Cài đặt Qt Everywhere

Bước 1: Cài đặt QT Embedded (QT Everywhere)

(Xem hướng dẫn chi tiết kèm theo)

Bước 2: Copy các file thư viện cần thiết xuống KIT

• 3 thư viện quan trọng (VD: copy xuống thư mục /opt/qte/lib) libQtCore.so.4

libQtGui.so.4

libQtNetwork.so.4

• Copy các fonts vào thư mục /opt/qte/lib/fonts

Bước 3: Chỉnh file cấu hình /etc/init.d/rcS, tắt Qtopia để tránh tranh chấp

219

Lập trình nhúng ARM-Linux

Cấu hình trình dịch Qmake cho Kit

Bước 4: Tạo cấu hình biên dịch cho Mini2440, trỏ tới Qmake đ~ biên dịch được ở trên

220

Page 111: ARM Linux Course(1)

111

Lập trình nhúng ARM-Linux

Cấu hình trình dịch Qmake cho Kit

Bước 5: Dịch chương trình QT cho KIT

• Chọn đúng bộ biên dịch Qmake cho QT Embedded

221

Lập trình nhúng ARM-Linux

Thảo luận

222

Page 112: ARM Linux Course(1)

112

Lập trình nhúng ARM-Linux

Bài số 8

Lập trình Qt nâng cao

223

Lập trình nhúng ARM-Linux

Mục tiêu bài học số 8

Sau khi kết thúc b{i học n{y, học viên có thể

• X}y dựng ứng dụng giao diện, sử dụng c|c điều khiển (widgets)

• Sử dụng kỹ thuật quản lý layout để sắp xếp c|c điều khiển trên form

• Cơ chế xử lý sự kiện (signal/slot)

• Lập trình mạng với Qt

224

Page 113: ARM Linux Course(1)

113

Lập trình nhúng ARM-Linux

Nội dung bài học

8.1. Quản lý layout trong ứng dụng Qt

8.2. Thư viện lập trình mạng trên Qt

8.3. Lập trình ứng dụng ChatRoom

8.4. Lập trình ứng dụng gửi/nhận ảnh qua socket

225

Lập trình nhúng ARM-Linux

8.1. Quản lý layout trong ứng dụng Qt

Kỹ thuật layout: Cho phép sắp xếp c|c điều khiển (widgets) trên một form. Kích thước v{ vị trí sẽ thay đổi linh hoạt khi form thay đổi kích thước.

Có c|c kiểu lay out:

• Horizontal lay out

• Vertical lay out

• Grid lay out

• Form lay out

226

Page 114: ARM Linux Course(1)

114

Lập trình nhúng ARM-Linux

Chương trình TextFinder

X}y dựng ứng dụng TextFinder

227

Lập trình nhúng ARM-Linux

8.2. Thư viện lập trình mạng trên Qt

QtNetwork

• QTcpSocket

• QUdpSocket

• QTcpServer

• QFtp: l{m việc với giao thức truyền file FTP

• QHttp: l{m việc với giao thức Http

(Xem Qt documentation)

228

Page 115: ARM Linux Course(1)

115

Lập trình nhúng ARM-Linux

8.3. Chương trình ChatRoom

229

Lập trình nhúng ARM-Linux

8.4. Chương trình gửi/nhận ảnh

Lập trình socket client/server

Sử dụng lớp QImage

230

Page 116: ARM Linux Course(1)

116

Lập trình nhúng ARM-Linux

Thảo luận

231

Lập trình nhúng ARM-Linux

Phụ lục A – Các lệnh Linux

Lệnh hiển thị thông tin c|c file trong thư mục

ls –al //hiển thị danh s|ch với đầy đủ thông tin

Lệnh thay đổi quyền cho một file hay thư mục

chmod

vd: chmod +x Filename //Cấp thêm quyền thực thi

Lệnh để xem danh s|ch c|c file thiết bị

ls –al /dev

Lệnh để xem tất cả c|c tiến trình đang chạy

ps

232

Page 117: ARM Linux Course(1)

117

Lập trình nhúng ARM-Linux

Phụ lục A – Các lệnh Linux

Lệnh c{i đặt một phần mềm từ kho chứa của Linux

sudo apt-get install Tên_gói_phần_mềm

Xem danh s|ch c|c major id tương ứng với c|c device driver đang active

cat /proc/devices

Tìm kiếm file chứa một dòng text bất kỳ

grep vd: grep –r “Hello” . //Tìm tất cả c|c file v{ hiển thị ra c|c dòng chứa từ khóa

//Hello trong thư mục hiện tại v{ c|c thư mục con

233

Lập trình nhúng ARM-Linux

Phụ lục B – Website quan trọng

http://www.friendlyarm.net //download

http://www.thaieasyelec.com/FriendlyARM //mua KIT, download t{i liệu

http://dientuvietnam.net //forum chia sẻ

http://eetimes.com //Tin tức công nghệ

http://www.kernel.org //download mã kernel

http://qt.nokia.com //Hỗ trợ QT SDK

qtforum.org

qtcenter.org

234