You are on page 1of 62

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM

KHOA ĐIỆN - ĐIỆN TỬ

MÔN HỌC: HỆ THỐNG NHÚNG (CNKT - MÁY TÍNH)

TIỂU LUẬN

ĐIỀU KHIỂN, THU NHẬN DỮ LIỆU PHẦN CỨNG

THÔNG QUA ỨNG DỤNG DI ĐỘNG

GVHD: Th.s Đậu Trọng Hiển


SVTH MSSV
Mai Huỳnh Tuấn Vũ 20139098
Nguyễn Huy Hoàng 20139031
Nguyễn Thị Thảo 20139090
Trần Quang Diệu 20139066
Nguyễn Vương Quốc Bảo 20139002
Lớp thứ 4 -Tiết 1 - 3

Tp. Hồ Chí Minh, tháng 12 năm 2022


ĐIỂM SỐ

TIÊU CHÍ NỘI DUNG TRÌNH BÀY TỔNG

ĐIỂM

NHẬN XÉT

...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................

Ký tên

Ths. Đậu Trọng Hiển


BẢNG PHÂN CÔNG NHIỆM VỤ

THỨ
HỌ TÊN NHIỆM VỤ KẾT QUẢ KÝ TÊN
TỰ

Phân công, tổng


1 Mai Huỳnh Tuấn Vũ Hoàn thành tốt
hợp và mục III

2 Nguyễn Huy Hoàng Mục I - 1 Hoàn thành tốt

Mục I - 3, mục II -
3 Nguyễn Thị Thảo Hoàn thành tốt
1

Mục I – 4, mục II -
4 Trần Quang Diệu Hoàn thành tốt
2.3

5 Nguyễn Vương Quốc Bảo Mục II – 2.1 và 2.2 Hoàn thành tốt
MỤC LỤC

I. Phần cứng hệ thống nhúng ............................................................................................. 1


1. Bộ xử lý đơn dụng ......................................................................................................... 1
1.1. Khái niệm bộ xử lý đơn dụng và các thành phần cấu tạo nên .................................... 1
1.2. Một số đặc trưng của bộ xử lý đơn dụng .................................................................... 2
2. Bộ xử lý đa dụng ........................................................................................................... 2
2.1. Khái niệm và đặc trưng .............................................................................................. 2
2.2. Các ví dụ ..................................................................................................................... 3
3. Bộ xử lý chuyên dụng.................................................................................................... 4
3.1. Khái niệm và đặc trưng .............................................................................................. 4
3.2.Ưu và nhược điểm ....................................................................................................... 5
4. UART, SPI, I2C, LAN .................................................................................................. 5
4.1. UART (Universal Asynchronous Receiver /Transmitter) .......................................... 5
4.2. SPI (Serial Peripheral Interface) ................................................................................. 8
4.3. I2C (Inter – Integrated Circuit)................................................................................. 11
4.4. LAN (Local Area Network) ..................................................................................... 13
II. Phần mềm hệ thống nhúng.......................................................................................... 17
1. Hệ điều hành nhúng RTOS, Android, Linux ............................................................... 17
1.1. Hệ điều hành RTOS.................................................................................................. 17
1.2. Hệ điều hành Android .............................................................................................. 22
1.3. Hệ điều hành Linux .................................................................................................. 25
2. Ngôn ngữ lập trình, SDK và IDE ................................................................................ 28
2.1. Ngôn ngữ lập trình Dart ........................................................................................... 28
2.2. Flutter SDK............................................................................................................... 30
2.3. Visual Studio Code ................................................................................................... 32
III. Bài tập ........................................................................................................................ 36
1. Chức năng phần mềm .................................................................................................. 36
2. Lưu đồ giải thuật.......................................................................................................... 37
3. Code ............................................................................................................................. 41
TÀI LIỆU THAM KHẢO ............................................................................................... 58
I. Phần cứng hệ thống nhúng

1. Bộ xử lý đơn dụng
1.1. Khái niệm bộ xử lý đơn dụng và các thành phần cấu tạo nên
Một bộ xử lý đơn dụng là một mạch số được thiết kế để thực hiện chính xác một
chương trình. Một bộ xử lý cơ bản bao gồm bộ điều khiển và đường dẫn dữ liệu.

Hình minh họa các thành phần của một bộ xử lý đơn dụng

Đường dẫn dữ liệu lưu trữ và điều khiển dữ liệu của hệ thống. Đường dẫn dữ liệu chứa
các đơn vị thanh ghi, đơn vị chức năng và kết nối như dây và bộ ghép kênh. Đường dẫn dữ
liệu có thể được cấu hình để đọc dữ liệu từ nguồn cấp dữ liệu cụ thể mà dữ liệu thông qua
các đơn vị chức năng được cấu hình để thực hiện các hoạt động cụ thể như thêm hoặc thay
đổi và lưu trữ kết quả hoạt động trở lại các thanh ghi cụ thể.
Bộ điều khiển phụ trách cấu hình của đường dẫn dữ liệu. Nó đặt các đầu vào điều
khiển đường dẫn dữ liệu, như tải thanh ghi và chọn tín hiệu bộ ghép kênh. Chọn tín hiệu,
của các đơn vị thanh ghi, đơn vị chức năng và đơn vị kết nối để có được cấu hình mong

1
muốn tại một thời điểm cụ thể. Bộ điều khiển cũng phụ trách theo dõi các đầu vào điều
khiển bên ngoài cũng như đầu ra điều khiển đường dẫn dữ liệu, được gọi là tín hiệu trạng
thái, đến từ các đơn vị chức năng và cũng đặt ra các đầu ra điều khiển bên ngoài.
Các kỹ thuật thiết kế hệ thống kỹ thuật số như thiết kế logic kết hợp và tuần tự bao
gồm các kỹ thuật của thiết kế đồng bộ và không đồng bộ có thể được áp dụng để xây dựng
bộ điều khiển và đường dẫn dữ liệu.
1.2. Một số đặc trưng của bộ xử lý đơn dụng
Đầu tiên là hiệu suất có thể tối ưu, vì bộ xử lý được tùy chỉnh cho tác vụ cụ thể đang
diễn ra. Các tác vụ có thể được thực thi với trong ít chu trình máy hơn, và chính các chu
trình cũng ngắn hơn:
- Ít chu kỳ xung nhịp hơn có thể do nhiều thành phần đường dẫn dữ liệu hoạt động
song song, từ các thành phần đường dẫn dữ liệu truyền dữ liệu trực tiếp cho nhau mà không
cần các thanh ghi trung gian, hoặc do loại bỏ việc tìm nạp bộ nhớ chương trình.
- Các chu kỳ ngắn hơn có thể do các đơn vị chức năng đơn giản hơn, ít bộ ghép kênh
hơn hoặc logic điều khiển đơn giản hơn.
Thứ hai, kích thước có thể nhỏ. Bộ xử lý đơn dụng không yêu cầu bộ nhớ chương
trình. Ngoài ra, vì nó không cần hỗ trợ một tập lệnh lớn nên nó có thể có bộ điều khiển và
đường dẫn dữ liệu đơn giản hơn.
2. Bộ xử lý đa dụng
2.1. Khái niệm và đặc trưng
Bộ xử lý đa dụng (General-purpose processor) là bộ xử lý có khả năng thực thi nhiều
phép toán khác nhau dưới sự chỉ dẫn của một phần mềm. Nói cách khác, gọi là “đa dụng”
bởi lẽ nó không được thiết kế để phục vụ chuyên biệt cho bất kỳ một mục đích nào như
GPUs (bộ xử lý những tác vụ liên quan đến đồ hoạ), FTUs (mạch dùng để thực hiện các
phép toán dấu phẩy động), DSPs (Thiết bị xử lý tín hiệu số).
Bộ xử lý đa dụng có 3 đặc trưng chính sau:
- Hiệu năng cao
̣- Chi phí bất thường (NRE) thấp
- Có tính linh hoạt

2
2.2. Các ví dụ
CPU trong PC chính là một ví dụ điển hình cho Bộ xử lý đa dụng. Là “đa dụng” vì nó
được thiết kế khá tốt ở hầu hết các tác vụ mà bạn muốn một bộ xử lý thực hiện - bao gồm
dự đoán nhánh (branch prediction) để làm cho các điều kiện nhanh hơn và phân lớp bộ nhớ
đệm để giúp truy cập bộ nhớ tốc độ cao hơn.

Có nhiều loại CPU khác nhau đến từ nhiều nhà sản xuất trên toàn thế giới. Những
khía cạnh có thể so sánh chúng với nhau là: tốc độ xung, ngoại vi, chiều rộng bộ nhớ,
nguồn, giá thành.

3
Nguồn: Tổng hợp từ các trang web chính thống của Intel, Motorola, MIPS, ARM, TI, và
IBM.

3. Bộ xử lý chuyên dụng
3.1. Khái niệm và đặc trưng
Bộ xử lý chuyên dụng(dedicated processors) là toàn bộ bộ xử lý được sử dụng riêng
bởi phân vùng mà chúng được chỉ định. Bộ xử lý chuyên dụng xử lý việc cho một phân
vùng logic cụ thể.
Nếu bạn chọn gán bộ xử lý chuyên dụng cho một phân vùng logic, bạn phải gán ít
nhất một bộ xử lý cho phân vùng đó. Tương tự như vậy, nếu bạn chọn xóa tài nguyên bộ
xử lý khỏi phân vùng chuyên dụng, bạn phải xóa ít nhất một bộ xử lý khỏi phân vùng.
Để điều chỉnh theo khối lượng công việc thay đổi, bạn có thể di chuyển các bộ xử lý
chuyên dụng trong các giá trị tối thiểu/tối đa mà bạn thiết lập mà không cần khởi động lại
phân vùng. Các giá trị này cho phép bạn thiết lập một phạm vi trong đó bạn có thể tự động
di chuyển tài nguyên mà không cần khởi động lại phân vùng logic. Khi bạn thay đổi các
giá trị tối thiểu, tối đa, nó yêu cầu bạn khởi động lại phân vùng. Giá trị tối thiểu quyết định
những gì cần thiết để khởi động lại phân vùng. Nếu giá trị tối thiểu không được đáp ứng
cho tất cả các phân vùng logic, chỉ giá trị chính sẽ khởi động lại.

4
Hình trên là một máy chủ có bốn bộ xử lý vật lý có thể có ba phân vùng logic, với
hai phân vùng có một bộ xử lý chuyên dụng và một phân vùng có hai bộ xử lý chuyên dụng.
3.2.Ưu và nhược điểm
Ưu điểm
Tính riêng tư: Thông qua các đơn vị CPU này, người dùng có thể sử dụng riêng Core
của CPU. Họ không cần phải chia sẻ sức mạnh của bộ xử lý để chạy bất kỳ chức năng nào
khác cho bất kỳ thiết bị nào khác. Trên thực tế, các CPU chuyên dụng sẽ chạy trên lõi
chuyên dụng của riêng chúng.
Quyền kiểm soát tối đa: Vì đơn vị CPU là dành riêng cho người dùng nên nó làm trơn
tru các hoạt động bằng cách cung cấp cho người dùng toàn quyền kiểm soát.
Bảo mật và sao lưu: Do việc sử dụng các thiết bị này cực kỳ hạn chế nên các hệ thống
này cung cấp khả năng bảo mật cấp cao và giảm rủi ro vi phạm dữ liệu. Nếu dùng chung
bộ xử lý, lõi và bộ xử lý sẽ được chia sẻ bởi nhiều người dùng dưới một máy chủ cụ thể.
Việc sử dụng chung này có thể dẫn đến nguy cơ đe dọa bảo mật cao hơn và tốc độ xử lý rất
chậm. Bằng cách sử dụng bộ xử lý chuyên dụng, những vấn đề này không xảy ra vì mỗi
người có máy và bộ xử lý chuyên dụng để thực hiện các hoạt động. Thông qua các bộ xử
lý này, người dùng có được các tính năng xử lý nhanh và sao lưu dữ liệu.
Nhược điểm:
Khó sửa chữa: Nếu bộ xử lý chuyên dụng bị hỏng, điều này sẽ tốn nhiều thời gian để
sửa chữa. Nếu ổ cứng bị hỏng và nếu người dùng không thiết lập sao lưu ngoại vi thích
hợp, dữ liệu sẽ bị mất.
Tốn chi phí: Do các máy có các bộ xử lý chuyên dụng riêng biệt nên cần các nguồn
tài nguyên riêng biệt, dẫn đến giá thành cao để lắp đặt.
4. UART, SPI, I2C, LAN
4.1. UART (Universal Asynchronous Receiver /Transmitter)
UART là một ᴠi mạᴄh ѕẵn ᴄó trong một ᴠi điều khiển nhưng không giống như một
giao thứᴄ truуền thông (I2C & SPI). Chứᴄ năng ᴄhính ᴄủa UART là truуền nhận dữ liệu
nối tiếp bất đồng bộ. Trong UART, giao tiếp giữa hai thiết bị ᴄó thể đượᴄ thựᴄ hiện theo
hai ᴄáᴄh là giao tiếp dữ liệu nối tiếp ᴠà giao tiếp dữ liệu ѕong ѕong.
5
Sơ đồ giao tiếp

Trong giao tiếp UART, hai UART giao tiếp trực tiếp với nhau. UART truyền chuyển
đổi dữ liệu song song từ một thiết bị điều khiển như CPU thành dạng nối tiếp, truyền nó
nối tiếp đến UART nhận bằng cách nối chân Tx(truyền) của UART truyền tới chân
Rx(nhận) của UART nhân, sau đó chuyển đổi dữ liệu nối tiếp trở lại thành dữ liệu song
song cho thiết bị nhận.
Trong UART, việc truyền dữ liệu từ Tx UART sang Rx UART có thể được thực hiện
không đồng bộ ,có nghĩa là không có tín hiệu đồng hồ để đồng bộ hóa đầu ra của các bit từ
UART truyền đến việc lấy mẫu các bit bởi UART nhận. Thay vì tín hiệu đồng hồ, UART
truyền thêm các bit start và stop vào gói dữ liệu được chuyển. Các bit này xác định điểm
bắt đầu và điểm kết thúc của gói dữ liệu để UART nhận biết khi nào bắt đầu đọc các bit.
UART truуền dữ liệu nối tiếp, theo một trong ba ᴄhế độ:
- Full dupleх: Giao tiếp đồng thời đến ᴠà đi từ mỗi maѕter ᴠà ѕlaᴠe
- Half dupleх: Dữ liệu đi theo một hướng tại một thời điểm
- Simpleх: Chỉ giao tiếp một ᴄhiều
Khung truyền dữ liệu

6
Dữ liệu truуền qua UART đượᴄ tổ ᴄhứᴄ thành ᴄáᴄ gói. Mỗi gói ᴄhứa 1 bit bắt đầu, 5
đến 9 bit dữ liệu (tùу thuộᴄ ᴠào UART), một bit ᴄhẵn lẻ tùу ᴄhọn ᴠà 1 hoặᴄ 2 bit dừng.
Bit bắt đầu còn được gọi là bit đồng bộ hoá được đặt trước dữ liệu để bắt đầu gói dữ
liệu. Đường truyền dữ liệu UART thường được giữ ở mức điện áp cao khi nó không truyền
dữ liệu. Để bắt đầu truуền dữ liệu, truуền UART kéo đường dữ liệu từ mứᴄ điện áp ᴄao (1)
хuống mứᴄ điện áp thấp (0). UART thu đượᴄ thông báo ѕự ᴄhuуển đổi nàу từ mứᴄ ᴄao ѕang
mứᴄ thấp qua đường dữ liệu ᴄũng như bắt đầu hiểu dữ liệu thựᴄ, nó bắt đầu đọc các bit
trong khung dữ liệu ở tần số của tốc độ truyền.
Khung dữ liệu ᴄhứa dữ liệu thựᴄ tế đang đượᴄ truyền. Nó ᴄó thể dài từ 5 bit đến 8 bit
nếu ѕử dụng bit ᴄhẵn lẻ. Nếu không ѕử dụng bit ᴄhẵn lẻ, khung dữ liệu ᴄó thể dài 9 bit. Nói
ᴄhung, LSB ᴄủa dữ liệu đượᴄ truуền trướᴄ tiên ѕau đó nó rất hữu íᴄh ᴄho ᴠiệᴄ truуền.
Bit ᴄhẵn lẻ là một ᴄáᴄh để UART nhận ᴄho biết liệu ᴄó bất kỳ dữ liệu nào đã thaу đổi
trong quá trình truуền haу không. Sau khi UART nhận đọᴄ khung dữ liệu, nó ѕẽ đếm ѕố bit
ᴄó giá trị là 1 ᴠà kiểm tra хem tổng ѕố là ѕố ᴄhẵn haу lẻ. Nếu bit ᴄhẵn lẻ là 0, thì tổng ᴄáᴄ
bit 1 trong khung dữ liệu phải là một ѕố ᴄhẵn. Nếu bit ᴄhẵn lẻ là 1, ᴄáᴄ bit 1 trong khung
dữ liệu ѕẽ tổng thành một ѕố lẻ. Khi bit ᴄhẵn lẻ khớp ᴠới dữ liệu, UART ѕẽ biết rằng quá
trình truуền không ᴄó lỗi. Nhưng nếu bit ᴄhẵn lẻ là 0 ᴠà tổng là ѕố lẻ; hoặᴄ bit ᴄhẵn lẻ là 1
ᴠà tổng ѕố là ᴄhẵn, UART ѕẽ biết rằng ᴄáᴄ bit trong khung dữ liệu đã thaу đổi.
Để báo hiệu ѕự kết thúᴄ ᴄủa gói dữ liệu, UART gửi ѕẽ điều khiển đường truуền dữ
liệu từ điện áp thấp đến điện áp ᴄao trong ít nhất khoảng 2 bit.
Ứng dụng

7
UART thường đượᴄ ѕử dụng trong ᴄáᴄ bộ ᴠi điều khiển ᴄho ᴄáᴄ уêu ᴄầu ᴄhính хáᴄ ᴠà
ᴄhúng ᴄũng ᴄó ѕẵn trong ᴄáᴄ thiết bị liên lạᴄ kháᴄ nhau như giao tiếp không dâу, thiết bị
GPS, mô-đun Bluetooth ᴠà nhiều ứng dụng kháᴄ.
Cáᴄ tiêu ᴄhuẩn truуền thông như RS422 & TIA đượᴄ ѕử dụng trong UART ngoại trừ
RS232. Thông thường, UART là một IC riêng đượᴄ ѕử dụng trong giao tiếp nối tiếp UART.
Ưu điểm
- Chỉ sử dụng hai dây để truyền dữ liệu
- Không cần tín hiệu đồng hồ
- Có một bit chẵn lẻ để cho phép kiểm tra lỗi
- Cấu trúc của gói dữ liệu có thể được thay đổi miễn là cả hai bên được thiết lập cho

- Phương pháp truyền đơn giản, giá thành thấp
Nhược điểm
- Kích thước của khung dữ liệu được giới hạn tối đa là 9 bit
- Không phù hợp với các hệ thống đòi hỏi nhiều thiết bị chủ và tớ
- Tốc độ truyền của mỗi UART phải nằm trong khoảng 10%
4.2. SPI (Serial Peripheral Interface)
SPI (Serial Peripheral Interface) là một chuẩn truyền thông nối tiếp đồng bộ để truyền
dữ liệu ở chế độ song công toàn phần (full-duplex) tức là trong cùng một thời điểm có thể
xảy ra đồng thời quá trình truyền và nhận, do công ty Motorola thiết kế nhằm đảm bảo sự
liên hợp giữa các vi điều khiển và thiết bị ngoại vi một cách đơn giản và giá rẻ.
Sơ đồ kết nối

8
Các thiết bị giao tiếp qua SPI có quan hệ master - slave. Master là thiết bị điều khiển
(thường là vi điều khiển), còn slave (thường là cảm biến, màn hình hoặc chip nhớ) nhận
lệnh từ master. Cấu hình đơn giản nhất của SPI là hệ thống một slave, một master duy nhất,
nhưng một master có thể điều khiển nhiều hơn một slave.
- MOSI (đầu ra master / đầu vào slave) - đường truyền cho master gửi dữ liệu đến
slave.
- MISO (đầu vào master / đầu ra slave) - đường cho slave gửi dữ liệu đến master.
- SCLK (clock) - đường cho tín hiệu xung nhịp.
- SS / CS (Slave Select / Chip Select) - đường cho master chọn slave nào để gởi tín
hiệu.
Khung truyền dữ liệu

Mỗi chip Master hay Slave đều có một thanh ghi dữ liệu 8 bits.

9
Quá trình truyền nhận giữa Master và Slave xảy ra đồng thời sau 8 chu kỳ đồng hồ,
một byte dữ liệu được truyền theo cả 2 hướng. Quá trình trao đổi dữ liệu bắt đầu khi Master
tạo 1 xung clock từ bộ tạo xung nhịp (Clock Generator) và kéo đường SS của Slave mà nó
truyền dữ liệu xuống mức Low.
Cứ 1 xung clock, Master sẽ gửi đi 1 bit từ thanh ghi dịch (Shift Register) của nó đến
thanh ghi dịch của Slave thông qua đường MOSI. Đồng thời Slave cũng gửi lại 1 bit đến
cho Master qua đường MISO.Như vậy sau 8 chu kỳ clock thì hoàn tất việc truyền và nhận
1 byte dữ liệu. Dữ liệu của 2 thanh ghi được trao đổi với nhau nên tốc độ trao đổi diễn ra
nhanh và hiệu quả.
Lưu ý: Trong giao tiếp SPI, chỉ có thể có 1 Master nhưng có thể 1 hoặc nhiều Slave
cùng lúc. Ở trạng thái nghỉ, chân SS của các Slave ở mức 1, muốn giao tiếp với Slave nào
thì ta chỉ việc kéo chân SS của Slave đó xuống mức 0.
Ứng dụng
Giao thức SPI được tích hợp trong một số loại thiết bị như:
- Các bộ chuyển đổi (ADC và DAC)
- Các loại bộ nhớ (SD Card , MMC , EEPROM , Flash)
- Các loại IC thời gian thực
- Các loại cảm biến (nhiệt độ, áp suất…) và một số loại khác như: bộ trộn tín hiệu,
LCD, Graphic LCD, video game controller,…
Ưu điểm
- Không có bit bắt đầu và dừng, vì vậy dữ liệu có thể được truyền liên tục mà không
bị gián đoạn
- Không có hệ thống định địa chỉ slave phức tạp như I2C
- Tốc độ truyền dữ liệu cao hơn I2C (nhanh gần gấp đôi)
- Các đường MISO và MOSI riêng biệt, vì vậy dữ liệu có thể được gửi và nhận cùng
một lúc
Nhược điểm
- Sử dụng bốn dây (I2C và UART sử dụng hai)
- Không xác nhận dữ liệu đã được nhận thành công (I2C có điều này)

10
- Không có hình thức kiểm tra lỗi như bit chẵn lẻ trong UART
- Chỉ cho phép một master duy nhất
4.3. I2C (Inter – Integrated Circuit)
I2C là một giao thức truyền thông nối tiếp bất đồng bộ được phát triển bởi Philips
Semiconductors để truyền nhận dữ liệu giữa một bộ xử lý trung tâm với nhiều IC trên cùng
một board mạch chỉ sử dụng hai đường truyền tín hiệu.
Sơ đồ kết nối

I2C sử dụng 2 đường truyền tín hiệu:


- SCL - Serial Clock Line : Tạo xung nhịp đồng hồ do Master phát đi
- SDA - Serial Data Line : Đường truyền nhận dữ liệu.
Giao tiếp I2C bao gồm quá trình truyền nhận dữ liệu giữa các thiết bị chủ tớ, hay
Master - Slave. Thiết bị Master là 1 vi điều khiển, nó có nhiệm vụ điều khiển đường tín
hiệu SCL và gửi nhận dữ liệu hay lệnh thông qua đường SDA đến các thiết bị khác. Các
thiết bị nhận các dữ liệu lệnh và tín hiệu từ thiết bị Master được gọi là các thiết bị Slave.
Các thiết bị Slave thường là các IC, hoặc thậm chí là vi điều khiển.
Cả hai đường bus I2C (SDA, SCL) đều hoạt động như các bộ lái cực máng hở (open
drain). Nó có nghĩa là bất kỳ thiết bị / IC trên mạng I2C có thể lái SDA và SCL xuống mức
thấp, nhưng không thể lái chúng lên mức cao. Vì vậy, một điện trở kéo lên (khoảng 1 kΩ
đến 4,7 kΩ) được sử dụng cho mỗi đường bus, để giữ cho chúng ở mức cao (ở điện áp
dương) theo mặc định.
Khung truyền dữ liệu

11
Với I2C, dữ liệu được truyền trong các tin nhắn. Tin nhắn được chia thành các khung
dữ liệu. Mỗi tin nhắn có một khung địa chỉ chứa địa chỉ nhị phân của địa chỉ slave và một
hoặc nhiều khung dữ liệu chứa dữ liệu đang được truyền. Thông điệp cũng bao gồm điều
kiện khởi động và điều kiện dừng, các bit đọc / ghi và các bit ACK / NACK giữa mỗi khung
dữ liệu:
Điều kiện bắt đầu và điều kiện kết thúc (START, STOP)
Giao tiếp I2C được khởi tạo bằng cách master thực hiện điều kiện bắt đầu và kết thúc
bằng cách master thực hiện điều kiện kết thúc. Một sự chuyển đổi logic từ mức HIGH sang
mức LOW trên đường truyền SDA trong khi đường truyền SCL ở mức HIGH được định
nghĩa là một điều kiện bắt đầu. Một sự chuyển đổi mức logic từ mức LOW sang mức HIGH
trên đường truyền SDA trong khi đường SCL ở mức HIGH được định nghĩa là điều kiện
kết thúc.
Các bit địa chỉ
Các bit địa chỉ giúp xác định, phân biệt các slave khác nhau trên hệ thống bus I2C,
các master phải có/ được cài đặt các địa chỉ khác nhau. Thông thường có 7 bit địa chỉ.
Bit cấu hình đọc/ghi dữ liệu (R/W)
Bit này xác định hướng truyền dữ liệu hay có thể hiểu là thiết bị nào sẽ điều khiển
đường SDA: Nếu Master cần truyền dữ liệu đến Slave, bit Read / Write được thiết lập mức
logic LOW. Ngược lại, nếu Master cần nhận dữ liệu từ Slave, bit này được thiết lập mức
logic HIGH.
Bit xác nhận (ACK/NACK)
Mỗi byte dữ liệu đều được xác nhận bởi một bit ACK từ phía nhận dữ liệu gửi cho
phía gửi dữ liệu để báo rằng byte đã được nhận thành công và có thể tiếp tục gửi byte dữ

12
liệu tiếp theo. Bit ACK có giá trị LOW. Khi nó có giá trị HIGH thì được gọi là bit NACK,
bit NACK được gửi đi trong một số trường hợp như: phía nhận đang bận và không thể nhận
hay truyền dữ liệu, dữ liệu/địa chỉ không hợp lệ, không tồn tại, phía nhận không thể nhận
thêm các byte dữ liệu nữa, master đã nhận đủ và không nhận thêm dữ liệu.
Các bit dữ liệu
Dữ liệu được truyền tới các thiết bị slave hoặc được đọc từ các thiết bị slave, bản chất
của việc này chính là thực hiện đọc/ghi các thanh ghi trong thiết bị slave. Các thanh ghi này
nằm trong bộ nhớ của slave và được xác định, phân biệt bởi các địa chỉ, các thanh ghi sẽ
chứa thông tin, có thể là thông tin cấu hình hoạt động của thiết bị slave, có thể thông tin dữ
liệu mà slave có được trong quá trình hoạt động như dữ liệu lấy mẫu từ cảm biến.
Ứng dụng
Do tính đơn giản của nó nên loại giao thức này được sử dụng rộng rãi cho giao tiếp
giữa vi điều khiển và mảng cảm biến, các thiết bị hiển thị, thiết bị IoT, EEPROMs, v.v
Ưu điểm
- Chỉ sử dụng hai dây
- Hỗ trợ nhiều master và nhiều slave
- Bit ACK / NACK xác nhận mỗi khung được chuyển thành công
- Phần cứng ít phức tạp hơn so với UART
- Giao thức nổi tiếng và được sử dụng rộng rãi
Nhược điểm
- Tốc độ truyền dữ liệu chậm hơn SPI
- Kích thước của khung dữ liệu bị giới hạn ở 8 bit
- Cần phần cứng phức tạp hơn để triển khai so với SPI
4.4. LAN (Local Area Network)
LAN là mạng máy tính nội bộ, giao tiếp này cho phép các máy tính kết nối với nhau
để cùng làm việc và chia sẻ dữ liệu. Kết nối này được thực hiện thông qua sợi cáp LAN
hoặc Wifi (không dây) trong không gian hẹp, chính vì thế nó chỉ có thể sử dụng được trong
một phạm vi giới hạn như phòng làm việc, trong nhà, trường học
Sơ đồ kết nối

13
Các thiết bị trong cùng mạng LAN có thể kết nối với nhau thông qua sợi cáp mạng.
Các mạng LAN có thể kết nối với nhau tạo thành một mạng lưới rộng lớn hơn được gọi là
WAN (Wide Area Network) và để giao tiếp với nhau, các thiết bị thường được kết nối với
một hoặc vài bộ phát wifi (Router).
Ngoài ra, mạng LAN còn có thể được thiết lập bằng cổng kết nối không dây (Wireless)
và được gọi chung là WLAN (Wireless LAN), hay chúng ta thường gọi là Wifi.
Các kiểu (Topology) của mạng LAN
Các kiểu của mạng LAN là cấu trúc, cách bố trí và liên kết các phần tử trong hệ thống
mạng đó. Có khá nhiều kiểu bố trí và dưới đây là một số kiểu mô hình phổ biến:
Mạng hình sao (star topology): bao gồm một máy chủ làm trung tâm và các máy trạm
(client) hoặc các thiết bị khác là nút thông tin của hệ thống mạng.

14
Mạng định tuyến (linear bus topology): là mô hình LAN mà các máy tính được ghép
nối với nhau trên một đường trục dây cáp chính, hai đầu dây được bịt lại bởi thiết bị
terminator.

Mạng dạng vòng (ring topology): là mô hình mạng cục bộ nơi các thiết bị được bố trí
thành một vòng tròn khép kín. Tín hiệu truyền sẽ chỉ đi theo một chiều cố định

15
Ứng dụng
Mạng LAN thường được sử dụng để kết nối các máy tính với các máy tính ở trong
gia đình, trong một phòng game hoặc một tòa nhà hay cơ quan tổ chức. Cự ly dùng mạng
LAN có thể giới hạn ở trong phạm vi 100m. Những máy tính có cự ly xa sẽ sử dụng mạng
internet để dễ dàng trao đổi thông tin.

16
II. Phần mềm hệ thống nhúng

1. Hệ điều hành nhúng RTOS, Android, Linux


1.1. Hệ điều hành RTOS
RTOS là viết tắt của cụm từ Real-time operating system hay còn gọi là hệ điều hành
thời gian thực thường được nhúng trong các dòng vi điều khiển dùng để điều khiển thiết bị
một cách nhanh chóng và đa nhiệm (multi tasking).
Hệ điều hành thời gian thực (realtime) sinh ra cho các tác vụ cần sự phản hồi nhanh
của hệ thống, thường được nhúng trong các loại vi điều khiển và không có giao diện (GUI)
tương tác với người dùng. Chúng cần phản hồi nhanh bởi vì đa số các tác vụ tương tác với
thiết bị, máy móc khác chứ không phải con người. Các tài nguyên bên trong rất hữu hạn
nên chỉ một sự chậm trễ cũng có thể làm hệ thống làm việc hoàn toàn sai lệch.
1.1.1. Các khái niệm cơ bản trong hệ điều hành RTOS
Kernel: Kernel hay còn gọi là Nhân có nhiệm vụ quản lý và điều phối các Task. Mọi
sự kiện (Event) như ngắt, Timer, data truyền tới… đều qua Kernel xử lý để quyết định xem
nên làm gì tiếp theo.Thời gian xử lý của Kernel thường rất nhanh nên độ trễ rất thấp.
Task: Task là một đoạn chương trình thực thi một hoặc nhiều vấn đề gì đó, được
Kernel quản lý.Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của
task sắp bị hủy và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:
- Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi ngắt
systick)
- Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue,
semaphore,…)
- Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải
chờ cho hết time slice
- Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task.
Task state: Một task trong RTOS thường có các trạng thái như sau

17
Trạng thái RUNNING là trạng thái task đang được thực thi, Task đang ở trạng thái
READY được dispatching chọn thực thi sẽ chuyển sang trạng thái RUNNING. Khi 1 task
đang RUNNING, bị tạm dừng nó sẽ chuyển sang trạng thái READY. Trong hệ thống có 1
CPU, chỉ duy nhất 1 task ở trạng thái RUNNING. Scheduling là hành động xác định task
nào sẽ chuyển từ trạng thái READY sang RUNNING.
Scheduler: Đây là 1 thành phần của kernel quyết định task nào được thực thi. Có một
số luật cho scheduling như:
- Cooperative: giống với lập trình thông thường, mỗi task chỉ có thể thực thi khi task
đang chạy dừng lại, nhược điểm của nó là task này có thể dùng hết tất cả tài nguyên của
CPU
- Round-robin: mỗi task được thực hiện trong thời gian định trước (time slice) và
không có ưu tiên.
- Priority base: Task được phân quyền cao nhất sẽ được thực hiện trước, nếu các task
có cùng quyền như nhau thì sẽ giống với round-robin, các task có mức ưu tiên thấp hơn sẽ
được thực hiện cho đến cuối time slice

18
- Priority-based pre-emptive: Các task có mức ưu tiên cao nhất luôn nhường các task
có mức ưu tiên thấp hơn thực thi trước.
1.1.2. Cơ chế hoạt động và phân loại RTOS
Hoạt động của Scheduler
RTOS chọn task tiếp theo để thực thi theo một quy tắc rất cụ thể. Việc tạo ra hàng đợi
(Queue) để chứa các task đang chờ thực thi theo một quy tắc cụ thể nào đó được gọi là
Scheduling.
Kernel, là lõi của RTOS, cung cấp chức năng scheduler, xử lý việc lập lịch các tác vụ
chờ thực thi. Sau đây là mô tả các thuật toán lập lịch tác vụ thường được sử dụng.
- Đến trước, được phục vụ trước (First Come, First Served (FCFS)) Tác vụ đi vào
trạng thái chờ thực thi trước sẽ được thực hiện trước. Các tác vụ chờ đợi được xếp vào hàng
đợi theo thứ tự và chúng vào trạng thái chờ đợi (WAITING state).
- Dựa trên mức độ ưu tiên (Priority Based) Mỗi task được gán một độ ưu tiên. Task
được thực thi theo thứ tự của độ ưu tiên.
Thuật toán chuyển đổi các tác vụ theo các khoảng thời gian xác định và thực hiện lặp
đi lặp lại chúng lần lượt được gọi là round-robin scheduling.
Có các thuật toán scheduler khác, như thuật toán deadline-driven scheduling (Chỉ định
CPU thực thi task gần tới deadline nhất), và thuật toán shortest processing time first (SPT),
thuật toán sẽ xử lý task có thời gian xử lý ngắn nhất, khi đã biết thời gian xử lý cần thiết
của mỗi task.

19
Phân chia các task (Dividing Tasks)
Phân chia task để xử lý song song
Khi một số xử lý cần được thực thi song song trong một khoản thời gian cụ thể, việc
thực thi phải được chuyển đổi giữa các xử lý với điều kiện chờ hoặc theo các khoảng thời
gian xác định.
Trong trường hợp các quá trình xử lý cần được thực hiện song song, nên chia các cách
xử lý thành các task riêng biệt.
Các xử lý ko cần thực thi song song, không cần chia thành các task, trong ngôn ngữ
C, các xử lý như vậy chỉ cần thực thi thông qua các hàm (function). Điểm quan trọng trong
góc nhìn này là xem xét phân tích xử lý nào cần được thực thi song song.
Trong thực tế, các xử lý trong một task có chung độ ưu tiên cũng đóng vai trò kim chỉ
nam cho phân chia task.
Phân chia task để xử lý dựa trên mức độ ưu tiên
Quá trình khi một task đang thực thi, có 1 task khác cần được thực hiện ngay và phải
tạm dừng quá trình xử lý task trước đó gọi là preempted.
Như phần mô tả về scheduling trước, các task với cùng độ ưu tiên sẽ được chuyển đổi
theo cách FCFS, các task vụ cần thiết có thể không được thực thi trước. Khi một task cần

20
preempted, trong khi có 1 task khác cùng độ ưu tiên đang thực thi, task đó sẽ không được
thực thi cho đến khi task hiện tại vào trạng thái WAITING. Nói cách khác, quá trình xử lý
ưu tiên nên được đặt ở task riêng biệt, và gán mức độ ưu tiên tương ứng.
Các mức ưu tiên khác nhau cần được gán cho nhiều xử lý, chúng nên được chia thành
các task riêng biệt. Nói chung, mức độ ưu tiên cao nhất được chỉ định cho các xử lý khẩn
cấp để xử lý các lỗi hệ thống và các quá trình xử lý sẽ ảnh hưởng đến hoạt động real time.
Mức độ ưu tiên thấp được chỉ định cho quá trình xử lý chỉ cần được thực thi trong
khoảng thời gian không có tương tác người dùng, chẳng hạn như xử lý log, bảo trì hệ thống.
Hệ điều hành RTOS thường được chia thành ba loại chính
- Hard RTOS (Tạm dịch: Hệ điều hành thời gian thực cứng): Các hệ điều hành này sẽ
luôn đảm bảo các tác vụ được hoàn thành trong một khoảng thời gian cố định, xác định cụ
thể, không có sự sai sót.
- Soft RTOS (Tạm dịch: Hệ điều hành thời gian thực mềm) : Đây là các hệ điều hành
với thời gian thực hiện tác vụ có thể nhận được một số nới lỏng trong phạm vi cho phép,
chỉ cần hoàn thành đúng thời gian quy định.
- Firm RTOS (Tạm dịch: Hệ điều hành thời gian thực bền vững) : Hệ điều hành cũng
có các giới hạn thời gian được xác định cụ thể với mức độ chính xác cao nhất, Firm RTOS
cũng đảm bảo các tác vụ luôn được thực hiện thành công ngay cả trong trường hợp quá thời
hạn quy định.
1.1.3. Các chức năng của RTOS
Task Management: Quản lý tác vụ, điều khiển các trạng thái task
Ví dụ: Kích hoạt hoặc dừng một task
Task Dependent Synchronization: Đồng bộ hóa phụ thuộc vào tác vụ, điều khiển
trạng thái task để đồng bộ các task.
Ví dụ: Waking up một tác vụ hoặc đợi một tác khác wakeup.
Synchronization and Communication: Đồng bộ hóa và Giao tiếp, các cơ chế đợi và
giao tiếp.
Ví dụ:

21
Semaphore: Cơ chế đợi giữa các task, được sử dụng để đợi trong chia sẻ tài nguyên
giữa các task (Các biến dùng chung giữa các task,...)
Event Flag: Cơ chế đợi giữa các task, được sử dụng để thông báo kết thúc 1 quá trình
xử lý.
Mailbox: Cơ chế trao đổi dữ liệu và đợi giữa các task, sử dụng trong truyền nhận dữ
liệu giữa các task.
Memory Pool: Phân bổ và giải phóng bộ nhớ theo yêu cầu của các task.
Ngoài các tính năng trên, OS còn có data queue, message buffer, mutex, rendezvous,
task exception handling, time management, interrupt management, system state
management, service call management, and system configuration management functions.
các chức năng này được sử dụng bằng cánh gọi các service call, có tổng cộng 165 service
call được cung cấp trong phiên bản 4 của μITRON
1.2. Hệ điều hành Android
1.2.1. Lịch sử ra đời
Android là một hệ điều hành dựa trên nền tảng Linux, sử dụng mã nguồn mở, được
Google phát hành mã nguồn theo giấy phép Apache. Hệ điều hành Android được thiết kế
chủ yếu cho các thiết bị di động có màn hình cảm ứng như điện thoại thông minh và máy
tính bảng và áp dụng trên cả TV, máy chơi game, đồng hồ, tai nghe, các thiết bị thông minh
khác. Biểu trưng của hệ điều hành Android mới là một con robot màu xanh lá cây do hãng
thiết kế Irina Blok tại California vẽ.
Vào tháng 10 năm 2003, Andy Rubin (đồng sáng lập công ty Danger), Rich Miner
(đồng sáng lập Tổng công ty Viễn thông Wildfire), Nick Sears (từng là Phó giám đốc T-
Mobile) và Chris White (trưởng thiết kế và giao diện tại WebTV) cùng nhau thành lập lên
Android, Inc và hai năm sau đó đã bị Google mua lại, biến nó thành một bộ phận trực thuộc
Google.
Ở Google, nhóm do Rubin đứng đầu đã phát triển một nền tảng thiết bị di động phát
triển trên nền nhân Linux, đến tháng 11 năm 2007 thì phiên bản Android đầu tiên được ra
mắt nhưng cho đến ngày 22 tháng 10 năm 2008 thì chiếc điện thoại chạy Android đầu tiên
là HTC Dream mới được bán ra. Và kể từ đó, trải qua rất nhiều bản cập nhật vá lỗi và tăng

22
cường thêm các tính năng thì hiện tại, phiên bản Android mới nhất à Android 11 được phát
hành vào tháng 9 năm 2020.
1.2.2. Kiến trúc và giao diện của Android
Android là một hệ điều hành và là một tập hợp các thành phần phần mềm được chia
thành năm phần là
- Linux kernel
- Libraries
- Android runtime
- Application Framework
- Applications
Giao diện:
Giao diện người dùng của Android dựa trên nguyên tắc tác động trực tiếp, sử dụng
cảm ứng chạm điện dung đa điểm, tương tự như những động tác ngoài đời thực như vuốt,
chạm, kéo giãn và thu lại để xử lý các đối tượng trên màn hình. Sự phản hồi từ hệ thống
thiết bị với các tác động của người dùng gần như ngay lập tức, nhằm tạo ra giao diện cảm
ứng mượt mà.
Các thiết bị Android sau khi khởi động sẽ hiển thị màn hình chính, gồm nhiều biểu
tượng (icon) và tiện ích (widget). Màn hình chính có thể gồm nhiều trang xem được bằng
cách vuốt ra trước hoặc sau. Biểu tượng ứng dụng khi mở sẽ chiếm toàn bộ màn hình và
hiển thị các thông tin chức năng cho người dùng sử dụng. Còn tiện ích hiển thị hình nhỏ
ngay trên màn hình những nội dung sống động, cập nhật tự động như dự báo thời tiết, hộp
thư của người dùng, hoặc những mẩu tin tức ngay trên màn hình chính.Giao diện màn hình
chính của Android có thể tùy chỉnh ở mức cao, cho phép người dùng tự do sắp đặt hình
dáng cũng như hành vi của thiết bị theo sở thích. Những ứng dụng do các hãng thứ ba có
trên Google Play và các kho ứng dụng khác còn cho phép người dùng thay đổi "chủ đề"
của màn hình chính, thậm chí bắt chước hình dáng của hệ điều hành khác như Windows
Phone hoặc iOS.

23
1.2.3 Ưu nhược điểm của hệ điều hành Android
Ưu điểm:
- Chợ ứng dụng Android: Có hàng triệu ứng dụng miễn phí mà bạn có thể cài đặt trên
điện thoại Android của mình trên Google Play.. Khi ứng dụng của Android gặp sự cố, người
dùng có thể dễ dàng tìm kiếm mã lỗi trực tuyến và nhận được giải thích về cách khắc phục.
- Mẫu mã điện thoại đa dạng: Android có nhiều sự lựa chọn về các thương hiệu
smartphone khác nhau, từ cao cấp đến bình dân bạn đều có thể chọn mua từ các hãng như
Samsung, HTC, Oppo, LG, Lenovo,...
- Có thể mở rộng bộ nhớ bằng thẻ nhớ: Với các thiết bị của Apple, bạn chỉ có thể sử
dụng bộ nhớ trong có sẵn của máy. Còn với phần lớn các thiết bị Android, bạn sẽ có lựa
chọn mở rộng bộ nhớ có sẵn với các loại thẻ nhớ dung lượng cao.

24
- Thân thiện với Google: Vì Android là hệ điều hành do Google sản xuất nên hầu như
tất cả các điện thoại thông minh chạy hệ điều hành Android đều được tích hợp các dịch vụ
phổ biến nhất của Google như Gmail, Google Drive, Hangouts...
Nhược điểm:
- Dễ dính virus: Hệ thống mở của Android dễ bị vi-rút tấn công hơn iPhone. Với
Android, bạn có thể tải xuống ứng dụng trên nhiều trang web, một số trang web được tạo
ra bởi tội phạm mạng muốn phát tán phần mềm độc hại. Apple chỉ cho phép bạn tải xuống
các ứng dụng từ App Store của họ, vốn được kiểm soát chặt chẽ bởi bảo mật và các hacker
sẽ khó xâm nhập hơn nhiều.
- Nhiều ứng dụng chạy ngầm làm chậm máy: So với iOS, Android tối ưu hóa bộ nhớ
RAM có phần kém hơn, dẫn đến việc nhiều ứng dụng chạy ngầm gây chậm máy hoặc thậm
chí là đơ máy.
- Ứng dụng bị giới hạn bởi hệ điều hành: Mặc dù có rất nhiều ứng dụng có sẵn cho
người dùng Android, nhưng không phải điện thoại nào cũng cài đặt được vì các ứng dụng
đòi hỏi phiên bản Android mới hơn nhưng lại không được nâng cấp.
1.3. Hệ điều hành Linux
1.3.1 Tổng quan
Định nghĩa
Linux vừa là tên gọi vừa là tên hạt nhân phát triển của hệ điều hành này, đang được
rất nhiều người ưu tiên sử dụng. Bởi đây là hệ điều hành miễn phí và đại diện điển hình cho
việc phát triển mã nguồn mở phổ biến gần đây.
Hệ điều hành Linux được viết ra vào năm 1991 bởi ông Linus Torvalds. Khi đó, ông
là sinh viên đại học. Trải qua 3 năm làm việc hăng say không biết mệt mỏi, ông đã cho ra
đời phiên bản 1.0 vào năm 1994. Phần mềm miễn phí và sử dụng tương thích với nhiều
thiết bị và dưới bản quyền GNU General Public License nên bất cứ ai cũng có thể tải và
xem mã nguồn Linux. Ban đầu, hệ điều hành Linux được phát triển và được sử dụng nhiều
cho dòng vi xử lý 386, hiện tại hệ điều hành này được sử dụng trong nhiều ứng dụng khác
nhau từ máy tính cá nhân cho tới các siêu máy tính và các thiết bị di động.
Cấu trúc hệ điều hành Linux

25
- Kernel: Hay được gọi là phần Nhân vì đây là phần quan trọng nhất trong máy tính
bởi chứa đựng các module hay các thư viện để quản lý, giao tiếp giữa phần cứng máy tính
và các ứng dụng.
- Shell: Shell là phần có chức năng thực thi các lệnh (command) từ người dùng hoặc
từ các ứng dụng yêu cầu, chuyển đến cho Kernel xử lý. Shell chính là cầu nối để kết nối
Kernel và Application, phiên dịch các lệnh từ Application gửi đến Kernel để thực thi. Có
các loại Shell như sau: sh (the Bourne Shell), bash(Bourne-again shell), csh (C shell), ash
(Almquist shell), tsh (TENEX C shell), zsh (Z shell).
- Application: Đây là phần quen thuộc với chúng ta nhất, phần để người dùng cài đặt
ứng dụng, chạy ứng dụng để người dùng có thể phục vụ cho nhu cầu của mình.
- Công dụng của hệ điều hành Linux
Tương tự như các hệ điều hành khác, Linux cung cấp môi trường trung gian để người
dùng có thể giao tiếp với phần cứng máy tính, thực hiện các công việc của mình. Bên cạnh
đó, nhờ ứng dụng mã nguồn mở mà Linux đem lại nhiều sự thoải mái hơn cho người dùng,
đặc biệt các lập trình viên, nhà phát triển.
1.3.2. Ưu, nhược điểm của hệ điều hành Linux
Ưu điểm
- Bản quyền và chi phí: Linux được phát triển "free" cho người sử dụng và dựa trên
nền tảng mã nguồn mở - open source trong khi Windows bản quyền và bộ Office bản quyền
sẽ phải mất khoảng vài triệu để sở hữu. Vì lý do đó mà tỷ lệ dùng lậu Windows ở Việt Nam
luôn ở mức cao. Và đương nhiên việc dùng lậu thì sẽ đi kèm những bất tiện của nó chưa kể
vấn đề về nguyên tắc làm việc. Sử dụng Linux bạn sẽ được sử dụng miễn phí tất cả các tính
năng kèm bộ ứng dụng văn phòng miễn phí mà không phải lo lắng gì về vấn đề bản quyền.
- Bảo mật: Như đã nói ở trên, viếc phát tán virus qua Windows là không thể tránh
khỏi và nó lây lan rất nhanh trong khi dùng Linux bạn chỉ việc nhấn xóa mỗi lần thấy 1 con
virus nào đó xuất hiện là xong.
- Linh hoạt: Đối với Linux, nếu bạn có hiểu biết về nó nhiều một chút thì có thể tự
thực hiện các tùy chỉnh theo ý mình. Tuy nhiên, điều này không xảy ra với Windows, bạn
sẽ cần phải được Windows thông qua mỗi lần muốn chỉnh sửa gì đó. Ngoài ra, nền tảng

26
này cũng tương thích với rất nhiều các môi trường khác nhau, do đó, rất lý tưởng cho các
lập trình viên và developer.
- Chạy ổn định cả trên các máy tính cấu hình yếu: Một phiền toái mà hẳn người dùng
Windows nào cũng thấy quen thuộc đó là cứ mỗi khi Windows ra mắt một bản nâng cấp
thì người dùng cũng phải nâng cấp cấu hình theo nếu máy không đáp ứng được phiên bản
mới đó. Và nếu không nâng cấp thì chỉ có thể mãi mãi dùng phiên bản cũ mà thôi và rất
nhanh sẽ bị Windows cho vào quên lãng. Việc vẫn chạy mượt mà, độ ổn định cao trên các
máy có cấu hình thấp và được nâng cấp, hỗ trợ thường xuyên từ nhà phát hành có lẽ là một
ưu điểm được người ưa chuộng Linux đánh giá cao hơn Windows.
Nhược điểm
- Các nhà phát triển phần mềm vẫn chưa để tâm đến hệ điều hành tiềm năng này nên
số lượng phần mềm được hỗ trợ vẫn còn hạn chế.
- Một số nhà sản xuất không phát triển driver hỗ trợ nền tảng Linux.
- Mất thời gian để làm quen, đặc biệt là khi chuyển từ Windows sang sử dụng Linux
thì sẽ cần thời gian để thích nghi từ đầu.
1.3.3. Các phiên bản của hệ điều hành Linux hiện nay
Ubuntu: Phiên bản Ubuntu là phiên bản được sử dụng nhiều nhất hiện nay. Được
nhiều người đánh giá cao bởi tốc độ nhanh, mượt. Chạy tốt trên cả máy cá nhân và máy
chủ. Hiện nay, Ubuntu là mã nguồn mở nên sử dụng miễn phí. Việc chia sẻ và sử dụng bạn
sẽ không phải mất bất cứ chi phí nào. Điểm này khiến người dùng đánh giá cao.
Linux Mint: Phiên bản Linux Mint ra sau Ubuntu nên vừa kế thừa, lại cải tiến phiên
bản cũ. Phiên bản này dựa trên nền tảng cũ Ubuntu. Hiện nay, nhiều người đánh giá cao
phiên bản này bởi tốc độ, giao diện và mã nguồn phong phú… Tuy nhiên, đây cũng chỉ là
ý kiến chủ quan. Trên thực tế, mỗi phiên bản có một ưu điểm riêng. Đối với ai chưa dùng
2 phiên bản hãy thử tải về trải nghiệm xem.
Debian: Với những người muốn máy tính mình mang tính ổn định cao hơn thì Debian
là một lựa chọn hàng đầu. Debian dù luôn chạy những phần mềm cũ kỹ hơn so với các hệ
điều hành hiện tại nhưng điều đó cũng đồng nghĩa là các phần mềm đó đã trải qua thời gian
thử lâu và được tin tưởng sử dụng.

27
Fedora: Phiên bản này gây khó khăn cho người dùng khi cài đặt trình điều khiển đồ
họa, tuy nhiên nó hoàn toàn miễn phí nên cũng rất đáng để dùng. Với Fedora, người dùng
được quyền tự do phát triển, thay đổi mọi thứ trong máy tính của mình để “vừa ý” mình
nhất. Đây là một phiên bản tốt cho lập trình viên bởi nó hỗ trợ sẵn một số công cụ, nền tảng
để lập trình.
CentOS/Red Hat Enterprise Linux: Red Hat Enterprise Linux là một bản phân phối
Linux thương mại dành cho máy chủ và máy trạm, được phát triển dựa trên Fedora, nhưng
có một nền tảng ổn định và được hỗ trợ lâu dài hơn.
OpenSUSE/SUSE Linux Enterprise: OpenSUSE là một trong những bản phân phối
khá mạnh của Linux. Đây được đánh giá là một trong những bản phân phối thân thiện nhất
của hệ điều hành này với người dùng.
Mageia/Mandriva: Với thiết kế linh hoạt, gọn nhẹ, đơn giản hết mức có thể. Mageia
được xem là “tiền bối” trong số các bản phân phối của Linux. Bên cạnh đó, Mageia còn
cung cấp các tệp cấu hình sạch được thiết kế giúp người dùng chỉnh sửa một cách dễ dàng.
Slackware Linux: Slackware là bản phân phối lâu đời nhất của của Linux, hiện vẫn
được duy trì sử dụng và đều đặn đưa ra các bản phát hành mới.
Puppy Linux: Là một bản phân phối khá nổi tiếng của Linux được phát triển dựa trên
Slackware. Puppy Linux được thiết kế để trở thành một hệ điều hành nhỏ, nhẹ, có khả năng
hoạt động mượt trên các máy tính cũ.
2. Ngôn ngữ lập trình, SDK và IDE
2.1. Ngôn ngữ lập trình Dart
Dart là một ngôn ngữ lập trình được sử dụng trong môi trường Flutter - bộ công cụ
giao diện người dùng của Google để xây dựng các ứng dụng đa nền tảng từ Mobile, Web
cho đến Desktop, được biên dịch nguyên bản từ một cơ sở mã code duy nhất.
2.1.1 Các thư viện hỗ trợ
Dart giàu thư viện hỗ trợ:

28
Thư viện Mô tả

dart:core Thư viện này bao gồm collection, các loại cài sẵn (built-in) và chức năng
cốt lõi khác cho mỗi chương trình Dart.

dart:io Thư viện này bao gồm File, HTTP, socket và hỗ trợ I / O khác cho các
ứng dụng máy chủ. Thư viện này không phù hợp với các ứng dụng dựa
trên trình duyệt. Chúng tôi không cần nhập rõ ràng vì nó được nhập theo
mặc định.

dart: Nó đại diện cho các danh sách lưu trữ dữ liệu có kích thước cố định một
typed_data cách hiệu quả (ví dụ – số nguyên 8 byte không dấu và SIMD).

dart:collection Cung cấp nhiều kiểu dữ liệu như queue, linked lists, hashmaps, và cây
nhị phân.

dart:convert Có chức năng mã hóa và giải mã nhiều dạng dữ liệu khác nhau, gồm
JSON và UTF-8

dart:math Thư viện này bao gồm các hàm toán học, hằng số và trình tạo số ngẫu
nhiên.

dart:html Các phần tử HTML và các tài nguyên khác cho Ứng dụng dựa trên Web
cần tương tác với trình duyệt và DOM.

2.1.2. Các nền tảng


Trình biên dịch của Dart cho phép bạn chạy chương trình theo nhiều cách khác nhau:
Native platform: Hướng đến các thiết bị di động và desktop, Dart bao gồm một Dart
VM với trình biên dịch JIT (just-in-time) và một trình biên dịch AOT (ahead-of-time) cho
việc tạo ra mã máy..
Web platform: Hướng đến các ứng dụng web, Dart có thể biên dịch cho mục đích
phát triển hoặc sản xuất. Trình biên dịch Web của nó dịch từ Dart sang JavaScript.

29
2.2. Flutter SDK
Flutter là một framework mã nguồn mở cho phép tạo ứng dụng di động với hiệu suất
cao, chất lượng tốt hỗ trợ đa nền tảng, phù hợp với phát triển ứng dụng Android và iOS.
Những điểm ưu việt:
- Phát triển nhanh: Tính năng Hot Reload hoạt động trong khoảng thời gian cực nhanh
để kết xuất (render) giao diện. Sử dụng tập hợp các widget có thể tùy chỉnh để xây dựng
giao diện chỉ trong vài phút. Ngoài ra, Hot Reload còn giúp người dùng tiết kiệm thời gian
hơn trong việc sửa lỗi mà không cần phải thông qua máy ảo, máy Android hoặc iOS.

- Giao diện hấp dẫn và linh hoạt: Có rất nhiều các thành phần để xây dựng giao diện
của Flutter vô cùng đẹp mắt theo phong cách Material Design và Cupertino, hỗ trợ nhiều
các APIs chuyển động, smooth scrolling.

30
- Hiệu suất cao: Các widget của Flutter kết hợp các sự khác biệt của các nền tảng ví
dụ như scrolling, navigation, icons, font để cung cấp một hiệu năng tốt nhất tới iOS và
Android.
Được phát triển và áp dụng tại “ông lớn” Google, và được phổ biến, tin dùng bởi cộng
đồng các nhà phát triển trên khắp thế giới.

31
2.3. Visual Studio Code
Visual Studio Code là trình soạn thảo, biên tập lập trình mã nguồn miễn phí được xây
dựng và phát triển bởi Microsoft, ứng dụng cho phép biên tập, soạn thảo các đoạn code để
hỗ trợ trong quá trình thực hiện xây dựng, thiết kế website một cách nhanh chóng. Visual
Studio Code (VS Code) là sự kết hợp hoàn hảo giữa IDE và CODE Editor, có dung lượng
khá nhẹ và khả năng vận hành mạnh mẽ trên cả 3 nền tảng được phát triển bởi Microsoft
là: macOS, Linux và Windows. Đặc biệt, VS Code là một mã nguồn mở và hoàn toàn miễn
phí.
Visual Studio Code là một trong những trình soạn thảo mã nguồn rất phổ biến được
các lập trình viên sử dụng. Được đánh giá như vậy bởi Visual Studio Code sở hữu nhiều
tính năng ưu việt như:

32
Intellisense

Tính năng nhắc Intellisense được sử dụng đa số trong các phần mềm lập trình, bao
gồm cả Visual Studio Code. Tuy nhiên, Visual Studio Code vẫn được đánh giá cao về tính
chuyên nghiệp so với các trình viết mã. Tính năng này đặc biệt còn có thể phát hiện tất cả
các đoạn mã bị thiếu, đưa ra các gợi ý sửa đổi, nhắc nhở lập trình viên, khai báo biến tự
động trong trường hợp lập trình viên quên, bổ sung cú pháp còn thiếu,…
Tích hợp sẵn Git
Do kết nối với GitHub nên Visual Studio Code cho phép hỗ trợ người dùng kéo thả
hoặc copy trực tiếp từ GitHub. Các mã code này có thể được thay đổi và lưu lại trực tiếp
trên phần mềm.
Debugger
Hỗ trợ debug là một tính năng hữu ích của VSCode. Theo mặc định, VSCode chỉ đính
kèm chương trình Debug hỗ trợ riêng cho Node JS. Tuy nhiên, bạn hoàn toàn có thể cài đặt
thêm extension để có thể debug cho những ngôn ngữ khác theo nhu cầu sử dụng.

33
Tích hợp Terminal
Terminal là chương trình giao diện cửa sổ dòng lệnh. Đây là một tính năng vô cùng
quan trọng với lập trình viên. Khi sử dụng VSCode, bạn có thể mở một hoặc có thể mở
nhiều tab terminal tại thư mục bạn đang làm việc, giúp nâng cao hiệu quả công việc.
Khả năng mở rộng và tùy chỉnh
Visual Studio Code cung cấp cho người dùng khả năng tùy chỉnh tuyệt vời như: tùy
chỉnh theme, kích thước, font chữ, keyboard shortcut, coding style, tùy chỉnh tính năng,…
một cách linh hoạt. Bạn cũng có thể tùy chỉnh trên từng workshop vô cùng tiện lợi.
Code Spell Checker
Tính năng này cho phép người dùng kiểm tra tên hàm, các comment, tên biến sai chính
tả một cách nhanh chóng. Từ đó giúp bạn có thể chỉnh sửa dễ dàng và nhanh chóng hơn.
Live Server
Xây dựng server chạy CSS/HTML/JS thông qua tính năng Live Server. Tính năng
này sẽ tự động refresh lại trình duyệt mỗi khi bạn chỉnh sửa code, giúp tiết kiệm rất nhiều
thời gian.
Ngoài ra, VSCode còn cung cấp rất nhiều tính năng hữu ích khác như:
- Hỗ trợ đa nền tảng: VS Code sử dụng được trên cả 3 nền tảng Windows, Linux và
Mac Systems.
- Hỗ trợ đa ngôn ngữ lập trình: VS Code cho phép sử dụng nhiều ngôn ngữ lập trình
khác nhau cùng lúc từ C/C++, C# cho đến F#, HTML, CSS, JavaScript…
- Hỗ trợ website: VS Code hỗ trợ nhiều ứng dụng web khác nhau. Đồng thời, nó cũng
có 1 trình soạn thảo và thiết kế website.
- Kho tiện ích mở rộng phong phú
- Lưu trữ dữ liệu dạng phân cấp
- Kho lưu trữ dữ liệu an toàn:VS Code dễ dàng được kết nối Git hoặc bất cứ kho lưu
trữ an toàn hiện có để lưu trữ dữ liệu.
- Màn hình đa nhiệm: VS Code, cho phép người dùng mở cùng lúc nhiều thư mục và
tập tin dù chúng có thể không liên quan tới nhau.

34
- Hỗ trợ viết code: VS Code có thể đưa ra gợi ý hoặc đề xuất tới các lập trình viên một
số tùy chọn thay thế nhằm điều chỉnh đôi chút để đoạn code sao cho thuận tiện hơn với
người dùng.
- Hỗ trợ thiết bị đầu cuối
- Tính năng comment

35
III. Bài tập

1. Chức năng phần mềm


Hình ảnh tổng quan về ứng dụng

Hiện tại tất cả các thiết bị chạy hệ điều hành Android 4 (Kitkat) trở lên đều có thể cài
ứng dụng và sử dụng mượt mà. Còn về phía IoS hiện đã có thể cài đặt thông qua
DeployGate. Ứng dụng được viết bằng framework Flutter tạo ra một giao diện trực quan
đẹp mắt, responsive trên hầu hết các thiết bị di động và dễ sử dụng cho việc theo dõi thông
tin, điều khiển thiết bị.

36
Sơ đồ chức năng:

- Chức năng cập nhật số lượng phòng: Ứng dụng sẽ cập nhật số lượng phòng hiện có
trên database.
- Chức năng cập nhật số lượng thiết bị: Ứng dụng sẽ cập nhật số lượng thiết bị hiện
có trong mỗi phòng trên database.
- Chức năng hiển thị phòng, thiết bị: Dựa trên dữ liệu lấy từ database ứng dụng sẽ hiển
thị đúng số lượng phòng và số lượng thiết bị trong mỗi phòng .
- Chức năng cập nhật nhiệt độ, độ ẩm: Cập nhật và hiển thị nhiệt độ, độ ẩm thu được
từ phần cứng.
- Chức năng điều khiển thiết bị: Bật tắt thiết bị như cảm biến, đèn,…
2. Lưu đồ giải thuật
Sơ đồ khối hệ thống

37
Ở phần cứng có thể kết nối nhiều thiết bị và cảm biến hơn thế nữa, số lượng thiết bị
hoàn toàn do người dùng quyết định.
Sơ đồ kết nối phần cứng

Phần cứng bao gồm: 1 Node MCU (Esp8266), 1 cảm biến nhiệt độ, độ ẩm (DHT11),
2 điện trở 330 ohm, 2 led, breadboard và dây nối, cáp micro USB.
38
Lưu đồ Widget chương trình

Ứng dụng Vhome gồm có 2 screen chính bao gồm: Home Page và Room Control
Page. Khi mở ứng dụng, thông qua các root Widget rồi đến Home Page sẽ được hiển thị.
Với StreamBuilder sẽ vẽ lại UI mỗi khi dữ liệu lấy từ Database thay đổi. Trong Home Page
có widget ListView hiển thị các phòng từ Database, khi ta click vào phòng thì sẽ load Room
Control Page. Tương tự Home Page, Room Control Page cũng thông qua StreamBuilder vẽ

39
lại UI mỗi khi dữ liệu từ Database thay đổi và request data khi ta thay đổi trạng thái của
thiết bị.

Lưu đồ thuật toán chương trình

40
Sơ đồ cây Database

Thực chất khi áp dụng vào project thực tế thì các Key bath_room, bedroom,
kitchen_room hay dht, led, led2 sẽ được thay bằng chuỗi ID riêng biệt để phân biệt các đối
tượng một cách độc nhất. Số lượng phòng và số lượng thiết bị trong mỗi phòng có thể thêm
bớt và ứng dụng sẽ cập nhật ngay lập tức (có kết nối Internet).
3. Code
Code phần cứng NodeMCU

41
Import các thư viện và define các thông tin cần thiết, chi tiết hướng dẫn kết nối
Firebase xem tại document mobizt/Firebase-ESP8266.

Khởi tạo các đối tượng và biến liên quan, cần sử dụng.

42
Trong hàm setup:
- Thiết lập các chân D0, D1, D2 nhận, xuất tín hiệu, thiết lập tốc độ Baud.
- Kiểm tra và kết nối Wifi dựa trên thông tin wifi đã cung cấp trước đó.
- Thiết lập kết nối với Firebase, reconnect Wifi nếu bị mất kết nối.

43
Trong hàm loop:
- Đọc giá trị nhiệt độ độ ẩm từ cảm biến và gán vào biến h và t

- Cứ mỗi 5 giây NodeMCU sẽ request gửi data đến Database và ghi giá trị tại node đã
định sẵn (ở đây có 2 node gồm node humidity và node temperature), nếu request thất bại sẽ
in lỗi tại serial monitor.

44
- NodeMCU sẽ request lấy data từ Database và set giá trị đó cho led (kiểu bool). Nếu
request thất bại sẽ in lỗi tại serial monitor.

45
Code hàm loop hoàn chỉnh

46
Code phần mềm app Vhome
Tổng quan folder và file

Chúng tôi sẽ đi vào những phần trọng tâm và thường sử dụng trong quá trình phát
triển ứng dụng.
- Assets folder: Nơi lưu trữ ảnh, icon dùng trong ứng dụng. Hiện tại chúng tôi đã
update chức năng giúp gần như tất cả các ảnh sử dụng trong ứng dụng đều đã được đẩy lên
Database và gọi xuống trong quá trình sử dụng.

- Pubspec.yaml: Là nơi thiết lập sdk version, thư viện sử dụng, assets.

47
Cấu trúc folder chính bao gồm constants, models, screens, widgets và file main

- Constants folder: Nơi chứa các thiết lập ban đầu về style, color, font size, layout,…
và như tên gọi của folder những thiết lập này không thể thay đổi sau khi khởi tạo. Với
những thiết lập này ngay từ đầu sẽ giúp cải thiện tốc độ và sự tiện lợi trong quá trình phát
triển ứng dụng, hơn thế nó còn ảnh hưởng rất nhiều trong việc duy trì bảo dưỡng và phát
triển về sau
- File main.dart là phần root của toàn bộ chương trình, là nơi bắt đầu và setup những
điều chỉnh liên quan đến service như khởi tạo Firebase, testing, thiết lập status bar, hướng
của thiết bị,…

48
- Models folder: Nơi chứa các model liên quan đến luồng dữ liệu, đối tượng tuân
theo mô hình Model - View - Controller (MVC).

49
- Widgets folder: Chứa các thành phần widget con để tạo nên 1 screen hoàn chỉnh
hoặc widget này thường được sử dụng nhiều lần. Mục đích của việc này nhằm giúp dễ quản
lý, chỉnh sửa và tái sử dụng.

- Screens folder: Đây là phần rất quan trọng của chương trình, nơi chứa các screen
chính trong ứng dụng.

Chúng tôi sẽ đi vào screen Home Page:


- Import các thư viện và widget cần dùng

50
- Ở Home Page chúng tôi sử dụng StatefulWidget. Trong Flutter StatelessWidget và
StatefulWidget ta sẽ thường xuyên gặp. Hiểu đơn giản thì StatelessWidget không có state,
tức là bản thân StatelessWidget chỉ render lại giao diện khi có tác động từ bên ngoài, thông
qua việc nhận dữ liệu từ bên ngoài. Còn StatefulWidget thì có state tức là data ngay bên
trong nó có thể thay đổi được. Khi state thay đổi nó sẽ gọi lại hàm build để rebuild widget
nhờ đó mà UI thay đổi.

- Khởi tạo node truy cập đến Database.

51
- Hàm showPopupMenu() dùng để hiển thị một pop up khi được gọi

52
- Hàm build dùng để render UI, trong hàm build khởi tạo biến size có giá trị là chiều
cao và chiều rộng của thiết bị di động, hỗ trợ việc code cho UI responsive trên các thiết bị
di động.

53
- Ở trong Widget Scaffold chủ yếu là các khối widget hình thành nên giao diện, nên
chúng tôi chỉ đi vào những widget quan trọng trong khối đó. Widget StreamBuilder sẽ build
lại phần giao diện mỗi khi Database thay đổi. Kiểu dữ liệu mà Database trả về có dạng
Map<dynamic, dynamic>. Kiểu dữ liệu Map cũng tương tự như kiểu Dictionary trong
Python còn dynamic ở đây ta hiểu là kiểu dữ liệu của key, value có thể linh động. Widget
ListView.builder sẽ hiển thị các RoomWidget dựa theo số lượng phòng có trên Database
và truyền vào các thuộc tính thích hợp cho RoomWidget. Khi không có kết nối Internet
hoặc dữ liệu request chưa có phản hồi thì sẽ render ra một vòng tròn loading nhờ vào widget
CircilarProgressIndicator.

54
Một số hình ảnh thực tế

55
56
Hiện project vẫn đang được chúng tôi phát triển thêm các tính năng mới và cải thiện
những thứ chưa hoàn thiện. Thông tin về project và source code sẽ được cập nhật tại flutter-
iot-nodemcu (github.com)

57
TÀI LIỆU THAM KHẢO

[1] T. G. Frank Vahid, 1999. [Trực tuyến]. Available: http://dsp-book.narod.ru/ESDUA.pdf.


[2] Admin, “Vĩnh Long Online,” 9 12 2021. [Trực tuyến]. Available:
https://cdspvinhlong.edu.vn/giao-tiep-uart-la-gi-ung-dung-cua-uart-giao-tiep-uart-la-gi/.
[3] N. H. Phước, “Điện tử Việt,” 25 4 2021. [Trực tuyến]. Available: https://dientuviet.com/kien-
thuc-co-ban-ve-giao-tiep-uart/.
[4] M. Ruler, “kysungheo,” 14 11 2021. [Trực tuyến]. Available: https://kysungheo.com/chuan-
giao-tiep-spi/.
[5] “Deviot,” 9 2020. [Trực tuyến]. Available: https://deviot.vn/blog/giao-tiep-spi.74706311.
[6] “Vina FE,” [Trực tuyến]. Available: https://dientutuonglai.com/chuan-giao-tiep-spi-la-
gi.html.
[7] “Vina FE,” [Trực tuyến]. Available: https://dientutuonglai.com/chuan-giao-tiep-i2c-la-
gi.html.
[8] tapit, “TapIT,” 21 5 2021. [Trực tuyến]. Available: https://tapit.vn/giao-thuc-i2c-va-giao-
tiep-voi-cam-bien-nhiet-hong-ngoai-mlx90614/.
[9] “Wikipedia,” [Trực tuyến]. Available:
https://vi.wikipedia.org/wiki/M%E1%BA%A1ng_c%E1%BB%A5c_b%E1%BB%99.
[10] V. Phạm, “Bizfly Cloud,” 2 10 2022. [Trực tuyến]. Available: https://bizflycloud.vn/tin-
tuc/mang-lan-la-gi-nhung-dieu-can-biet-truoc-khi-su-dung-mang-lan-trong-doanh-nghiep-
gia-dinh-truong-hoc-20201103095323431.htm.
[11] N. Hưng, “Vietnix,” [Trực tuyến]. Available: https://vietnix.vn/visual-studio-code-la-gi/.
[12] Flutter, “Flutter,” [Trực tuyến]. Available: https://flutter.dev/.

58

You might also like