Giới thiệu lập trình hệ 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 đó... Giới thiệu lập trình hệ nhúng Các thiết bị di đ
Trang 1LẬP TRÌNH HỆ NHÚNG
GV: Phạm Ngọc Hưng
Bộ môn Kỹ thuật Máy tính Viện CNTT&TT- ĐH BKHN email: hungpn@soict.hut.edu.vn
Trang 2Nội dung
Chương 1 Giới thiệu lập trình hệ nhúng
Chương 2 Lập trình v{o ra cơ bản
Chương 3 Lập trình v{o ra n}ng cao
Chương 4 C|c kỹ thuật lập trình n}ng cao
Chương 5 Lập trình device driver trên Linux
Chương 6 Lập trình nền tảng QT
Chương 7 Lập trình mạng trên Linux nhúng
Chương 8 Lập trình xử lý ảnh trên nền nhúng
Trang 3Tà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/
Trang 4Chương 1
Giới thiệu Lập trình hệ nhúng
Trang 5Nội dung chương 1
Trang 61.1 Giới thiệu lập trình hệ 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
Trang 71.1 Giới thiệu lập trình hệ 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, …
Trang 81.1 Giới thiệu lập trình hệ 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/Memo,
• 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
Trang 91.1 Giới thiệu lập trình hệ nhúng
Môn 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 điều khiển 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
Trang 101.2 Giới thiệu KIT nhúng micro2440
Trang 11Giới thiệu KIT nhúng micro2440
Trang 12Giới thiệu KIT nhúng micro2440
Trang 13Giới thiệu KIT nhúng micro2440
Thông số kỹ thuật
Trang 14Giới thiệu KIT nhúng micro2440
Trang 151.3 Hệ điều hành nhúng Linux
1.3.1 Tổng quan hệ điều h{nh nhúng Linux
1.3.2 C{i đặt Embedded Linux trên Micro2440
1.3.3 Biên dịch, tùy biến nh}n Linux
Trang 161.3.1 Tổng quan Embedded Linux
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
Trang 17Sơ đồ phân cấp hệ thống
Trang 18Kiến trúc hệ điều hành Linux
Trang 19Đặc trưng 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)
Trang 20Hệ đ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ề
Trang 21Hệ điều hành thời gian thực
Trang 22Cấu trúc nhân hệ điều hành
Trang 23Hệ 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
Trang 24Embedded 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
Trang 25Quá trình boot hệ thống Linux trên PC
Trang 26Quá trình boot hệ thống Linux nhúng
Trang 27Quá trình boot hệ thống Linux nhúng
Boot loader: chương trình mồi, thực hiện kiểm tra
Trang 281.3.2 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)
Trang 29Cài đặt từ 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
Trang 30Cài đặt từ môi trường Linux
• 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
Trang 31Cà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>
Trang 321.3.3 Biên dịch, tùy biến 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, thay đổi, 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)
Trang 33Biê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
Trang 34Biê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
Trang 351.4 Môi trường lập trình KIT
FriendlyARM Micro2440
1.4.1 Môi trường ph|t triển ứng dụng nhúng
1.4.2 C{i đặt môi trường ph|t triển KIT 2440
1.4.3 Chương trình HelloWorld
Trang 361.4.1 Môi trường phát triển ứng dụng
nhúng
Mô hình lập trình hệ thống nhúng
Môi trường lập trình KIT micro 2440
Trang 37Mô 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
Trang 38Môi trường lập trình KIT micro 2440
• M|y host c{i hệ điều h{nh Linux (Ubuntu 10.04)
• 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 FTP
• Telnet: kết nối KIT qua Ethernet (sử dụng cross cable)
Trang 39Môi trường lập trình theo nhóm
Môi trường phát triển ứng dụng theo nhóm
Trang 401.4.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)
Trang 41Cà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
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
Trang 42Kiểm tra trình biên dịch chéo
Trang 43Cài đặt phần mềm gFTP
Bước 1: Cài đặt phần mềm gFTP (nếu chưa có)
• Gõ lệnh: sudo apt-get install gftp
Bước 2: Kiểm tra kết nối giữa Host và Target
Trang 44Kết nối sử dụng gFTP
Trang 47Cấu trúc chương trình
Tu}n thủ cấu trúc chương trình ANSII C
Trang 48Chương trình Hello World
Soạn thảo m~ nguồn chương trình C bằng gedit (file Hello.c)
#include <stdio.h>
int main (int argc, char* argv[])
{
printf(“Hello World !\n”);
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]);
}
Trang 49Cá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 (-g)
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
Trang 50[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
Trang 51VD 1: Makefile đơn giản
Biên dịch chương trình: make all
Xóa file sinh ra trước đó: make clear
Trang 52void display (int index, char* str)
void display (int index, char* str)
Trang 54VD 2: Makefile liên kết
CC=arm-linux-gcc
all:Hello.o display.o
$(CC) -o $(OUTPUT) Hello.o display.o
$(CC) -c Hello.c
$(CC) -c display.c
Trang 55Nạ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ụ
Trang 56Thảo luận
Trang 57Chương 2
Lập trình vào ra cơ bản
Trang 58Mục tiêu chương 2
Sau khi kết thúc chương 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)
Trang 59Nội dung bài học
2.1 Cơ chế lập trình giao tiếp thiết bị
2.2 Lập trình điều khiển led đơn
2.3 Lập trình giao tiếp nút bấm
2.4 Lập trình giao tiếp GPIO mở rộng
Trang 602.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
Trang 61Mô hình giao tiếp ứng dụng – thiết bị
Trang 62Lậ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
62
Trang 63Device 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
Trang 64Kiể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
Trang 65Kiể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
Trang 66Cơ chế lập trình giao tiếp thiết bị
Trang 672.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)
Trang 68Mô hình giao tiếp điều khiển led
Trang 69Lập trình điều khiển led đơn
• Đ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
Trang 70Mã nguồn minh họa điều khiển led đơn
Trang 712.3 Lập trình giao tiếp nút bấm
Giao tiếp qua driver đ~ có
Trang 72Mô hình giao tiếp điều khiển nút bấm
Trang 74Mã nguồn chương trình đọc nút bấm
Trang 752.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
Trang 76Lậ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
Trang 77Lậ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:
Trang 78Lập trình giao tiếp GPIO mở rộng
Trang 79Thảo luận
Trang 80Chương 3
Lập trình vào ra nâng cao
Trang 81• Nắm được chuẩn giao tiếp USB
• Lập trình ghép nối USB Joystick qua cổng USB
• Lập trình giao tiếp ADC
Trang 82Nội dung bài học
3.1 Giới thiệu chuẩn RS232
3.2 Lập trình giao tiếp chuẩn RS232
3.3 Giới thiệu chuẩn USB
3.4 Lập trình giao tiếp USB Joystick
3.5 Lập trình giao tiếp ADC
Trang 833.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
Trang 84Chuẩn RS232
Mức điện |p đường truyền (Chuẩn RS-232C)
Trang 86Chuẩ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
Trang 87Chuẩ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
Trang 88Chuẩ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ị
Trang 89
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)
Trang 903.2 Lập trình giao tiếp chuẩn RS232
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ố
Bước 3: Đọc, ghi cổng
Bước 4: Đóng cổng
Trang 91Khai 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
Trang 92Bướ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
Trang 93port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings);
93