You are on page 1of 61

Bài 1: Giới thiệu hệ thống nhúng

● Tổng quan về hệ thống máy tính

Hệ thống máy tính (hoặc chỉ máy tính) thường được mô hình hóa là một
hệ thống bao gồm:
- Đầu vào: tín hiệu vật lý từ môi trường
- Đầu ra: phản hồi của hệ thống với môi trường
- Và đơn vị xử lý: tìm nạp và thực hiện các lệnh từ bộ nhớ

● Hệ thống máy tính nhúng


Hệ thống nhúng là một máy tính chuyên dụng (không phải là máy
tính đa năng) với các tính năng sau:
- Chức năng chuyên dụng duy nhất
• Thường được thiết kế để thực hiện một chức năng được xác định
trước
- Ràng buộc chặt chẽ
• Giá thấp
• Là một thành phần đơn lẻ hoặc ít hơn
• Thực hiện các chức năng đủ nhanh
• Tiêu thụ điện năng tối thiểu
- Phản hồi thời gian thực
• Phải liên tục theo dõi môi trường mong muốn và phản ứng với
những thay đổi
- Phần cứng và phần mềm cùng tồn tại
• Chương trình được viết cho hệ thống nhúng được gọi là "firm-
ware" và thường được lưu trữ trong bộ nhớ lâu dài (ROM / Flash)
• Firm-ware có thể chạy với nguồn cung cấp phần cứng hạn chế.
Hệ thống nhúng có thể được phân loại dựa trên độ phức tạp và hiệu
suất của chúng thành:
- Hệ thống quy mô nhỏ
• Thực hiện các chức năng đơn giản, hoạt động bằng pin, không
cần hệ điều hành
• Thường được xây dựng dựa trên bộ vi xử lý hoặc vi điều khiển 8
hoặc 16-bit cấp thấp
• Các công cụ lập trình chính: trình soạn thảo, trình hợp dịch, trình
biên dịch chéo và phát triển tích hợp môi trường (IDE).
• Ví dụ: chuột và điều khiển từ xa TV
- Hệ thống quy mô vừa
• Phức tạp cả phần cứng và phần mềm, có hỗ trợ hệ điều hành
• Sử dụng bộ vi xử lý hoặc vi điều khiển 16 hoặc 32-bit
• Các công cụ lập trình chính là C, C ++, JAVA, Visual C ++, trình
gỡ lỗi, công cụ kỹ thuật mã nguồn, trình mô phỏng và IDE
• Ví dụ: máy bán hàng tự động và máy giặt
- Hệ thống quy mô lớn hoặc phức tạp
• Có rất nhiều phức tạp về phần cứng và phần mềm
• Được xây dựng xoay quanh bộ vi xử lý hoặc vi điều khiển 32
hoặc 64-bit, cùng với một loạt các mạch tích hợp tốc độ cao khác.
• Cần các kỹ thuật đồng thiết kế phần cứng và phần mềm
• Ví dụ: hệ thống thiết bị hạ cánh, hệ thống phanh ô tô và các ứng
dụng quân sự
● So sánh máy tính nhúng và máy tính đa năng

Máy tính nhúng Máy tính đa năng

- Một thành phần của một số sản - Một sản phẩm hoàn chỉnh
phẩm lớn hơn; mục đích của nó là
tập trung hạn chế vào việc hỗ trợ
sản phẩm đó

- Người dùng cuối của sản phẩm - Người dùng cuối tương tác trực
thường không tương tác trực tiếp tiếp với nó
với hệ thống nhúng hoặc chỉ tương
tác với một giao diện hạn chế

- Người dùng không coi sản phẩm - Người dùng biết rõ ràng về sản
(ví dụ: máy nghe nhạc DVD, máy phẩm họ đang mua là một chiếc
nghe nhạc MP3, bảng điều khiển máy tính
trò chơi) mà họ đang mua là máy
tính

- Có một số thiết bị ngoại vi tiêu - Có tương đối ít đầu vào và đầu ra


chuẩn này, nhưng cũng bao gồm được tiêu chuẩn hóa: bàn phím,
những thiết bị chuyên dụng hơn: chuột, kết nối mạng, màn hình
+ Cảm biến mục đích đặc biệt: gia video và máy in
tốc kế, đầu dò nhiệt độ, từ kế, công
tắc tiếp xúc nút nhấn, v.v.
+ Đầu ra mục đích đặc biệt: đèn và
đèn LED, bộ truyền động, tín hiệu
điện TTL, màn hình LCD, v.v.
● Định nghĩa hệ thống nhúng

“Hệ thống nhúng là hệ thống máy tính có tích hợp phần cứng và phần mềm
được kết hợp chặt chẽ, được thiết kế để thực hiện một chức năng chuyên
dụng. Từ ‘nhúng’ phản ánh thực tế là các hệ thống này thường là một phần
không thể thiếu của hệ thống / sản phẩm lớn hơn (cơ hoặc điện), được gọi
là hệ thống nhúng. Nhiều hệ thống nhúng có thể cùng tồn tại trong một hệ
thống nhúng. ” – (Qing Li and Carolyn Yao)
● Đặc điểm của hệ thống nhúng
- Cấu trúc hệ thống:
+ Cảm biến: để lấy dữ liệu từ môi trường của nó
+ ADC: chuyển đổi dữ liệu tương tự từ cảm biến sang tín hiệu
số
+ Bộ điều khiển: đầu não của hệ thống; thực hiện đồng thời một
tập hợp các tác vụ thời gian thực, có thể có hoặc không với sự
hỗ trợ của RTOS(hệ thống điều hành thời gian thực)
+ Bộ truyền động: thông qua bộ truyền động, bộ điều khiển tác
động lên hệ thống đích
+ DAC: chuyển đổi tín hiệu kỹ thuật số từ vi điều khiển sang tín
hiệu tương tự
- Chức năng tinh vi:
+ Các thuật toán phức tạp: ô tô, điện hạt nhân, hàng không vũ
trụ, ...
+ Giao diện người dùng: giọng nói, hình ảnh, ...
- Các hạn chế về hiệu suất:
+ Thời gian thực (Hard/Soft real-time)
+ Nhiều tỷ lệ
+ Xử lý đa tác vụ, hoạt động ở các mức độ khác nhau
- Yêu cầu chi phí: Chi phí sản xuất, Nguồn cấp và năng lượng, giá
thành thấp.
- Môi trường bị ràng buộc cao
+ Môi trường hạn chế tài nguyên cao: tốc độ bộ xử lý, dung
lượng bộ nhớ và giao diện người dùng
- Đồng thời
+ Một số tính toán đang thực hiện đồng thời và có khả năng
tương tác với nhau
- An toàn và Độ tin cậy
+ An toàn có nghĩa là “không bị tai nạn hoặc mất mát” trong
trường hợp không có lỗi cũng như khi có lỗi đơn điểm.
+ Độ tin cậy đề cập đến khả năng của một hệ thống hoặc thành
phần để thực hiện các chức năng cần thiết của nó trong các
điều kiện đã nêu trong một thời gian xác định.
Được đo bằng lỗi trên một triệu giờ hoạt động
● Tại sao nhúng bộ vi xử lý vào hệ thống?
- Bộ vi xử lý là một cách rất hiệu quả để triển khai các hệ thống kỹ
thuật số:
+ Bộ xử lý hiệu suất cao có thể thực hiện một số lệnh trong
mỗi chu kỳ
+ CPU được tối ưu hóa cao cho tốc độ sản xuất công nghệ mới
nhất
+ Mặt khác, một bộ vi xử lý có thể được sử dụng cho nhiều
thuật toán khác nhau chỉ bằng cách thay đổi chương trình mà
nó thực thi.
+ Việc triển khai ứng dụng của bạn nhanh hơn so với việc thiết
kế logic tùy chỉnh của riêng bạn
- Bộ vi xử lý linh hoạt nhờ khả năng lập trình của chúng:
+ Dễ dàng hơn để thiết kế các dòng sản phẩm
+ Dễ dàng hơn trong việc cung cấp các tính năng mới để theo
kịp với thị trường đang thay đổi nhanh chóng
+ Có thể sử dụng lại phần mềm cho các sản phẩm thế hệ tiếp
theo, do đó giảm thời gian và chi phí phát triển.
● Tại sao không sử dụng PC cho tất cả các máy tính nhúng?
- Khó đáp ứng các yêu cầu về hiệu suất thời gian thực
+ Hiệu suất thời gian thực thường đạt được tốt nhất bởi bộ xử
lý đa xử lý hoặc logic tùy chỉnh
- Khó đáp ứng các yêu cầu Công suất thấp và chi phí thấp:
+ PC được thiết kế để đáp ứng nhiều yêu cầu về tính toán.
+ Ngược lại, các hệ thống nhúng tùy chỉnh được thiết kế cho
một ứng dụng.
Liệu chúng ta có thể sử dụng Điện thoại thông minh làm nền tảng cho máy tính
nhúng không?
• Đặc trưng:
• Điện thoại thông minh rất tiết kiệm điện
• Điện thoại thông minh có thể thực hiện một lượng lớn tính toán trong
thời gian thực
• Kích thước nhỏ

● Những thách thức trong thiết kế hệ thống nhúng

Một số vấn đề quan trọng phải được tính đến trong thiết kế hệ thống nhúng:
- Chúng ta cần bao nhiêu phần cứng?
• lựa chọn phần cứng phải đáp ứng cả thời hạn hiệu suất và hạn chế về chi
phí sản xuất
- Làm thế nào để chúng ta hạn chế về thời gian?
• để tăng tốc phần cứng để chương trình chạy nhanh hơn
- Làm cách nào để giảm thiểu điện năng tiêu thụ?
• làm chậm hệ thống
- Làm thế nào để chúng tôi thiết kế để có thể nâng cấp?
• Thiết kế phải đủ linh hoạt cho một số thế hệ sản phẩm hoặc cho một số
phiên bản khác nhau của một sản phẩm trong cùng một thế hệ
- Làm thế nào nó thực sự làm việc?
• Độ tin cậy luôn quan trọng khi bán sản phẩm

● Các yếu tố làm cho việc thiết kế hệ thống nhúng trở nên khó khăn
hơn
- Thử nghiệm phức tạp:
• phải chạy một máy thực để tạo ra dữ liệu thích hợp - Khả năng quan sát
và kiểm soát hạn chế:
• không đi kèm với bàn phím và màn hình
• trong các ứng dụng thời gian thực, không dễ gì dừng hệ thống
- Môi trường phát triển hạn chế:
• các công cụ được sử dụng để phát triển phần mềm và phần cứng)
thường bị hạn chế hơn nhiều

IV: Tổng quan


Những gì đã học được
- Các khái niệm cơ bản về Hệ thống máy tính nhúng
- Phân biệt giữa Hệ thống máy tính nhúng và Hệ thống máy tính đa năng

Q1: Hệ thống máy tính nhúng là gì? Điều gì là khó khăn và độc đáo về việc
nhúng máy tính và máy tính đa năng?
Câu 2: Kể tên ba sản phẩm điện tử tiêu dùng có hệ thống nhúng. Kể tên ba sản
phẩm điện tử tiêu dùng không chứa hệ thống máy tính nhúng.
Basic Concepts
● Kiến trúc hệ thống nhúng

- DMA cung cấp khả năng truy cập bộ nhớ trực tiếp
- Timers được sử dụng bởi hệ điều hành, thiết bị.
- Nhiều bus kết nối CPU và bộ nhớ với các thiết bị.
+ tốc độ thấp: cung cấp một cách không tốn kém để kết nối các thiết bị
đơn giản hơn
+ tốc độ cao: cho phép các thiết bị nhanh chóng giao tiếp hiệu quả
- Nhiều bus phục vụ hai mục đích:
+ giảm tải truy cập tổng thể và tăng hiệu suất sử dụng bus
+ bus tốc độ thấp cung cấp giao diện đơn giản hơn và rẻ hơn so với bus
tốc độ cao
● Cơ chế giao tiếp
- Các thành phần của hệ thống máy tính giao tiếp thông qua mạng kết nối
- Cung cấp các phương tiện để truyền dữ liệu và trao đổi trạng thái và thông tin
điều khiển
- Mạng kết nối có thể là:
+ Kết nối trực tiếp
+ Shared bus
+ Mạng trên chip
● Một bus đơn giản

- Dây dẫn:
+ Một chiều hoặc hai chiều
+ Một đường dây có thể đại diện cho nhiều dây
- Bus
+ Bộ dây dẫn với một chức năng duy nhất: bus địa chỉ, bus dữ liệu
+ Hoặc, toàn bộ dây dẫn:
• Địa chỉ, dữ liệu và kiểm soát
• Giao thức được liên kết: các quy tắc cho kết nối

● Cổng

- Thiết bị dẫn điện ở ngoại vi


- Kết nối bus với bộ xử lý hoặc bộ nhớ
- Thường được gọi là một pin
+ Trong thực tế là các chân ở ngoại vi của gói IC cắm vào ổ cắm trên bảng
mạch được in
+ Đôi khi là bóng kim loại thay vì pin
+ Ngày nay, "miếng đệm" kim loại kết nối bộ xử lý và bộ nhớ trong một
vi mạch
- Dây đơn hoặc bộ dây có chức năng đơn lẻ
Ví dụ: cổng địa chỉ 12 dây

● Bus
- Tối thiểu, một bus là một tập hợp các dây nhưng nó cũng được xác định một
giao thức của CPU, bộ nhớ và các thiết bị giao tiếp.
- Các tín hiệu tạo nên bus cung cấp thông tin liên lạc cần thiết: bản thân dữ liệu,
địa chỉ, clock và một số tín hiệu điều khiển.

● Bus vi xử lý

Các thành phần chính trên một bus điển hình bao gồm:
- Clock cung cấp sự đồng bộ hóa.
- R / W’ là true khi đọc (R / W’ là false khi đọc).
- Address là một gói-bit của các dòng địa chỉ.
- Data là gói dữ liệu n-bit.
- Data ready báo hiệu khi dữ liệu n-bit đã sẵn sàng.
● Timing diagrams
- Biểu đồ thời gian cho thấy các tín hiệu trên bus thay đổi như thế nào theo thời
gian.
- Trạng thái bus:
- Ràng buộc về thời gian: lượng thời gian giữa các sự kiện hoặc chỉ thứ tự của
các sự kiện

- Phương pháp phổ biến nhất để mô tả một giao thức truyền thông
- Thời gian tiến về bên phải trên trục x
- Tín hiệu điều khiển (enable): thấp hoặc cao
+ Có thể hoạt động thấp (ví dụ: go’, / go, nGo hoặc go_L)
+ Sử dụng các điều khoản khẳng định (hoạt động) và phủ định
+ Khẳng định go’ có nghĩa là go = 0
- Data signal: không hợp lệ hoặc hợp lệ
- Giao thức có thể có các giao thức con
+ Được gọi là chu kỳ bus, ví dụ: đọc và ghi
+ Mỗi giao thức có thể là một số chu kỳ đồng hồ
- Ví dụ giao thức đọc (read)
+ rd ’/ wr đặt ở mức thấp
+ địa chỉ được đặt trên addr trong ít nhất thời gian tsetup trước khi enable
được xác nhận, kích hoạt bộ nhớ để đặt dữ liệu trên data wires theo thời
gian tread
● Các khái niệm giao thức cơ bản
- Giao thức bus xác định cách các thiết bị giao tiếp:
+ khi các thành phần bus có thể sử dụng một số tín hiệu nhất định và
những tín hiệu đó có ý nghĩa
- Các thiết bị trên bus đi qua các chuỗi trạng thái.
+ Các giao thức được chỉ định bởi các máy trạng thái, một máy trạng thái
cho mỗi tác nhân trong giao thức.
- Có thể chứa hành vi logic không đồng bộ.

- Actor: master ra lệnh, slave (servant) phản hồi lại


- Direction: người gửi, người nhận
- Addresses: loại dữ liệu đặc biệt
+ Chỉ định một vị trí trong bộ nhớ, một thiết bị ngoại vi hoặc một thanh
ghi trong một thiết bị ngoại vi
- Time multiplexing:
+ Chia sẻ một bộ dây duy nhất cho nhiều phần dữ liệu
+ Tiết kiệm dây mà không tốn thời gian
● Các phương pháp điều khiển
- Control methods là các lược đồ để bắt đầu và kết thúc các quá trình chuyển
giao

Strobe protocol Handshake protocol


1. Master khẳng định yêu cầu req để 1. Master khẳng định yêu cầu req để
nhận dữ liệu nhận dữ liệu
2. Servant đưa dữ liệu data lên bus trong 2. Servant đưa dữ liệu data lên bus và
thời gian xử lý 𝑡𝑎𝑐𝑐𝑒𝑠𝑠 khẳng định ack
3. Master nhận dữ liệu data và cảnh báo 3. Master nhận dữ liệu data và cảnh báo
yêu cầu req = 0 yêu cầu req
4. Servant đã sẵn sàng cho yêu cầu tiếp 4. Servant đã sẵn sàng cho yêu cầu tiếp
theo theo
⇒ Đơn giản; Thời gian cố định ⇒ Phức tạp hơn; Thời gian linh hoạt
Chậm hơn khi đã biết thời gian phản hồi

● Kết hợp strobe/handshake

Fast-response case Slow-response case


1. Master khẳng định yêu cầu req 1. Master khẳng định yêu cầu req
để nhận dữ liệu data để nhận dữ liệu data
2. Servant đưa dữ liệu data lên 2. Servant không thể đưa dữ liệu
bus trong thời gian xử lý vào trong thời gian 𝑡𝑎𝑐𝑐𝑒𝑠𝑠 , khẳng
𝑡𝑎𝑐𝑐𝑒𝑠𝑠 (wait không được sử dụng) định wait ack = 1
3. Master nhận dữ liệu data và 3. Servant đưa dữ liệu lên bus và
phủ định yêu cầu req = 0 phủ định wait = 0
4. Servant đã sẵn sàng cho yêu 4. Master nhận dữ liệu và phủ
cầu tiếp theo định req = 1
5. Servant đã sẵn sàng cho yêu
cầu tiếp theo

DMA
● Direct memory access (DMA) thực hiện truyền dữ liệu mà không cần thực hiện
hướng dẫn.
- CPU thiết lập chuyển giao.
- Bộ điều khiển DMA thực hiện các thao tác đọc và ghi trực tiếp giữa các
thiết bị và bộ nhớ.
● Bộ điều khiển DMA là một đơn vị riêng biệt.
- Bộ điều khiển DMA có thể hoạt động như một bộ điều khiển bus

● Bus mastership
- Theo mặc định, CPU là bus master và bắt đầu chuyển tiếp.
- DMA phải trở thành bus master để thực hiện công việc của nó.
+ CPU không thể sử dụng bus trong khi DMA hoạt động.
- Giao thức cấp quyền làm chủ bus:
+ Hai tín hiệu bus bổ sung: Bus request và Bus grant.
+ Phương pháp điều khiển: bắt tay bốn chu kỳ
● Hoạt động của DMA
- CPU điều khiển hoạt động DMA thông qua các thanh ghi trong bộ điều khiển
DMA:
+ Một thanh ghi địa chỉ bắt đầu chỉ định nơi bắt đầu chuyển.
+ Một thanh ghi địa chỉ đích chỉ định nơi dữ liệu được chuyển đến.
+ Một thanh ghi độ dài chỉ định số lượng từ được chuyển.
+ Một thanh ghi trạng thái cho phép bộ điều khiển DMA được vận hành
bởi CPU.
- CPU bắt đầu truyền DMA bằng
+ thiết lập thanh ghi địa chỉ bắt đầu và thanh ghi độ dài và địa chỉ mục tiêu
một cách thích hợp.
+ Đặt bit “bắt đầu chuyển” trong thanh ghi trạng thái của DMA.
- Khi DMA là bus chính, nó sẽ tự động truyền.
+ Có thể chạy liên tục cho đến khi hoàn thành.
+ Có thể sử dụng mỗi chu kỳ bus thứ n.
● Slide 27-32 không hiểu không trình bày được
● Slide 33 trở đi: del hiểu j mà dịch luôn :)
● DMA hoạt động đồng thời
- DMA là bus master vì:
+ Luôn chạy cho đến khi hoàn thành.
+
Bài 2: Giới thiệu ngôn ngữ C
● Hai cách tiếp cận trong lập trình chip ARM
- Sử dụng các hàm do nhà cung cấp viết để truy cập các thiết bị ngoại
vi.
+ Các hàm thư viện thiết bị này có bản quyền và không thể sử dụng
với chip ARM của một nhà cung cấp khác.
+ Bạn không kiểm soát được các hàm và rất khó tùy chỉnh chúng
cho dự án của mình.
+ Dễ dàng và tiết kiệm thời gian để phát triển
- Tạo thư viện tùy chỉnh của riêng bạn để truy cập các đăng ký hàm
đặc biệt của thiết bị ngoại vi
+ Các hàm có thể được sửa đổi và sử dụng với nhà cung cấp khác.
+ Bạn có toàn quyền kiểm soát mỗi hàm
+ Khó và tốn rất nhiều thời gian
● Tại sao sử dụng ngôn ngữ C cho Hệ thống nhúng?
- C là một ngôn ngữ dành cho mục đích chung, liên kết chặt chẽ với
UNIX vì hệ điều hành này được viết bằng C.
- C là một ngôn ngữ cấp tương đối
+ Dễ dàng thao tác các ký tự, số và địa chỉ bằng cách sử dụng phạm
vi số học và các hoạt động logic thường được triển khai.
+ Cấu trúc luồng điều khiển đơn luồng.
- C tương đối nhỏ và có thể học nhanh.
- Một trình biên dịch C có thể đơn giản và nhỏ gọn (bởi vì các kiểu dữ
liệu và cấu trúc điều khiển do C cung cấp được hỗ trợ trực tiếp bởi hầu
hết các máy hiện có nên thư viện thời gian chạy cần thiết để thực hiện
các chương trình độc lập là rất nhỏ).
● Lịch sử phát triển:
- Được thiết kế bởi Dennis Richie (1944-2011) tại Bell Labs vào đầu
những năm 1970.
+ Một ngôn ngữ lập trình có mục đích chung
+ Các tính năng cấp thấp làm cho nó trở nên hấp dẫn đối với lập
trình hệ thống (UNIX ban đầu được viết bằng C).
- Được tiêu chuẩn hóa bởi Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI) vào
năm 1989 (tiêu chuẩn C89),
- Tiêu chuẩn hóa và sửa đổi bởi ANSI và Tổ chức Tiêu chuẩn hóa Quốc tế
(ISO) vào năm 1994 (C95), 1999 (C99).
- Hiện nay, C là ngôn ngữ lập trình phổ biến nhất ..
- Làm thế nào để bắt đầu?
+ Văn bản của Brian Kernighan và Dennis Ritchie là tài liệu tham
khảo cơ sở được chấp nhận nhưng không phù hợp với những
người mới lập trình.
I. Tổng quan về lập trình C
- Một chương trình C bao gồm một hoặc nhiều tệp nguồn, mỗi tệp chứa
một số phần của toàn bộ chương trình C - thường là một số chức năng
bên ngoài.
- Các khai báo chung thường được thu thập thành các tệp tiêu đề và được
đưa vào tệp nguồn bằng lệnh #include đặc biệt.
- Một hàm bên ngoài phải được đặt tên là main; hàm này là nơi chương
trình của bạn bắt đầu.
- Một trình biên dịch C xử lý từng tệp nguồn và chuyển nó thành các
hướng dẫn mà máy tính hiểu được (mã đối tượng). Đầu ra của trình biên
dịch thường được gọi là mã đối tượng hoặc các mô-đun đối tượng.
- Khi tất cả các tệp nguồn được biên dịch, các mô-đun đối tượng được
chuyển đến một chương trình được gọi là trình liên kết, chương trình
này phân giải các tham chiếu địa chỉ bên ngoài để tạo ra một tệp thực thi
(.exe).
● "Header file" của bộ vi điều khiển
- Keil MDK-ARM cung cấp một “Header file” dẫn xuất cụ thể cho mỗi vi
điều khiển, xác định địa chỉ bộ nhớ và các nhãn tượng trưng cho địa chỉ
thanh ghi chức năng của CPU và ngoại vi.
● The C Preprocessor
- #define là tiện ích mở rộng đơn giản và phổ biến nhất trong số các tiện
ích mở rộng này
1 định nghĩa về biểu mẫu:

#define YES 1
calls for a macro substitution, thay thế tên bằng một chuỗi ký tự.
- #include “filename”
+ bao gồm nội dung của các tệp khác trong quá trình biên dịch
+ #include “filename” được thay thế bằng nội dung của tệp “filename”
- Thường thì một hoặc hai dòng của biểu mẫu này xuất hiện ở đầu mỗi tệp
nguồn
● Macro substitution
- Cũng có thể xác định macro bằng các đối số, vì vậy văn bản thay thế
phụ thuộc vào cách gọi macro.

● #include lồng nhau


- Các khai báo #include có thể được lồng vào nhau
+ Một tệp bao gồm có thể chứa các khai báo #include khác, v.v.
- Các chương trình lớn hơn, bao gồm một số tệp nguồn riêng biệt có thể
chứa nhiều tham chiếu #include đến cùng một tệp. Để ngăn chặn nhiều
bản sao các khai báo trong các tệp được bao gồm thường là xử lý có
điều kiện
● Các loại câu lệnh của C
- Các phép gán biến đơn giản (Bao gồm truyền dữ liệu đầu vào / đầu ra)
- Các phép tính toán học
- Các hoạt động logic / thay đổi
- Cấu trúc điều khiển ( IF, WHEN, FOR, SELECT )
- Lời gọi hàm: Các hàm do người dùng định nghĩa và / hoặc các hàm thư
viện
● Câu lệnh và nhóm câu lệnh
- Trong C, dấu chấm phẩy là dấu chấm dứt câu lệnh.
- Dấu ngoặc nhọn {và} được sử dụng để nhóm các khai báo và câu lệnh
lại với nhau thành một câu lệnh ghép hoặc khối, do đó chúng tương
đương về mặt cú pháp với một câu lệnh đơn.
- Dấu ngoặc nhọn bao quanh một hàm là một ví dụ rõ ràng.
- Dấu ngoặc nhọn xung quanh nhiều câu lệnh sau if, else, while hoặc for
là những câu lệnh khác.
- Các biến thực sự có thể được khai báo bên trong bất kỳ khối nào; nhưng
chúng thường được nhóm lại với nhau khi bắt đầu hàm.
- Không bao giờ có dấu chấm phẩy sau dấu ngoặc nhọn bên phải kết thúc
một khối.
II. First C program: Hello World!

- Hàm PRINTF là một trong những hàm được cung cấp trong Thư viện
Chuẩn C fsl_debug_console.h
+ Không phải là một phần của ngôn ngữ lập trình C
- #include <fsl_debug_console.h> khai báo printf và các hàm UART
khác.
- Trình liên kết định vị chức năng và chèn địa chỉ của nó để chương trình
hoàn chỉnh có thể được thực thi.
III. Data types
● C data types

- Theo mặc định, các biến được coi là có dấu trừ khi từ khóa unsigned
được sử dụng với ngoại lệ là char.
- Luôn khớp với các đặc điểm của kiểu dữ liệu
- Loại biến cho biết cách dữ liệu được biểu diễn
+ Số bit xác định phạm vi giá trị số
+ signed/unsigned xác định toán tử số học / quan hệ nào sẽ được
trình biên dịch sử dụng
+ Dữ liệu không phải số phải là "unsigned"
- Tệp tiêu đề “stdint.h” xác định các tên kiểu thay thế cho các loại dữ liệu
tiêu chuẩn trong C
+ Loại bỏ sự mơ hồ về số lượng bit
+ Loại bỏ sự mơ hồ liên quan đến signed / unsigned
● Constant/literal values
- Decimal là định dạng số mặc định
+ int m, n; // số có dấu 16 bit
+ m = 453; n = -25;
- Hexadecimal: Giá trị đầu là 0x hoặc 0X
+ VD: m = 0xF312; n = -0x12E4;
- Octal: Giá trị đầu là 0
+ m = 0453; n = -023;
+ NOTE: Không sử dụng các số 0 ở đầu trên các giá trị "thập
phân". Chúng sẽ được hiểu là bát phân.
- Character: ký tự trong dấu ngoặc kép hoặc giá trị ASCII theo
sau dấu ‘’
+ m = ‘a’; //ASCII value 0x61
+ n = ‘\13’; //ASCII 13 là ký tự "trả về"
- String (array) of characters:
unsigned char k[7];
strcpy(k,“hello\n”); //k[0]=‘h’, k[1]=‘e’, k[2]=‘l’, k[3]=‘l’,
k[4]=‘o’,
//k[5]=13 or ‘\n’ (ASCII new line character),
//k[6]=0 or ‘\0’ (null character –end of string)
● C là một ngôn ngữ lập trình được định kiểu mạnh
- Ngôn ngữ lập trình được định kiểu mạnh là ngôn ngữ trong đó mỗi kiểu
dữ liệu (chẳng hạn như số nguyên, ký tự, thập lục phân, thập phân đóng
gói, v.v.) được xác định trước như một phần của ngôn ngữ lập trình.
- Tất cả các hằng số hoặc biến được định nghĩa cho một chương trình nhất
định phải được mô tả bằng một trong các kiểu dữ liệu.
- Một số thao tác nhất định có thể chỉ được phép với một số kiểu dữ liệu
nhất định.
- Trình biên dịch thực thi việc tuân thủ việc nhập và sử dụng dữ liệu.
- Một ưu điểm của cách đánh dữ liệu mạnh là nó áp đặt một bộ quy tắc
chặt chẽ lên người lập trình và do đó đảm bảo tính nhất quán nhất định
của kết quả.
- Một nhược điểm là nó ngăn lập trình viên phát minh ra một kiểu dữ liệu
không được các nhà phát triển ngôn ngữ lập trình dự đoán và nó hạn chế
mức độ "sáng tạo" của người dùng trong việc sử dụng một kiểu dữ liệu
nhất định.
● Chuyển đổi kiểu dữ liệu (TYPE CONVERSIONS)
- Khi các toán hạng của các kiểu khác nhau xuất hiện trong biểu thức,
chúng được chuyển thành một kiểu chung theo một số quy tắc.
- Thông thường, điều này xảy ra tự động (mặc dù đôi khi trình biên dịch
sẽ đưa ra thông báo cảnh báo - tùy thuộc vào mức độ cảnh báo).

● Ép kiểu

- Chuyển đổi kiểu có thể bị ép buộc (ép buộc) trong bất kỳ biểu thức nào
có cấu trúc được gọi là ép kiểu.
IV. Variables
● Biến
- Một biến là một vị trí lưu trữ có thể địa chỉ được chương trình sử dụng
+ Mỗi biến phải được khai báo để chỉ ra kích thước và loại thông tin
được lưu trữ, cộng với tên được sử dụng để tham chiếu thông tin
int x, y, z; // khai báo 3 biến kiểu “int”
char a, b; // khai báo 2 biến kiểu “char”
+ Không gian cho các biến có thể được cấp phát trong thanh ghi,
RAM hoặc ROM / Flash (đối với hằng số)
+ Các biến có thể động hoặc tĩnh
● Toán tử gán
- Nội dung của một vị trí bộ nhớ được thay đổi bởi một câu lệnh gán.
- Hằng và biến có thể được kết hợp với các toán tử số học, logic và quan
hệ để tạo thành các câu lệnh ghép.
● Các biến bên ngoài
- Được xác định bên ngoài mô-đun nguồn hiện tại, từ khóa extern
- Được tham chiếu bởi bất kỳ chức năng nào từ bất kỳ tệp nào trong hệ
thống phần mềm
- Chỉ các khai báo extern mới có thể được chỉ định bên ngoài
extern short ExtGlobal; /* an external global variable*/
void main(void){
ExtGlobal = 1000;
}
● Các biến tự động
- Khai báo trong một hàm / thủ tục
- Biến chỉ hiển thị (có phạm vi) trong hàm đó
+ Không gian cho biến được cấp phát trên ngăn xếp hệ thống khi
thủ tục được nhập. Bỏ cấp phát, được sử dụng lại, khi thủ tục
được thoát
+ Nếu chỉ có 1 hoặc 2 biến, trình biên dịch có thể cấp phát chúng
vào các thanh ghi trong thủ tục đó, thay vì cấp phát bộ nhớ.
+ Giá trị không được giữ lại giữa các lần gọi thủ tục
● Các biến tĩnh
- Biến tĩnh là lớp lưu trữ thứ ba, bên cạnh các biến extern và biến tự
động.
- Khai báo bên trong hoặc bên ngoài một hàm:
+ Các biến tĩnh bên trong là cục bộ của hàm mà chúng được khai
báo nhưng không giống như các biến tự động, chúng vẫn tồn tại
thay vì đến và đi mỗi khi hàm được gọi. Điều này có nghĩa là các
biến tĩnh bên trong cung cấp một kho lưu trữ vĩnh viễn, riêng tư
trong một hàm.
• chèn từ khóa tĩnh trước định nghĩa biến.
static unsigned char bob;
static int pressure[10];
- Các biến tĩnh bên ngoài hiển thị trong phần còn lại của tệp nguồn mà
chúng được khai báo, nhưng không hiển thị trong bất kỳ tệp nào khác.
• Sử dụng các khai báo "normal"
int count;
● Khai báo biến (Register variable)
Lớp lưu trữ thứ tư và cuối cùng là thanh ghi. Một tờ khai đăng ký thông
báo cho trình biên dịch rằng biến sẽ được sử dụng nhiều. Nếu có thể, các
biến thanh ghi được đặt trong các thanh ghi của bộ xử lý vì chúng cung
cấp quyền truy cập nhanh nhất.
● Biến không đổi và biến động
- const: việc áp dụng từ khóa const trong một khai báo chỉ ra cho trình
biên dịch biết rằng đối tượng sẽ được coi như một hằng số và không thể
bị thay đổi.
- volatile: việc áp dụng từ khóa “volatile” trong một khai báo chỉ ra cho
trình biên dịch biết rằng nội dung của đối tượng có thể bị thay đổi không
thể đoán trước và không nên được tối ưu hóa. Ví dụ, nó có thể là một
biến sẽ được thay đổi bởi một quy trình dịch vụ ngắt, hoặc một thanh
ghi I / O sẽ được thay đổi bởi một thiết bị I / O.
● Con trỏ và địa chỉ
- Con trỏ có lẽ là khái niệm khó nhất trong C.
- Con trỏ là một biến chứa địa chỉ của một biến khác.
- Con trỏ rất phổ biến trong C vì chúng thường dẫn đến mã nhỏ gọn và
hiệu quả hơn.
- Vì một con trỏ chứa địa chỉ của một đối tượng, nên có thể truy cập gián
tiếp vào đối tượng thông qua con trỏ.
- Xem xét đoạn mã:

● Con trỏ
- Khi các biến được truyền theo giá trị, bản sao của các đối số đầu
vào được thực hiện khi hàm được gọi. Đây là những bản sao cục
bộ; chúng bị xóa khi chức năng kết thúc.
- Khi các biến được chuyển qua tham chiếu, các đối số đầu vào là địa chỉ
bộ nhớ (lấy bằng cách sử dụng &). Chúng được sao chép cục bộ (như
trước đây), nhưng chúng được sử dụng cục bộ để thay đổi giá trị của các
biến mà chúng "trỏ" vào. Khi chúng ta khai báo một con trỏ, chúng ta
phải nói loại biến mà nó trỏ đến (sử dụng *).
● Mảng
- Mảng là một tập hợp dữ liệu, được lưu trữ trong các vị trí bộ nhớ liên
tiếp, bắt đầu từ một địa chỉ được đặt tên
- Khai báo tên mảng và số phần tử dữ liệu, N
int n [5]; // khai báo mảng 5 giá trị "int"
- Tên mảng thực chất là một bút danh cho địa chỉ của phần tử đầu tiên.
• tức là tên là một con trỏ đến phần tử đầu tiên.
- Các phần tử được "lập chỉ mục", với các chỉ số [0 .. N-1]
n [3] = 5; // đặt giá trị của 4 phần tử array
• Chúng ta cũng có thể truy cập các phần tử thông qua một con trỏ, ví
dụ: p = x+9;

● Struct
- Cấu trúc là một tập hợp của một hoặc nhiều biến, có thể là các kiểu khác
nhau, được nhóm lại với nhau dưới một tên duy nhất để thuận tiện cho
việc xử lý.
- Các cấu trúc giúp tổ chức dữ liệu vì chúng cho phép một nhóm các biến
liên quan được coi như một đơn vị thay vì các thực thể riêng biệt.
- Cấu trúc có thể được xác định bằng cách sử dụng câu lệnh C “struct”.

- Một tên tùy chọn được gọi là thẻ cấu trúc có thể theo sau từ struct (như
với struct clock ở đây). Thẻ có thể được sử dụng để tham chiếu đến cấu
trúc.
● Biến struct
- Dấu ngoặc nhọn kết thúc cấu trúc có thể được theo sau bởi một danh
sách các biến, giống như đối với bất kỳ kiểu cơ bản nào. Đó là,
struct {. . . } x, y, z; về mặt cú pháp tương tự như int x, y, z;
- Một khai báo cấu trúc không được kèm theo bởi danh sách các biến
phân bổ không có bộ nhớ; nó chỉ đơn giản mô tả một khuôn mẫu cho
cấu trúc. Tuy nhiên, nếu cấu trúc được gắn thẻ, tên này có thể được sử
dụng trong khai báo biến.
struct clock timer;
- Các thành viên của một cấu trúc có thể được gọi bằng cách sử dụng toán
tử “.”, như trong:
timer.sec = 60;
● typedef
- Từ khóa typedef cho phép tạo các tên kiểu dữ liệu mới. Ví dụ:
typedef struct clock time_t; /* time_t là từ đồng nghĩa với struct clock */
time_t timer; / * khai báo var hẹn giờ tốt hơn * /
- typedef thường được sử dụng để xác định tên kiểu viết tắt, ví dụ, Keil
thường bao gồm tiêu đề <stdint.h> trong chương trình của họ, đây là
đoạn code:
/* exact-width signed integer types */
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed long long int int64_t;
- Để làm cho kiểu dữ liệu nổi bật trong một chương trình, quy ước rằng
các tên được kết thúc bằng _t đôi khi được chấp nhận (t == type)
● Truy cập các phần tử cấu trúc
- Có thể truy cập các trường riêng lẻ trong một cấu trúc bằng cách sử
dụng ký hiệu dấu chấm,
ví dụ: clock.hours = 1;
- Cũng có thể truy cập các trường trong một cấu trúc thông qua một con
trỏ,
ví dụ. pclock → hours = 1; / * pclock là một con trỏ đến đồng hồ * /
● Structures and Peripherals I
- Bộ xử lý nhúng thường chứa I / O song song, USART, Bộ hẹn giờ, v.v.
+ Mỗi thiết bị ngoại vi này có một tập hợp các thanh ghi liên quan
cho phép nó được cấu hình và sử dụng (ví dụ: cổng GPIO E,
trong Labs 1 và 2).
- Thanh ghi cho mỗi thiết bị ngoại vi được định nghĩa là một cấu trúc
+ Khi trình biên dịch thấy một khai báo struct, nó sẽ dự trữ không
gian bộ nhớ. Bằng cách sắp xếp cho không gian này ánh xạ vào
các thanh ghi ngoại vi, chúng ta có thể tham chiếu gọn gàng từng
thanh ghi.
- Chúng ta sử dụng câu lệnh này để xuất ra một số đếm (i) cho các đèn
LED trong Lab 2
GPIOE → ODR = i << 8;
trong đó Output Data Register (ODR) là một trường được xác định
trong cấu trúc GPIOE là một con trỏ đến cấu trúc
- Các chân A-E của cổng GPIO có thể được cấu hình ở nhiều chế độ khác
nhau bằng cách ghi vào thanh ghi điều khiển cổng.
- Bản thân các thanh ghi là bộ nhớ được ánh xạ vào không gian địa chỉ
trung tâm ARM.
- Quyền truy cập vào ODR thực sự phân giải thành một địa chỉ bộ nhớ.
V. Operations
● Arithmetic operations (Các phép tính toán)


● Second C Program: Add Two integers (Thêm hai số nguyên )
- Toán tử & cung cấp địa chỉ của một đối tượng
+ Sử dụng “& a” để tìm và chuyển tới địa chỉ của biến a
- Toán tử% xác định một đặc tả định dạng (% i đề cập đến số
nguyên)

● Bitwise Operators in C (Toán tử Bitwise trong C)


- Các toán tử bitwise này được sử dụng rộng rãi trong kỹ thuật phần mềm
cho các hệ thống nhúng và điều khiển.
- Toán tử logic song song (theo chiều dọc theo bit) tạo ra kết quả n bit của
phép toán logic tương ứng:

● Setting and Clearing (masking) bits (Các bit cài đặt và xóa (che))

-
- Chương trình sau chỉ chuyển đổi liên tục bit 4 của var1 mà không làm
ảnh hưởng đến các bit còn lại?
- Chương trình sau chỉ chuyển đổi liên tục bit 4 của var1 mà không làm
ảnh hưởng đến các bit còn lại?
- Các thiết bị ngoại vi (ví dụ: cổng GPIO, ADC, v.v.) thường được cấu
hình và điều khiển bởi một tập hợp các thanh ghi. Các bit riêng lẻ của
thanh ghi có thể cần được đọc (hoặc ghi).
- Nếu một bit thanh ghi (hoặc nhóm) được ghi (thành 1 hoặc 0) thì thường
xảy ra trường hợp các bit khác được giữ nguyên.
- Khi đọc một thanh ghi, chúng ta có thể xác định các bit riêng lẻ bằng
cách sử dụng MASK được gọi là MASK theo bit khôn ngoan VÀ phù
hợp với nội dung thanh ghi. (Ví dụ: Dòng 32 kiểm tra bit 7 của thanh
ghi GPIOB).

● Testing bit with bitwise operators in C (Kiểm tra bit với các toán tử
bitwise trong C)
-Viết chương trình C để giám sát bit 5 của var1. Nếu nó là CAO, hãy
thay đổi giá trị của var2 thành 0x55; nếu không, hãy thay đổi giá trị của
var2 thành 0xAA.
● Bitwise shift operator in C (Toán tử dịch chuyển bit trong C )

1. 0b00010000 >> 3 / * nó bằng 00000010. Dịch sang phải 3 lần * /


2. 0b00010000 << 3 / * nó bằng 10000000. Di chuyển sang trái 3 lần * /
3. 1 << 3 / * nó bằng 00001000. Dịch sang trái 3 lần * /

- Shift operations are also useful for creating masks

- Dòng 24 đặt bit 6 của thanh ghi APB2ENR Đặt lại và Điều khiển Đồng
hồ (giữ nguyên các bit khác).

VI. Control Structures


● C control structures:
- Kiểm soát thứ tự thực hiện các lệnh (luồng chương trình)
+ Thực hiện có điều kiện
- Thực hiện một tập hợp các câu lệnh nếu một số
điều kiện được đáp ứng
- Chọn một tập hợp các câu lệnh sẽ được thực hiện
từ một số tùy chọn, tùy thuộc vào một hoặc nhiều
điều kiện
+ Thực hiện lặp đi lặp lại
- Thực hiện lặp đi lặp lại một tập hợp các câu lệnh
+ Một số lần được chỉ định, hoặc
+ Cho đến khi một số điều kiện được đáp ứng, hoặc
+ Trong khi một số điều kiện là đúng
● Relational Operators (Toán tử quan hệ )
- Kiểm tra mối quan hệ giữa hai biến / biểu thức
- Trình biên dịch sử dụng so sánh có dấu hoặc không dấu, phù hợp
với các loại dữ liệu

-
Example:
-
unsigned char a,b;
int j,k; if (a < b)
- unsigned if (j > k)
- signed
● Boolean operators (Toán tử boolean )
- Toán tử Boolean && (AND) và || (OR) tạo ra
- Kết quả TRUE / FALSE khi thử nghiệm nhiều
- Điều kiện TRUE / FALSE
- if ((n> 1) && (n <5)) // kiểm tra n từ 1 đến 5
- if ((c = ‘q’) || (c = ‘Q’)) // kiểm tra c = chữ thường hoặc chữ hoa
Q
- • Lưu ý sự khác biệt giữa các toán tử Boolean &&, || và toán tử
logic bit &, |
- if (k && m) // kiểm tra nếu k và m đều ĐÚNG (các giá trị khác
0)
- if (k & m) // tính theo từng bit AND giữa m và n, // kiểm tra xem
kết quả có khác 0 hay không (TRUE)
● Common error (Lỗi chung )
- Lưu ý rằng == là một toán tử quan hệ, trong khi = là một
- toán tử gán.
- if (m == n) // kiểm tra tính bình đẳng của các giá trị của biến m và n
- if (m = n) // gán giá trị của n cho biến m, và sau đó
// kiểm tra xem giá trị đó có phải là TRUE (khác không)
- Dạng thứ hai là một lỗi phổ biến (bỏ qua dấu bằng thứ hai), và
thường tạo ra kết quả không mong muốn, cụ thể là điều kiện TRUE
nếu n là 0 và FALSE nếu n khác 0.

● If-Else

● Else - if

● switch
● while

● do-while

● For
- Chương trình trên in ra gì?
● Break

-
- getline trả về chiều dài của dòng
- Bên trong vòng lặp while bắt đầu từ ký tự cuối cùng của dòng(gọi lại --n(trước)
giảm n trước khi sử dụng biến), và quét lại phía sau tìm kiếm ký tự đầu tiên mà
không phải khoảng trắng, tab hoặc newline. Vòng lặp kết thúc khi một trong
những điều kiện kia xảy ra, hoặc khi n âm(ví dụ khi ký tự kết thúc dòng được
tìm thấy).
VII. Functions
1. Phạm vi
- Các biến trong main là private hoặc local với main; bởi vì chúng được khai báo bên
trong hàm main không có chức năng nào khác có thể có quyền truy cập trực tiếp
vào chúng:
- Điều này cũng đúng với các biến trong các hàm khác; ví dụ các biến trong getline
hoàn toàn không liên quan đến những thứ trong main.
- Mỗi biến cục bộ xuất hiện khi hàm được gọi, và biến mất khi kết thúc hàm; vì lý
do này, các biến được gọi là biến tự động.
- Để thay thế cho các biến tự động, có thể xác định các biến toàn cục có thể được
truy cập bởi bất kỳ chương trình con nào.
- Vì các biến toàn cục vẫn tồn tại vĩnh viễn nên chúng có thể được sử dụng để chia
sẻ dữ liệu giữa các hàm.
2. Chia sẻ dữ liệu và biến toàn cục

- Một thay đổi nhỏ ở điều kiện vòng lặp while:


while(len==getline()>0)
kết quả ở len luôn luôn bằng 1 , tại sao?

● Functions
- Chương trình con chia chương trình thành các tác vụ nhỏ hơn:
+ Giúp quản lý chương trình phức tạp
+ Các nhiệm vụ nhỏ được thiết kế dễ dàng gỡ lỗi
+ Chương trình con có thể tái sử dụng thay vì việc khởi tạo
+ Có thể sử dụng các thư viện của chương trình con phát triển bởi
bên thứ 3 thay cho việc tự tạo
- Một chương trình con được gọi bởi nhiều chương trình khác để thực hiện một
tác vụ :
+ Chương trình con có thể trả về kết quả qua lời gọi
+ Một hoặc nhiều tham số có thể bỏ qua trong chương trình con/hàm
- Một hàm có kết cấu:

-
- Một hàm tối thiểu là :
void dummy(){}
- Một chương trình chỉ có duy nhất một bộ các chương trình con xác định các
chức năng riêng
- Giao tiếp giữa chương trình con đảm bảo:
+ Tham số và giá trị trả về
+ biến bên ngoài
- Chương trình con xác định có thể thể hiện theo nhiều thứ tự trong file nguồn
hoặc được tách ra bởi nhiều file, miễn là không có chức năng riêng lẻ nào được
phân chia.
3. Định nghĩa chương trình con

- Chương trình con rất quan trọng trong thiết kế(trừu tượng) công cụ:
+ Chúng cho phép chúng ta cấu trúc một tác vụ lớn thành các phần
nhỏ(dễ dàng quản lý), chi tiết có thể ẩn qua những lời gọi hàm.
4. Tham số của chương trình con
- Tham số của chương trình con được truyền giá trị:
+ Chương trình con nhận một tham số riêng tạm thời, không phải địa chỉ của
nó điều này có nghĩa là hàm đó không thể ảnh hưởng đến đối số ban đầu
của lệnh gọi hàm.
+ Trong hàm, mỗi đối số có hiệu lực là một biến cục bộ.
- Khi tên mảng xuất hiện dưới dạng đối số của một hàm,
+ vị trí của mảng được truyền; các phần tử không được sao chép.
+ mảng được truyền bằng tham chiếu.
- Bất kỳ biến nào cũng có thể được chuyển qua tham chiếu bằng cách sử dụng
toán tử & để
+ lấy địa chỉ của biến.
5. Tham chiếu với tham trị

VIII. SummaryConstant/literal values


- Tuần này sẽ tập trung vào các khía cạnh của ngôn ngữ C
- Đặc biệt, chúng ta đã xem xét cách ánh xạ các thanh ghi (được sử dụng để điều
khiển thiết bị ngoại vi) với các địa chỉ vật lý.
- Phần này xuất hiện trong đề thi

I/O CHO HỆ THỐNG NHÚNG

1. Cấu trúc thiết bị vào ra:


- Bao gồm các mạch analog hoặc ko phải điện tử.
- Giao diện kỹ thuật số điển hình với CPU:
+ Bao gồm dữ liệu, trạng thái và thanh ghi điều khiển được truy cập
bởi CPU.
+ Một số thanh ghi có thể ở chế độ chỉ đọc, trong khi những thanh
ghi khác có thể đọc được hoặc có thể ghi
2. Định địa chỉ cho thiết bị I/O:
● Định địa chỉ I/O được ánh xạ vào bộ nhớ:
- I/O chiếm một vài địa chỉ trong không gian bộ nhớ
- VD: bus 16 đường địa chỉ được quản lý bởi thanh ghi 64kb
+ 32k bộ nhớ thấp gán cho bộ nhớ mem
+ 32k bộ nhớ cao gán địa chỉ cho thiết bị I/O
● Định địa chỉ I/O được ánh xạ tiêu chuẩn:
- Ánh xạ vào không gian của I/O, cần thêm chân (M/IO) quy định
để xuất đến I/O hoặc mem.
- VD Bus có địa chỉ 16 bit:
+ 64K địa chỉ cho mem ⇒ M/IO = 0
+ 64K địa chỉ cho I/O ⇒ M/IO = 1
3. I/O programing
● Có 2 loại lệnh hỗ trợ I/O
- Lệnh I/O đặc biệt.
- Lệnh I/O lưu trữ/tải được ánh xạ vào bộ nhớ.
- VD intel x86 thiết kế 2 tập lệnh I/O
+ Cung cấp không gian địa chỉ riêng cho I/O
- Phần lớn các CPU khác đều sử dụng phương pháp ánh xạ vào bộ
nhớ:
+ các thanh ghi sử dụng load, store để truy xuất.
4. Lập trình I/O:
- Một thiết bị ngoại vi yêu cầu một quá trình khởi tạo trước khi nó có thể
được sử dụng.
● 4 bước của quá trình khởi tạo:
- Lập trình mạch điều khiển clock
- Cấu hình chế độ hoạt động của các chân I / O
+ Các chân I / O đa hợp có thể được sử dụng cho nhiều mục đích là
cần thiết để cấu hình các chế độ mong đợi (hướng đầu vào / đầu
ra, chức năng, v.v.) các đặc tính điện (ví dụ: điện áp, kéo lên /
xuống, mở cống, v.v.).
- Cấu hình ngoại vi
- Cấu hình ngắt

5. Cơ chế vào ra (Polling - Interrupt)


-Giả sử một thiết bị ngoại vi nhận dữ liệu không liên tục, dữ liệu này phải
được xử lý bởi bộ xử lý.
- Bộ xử lý có thể poll thiết bị ngoại vi thường xuyên để xem liệu dữ liệu
đã đến hay chưa - lãng phí (giải pháp S / W).
- Thiết bị ngoại vi có thể ngắt bộ xử lý khi nó có dữ liệu (giải pháp H /
W).
- Ngắt yêu cầu thêm một chân (hoặc các chân), được gọi là int: Nếu Int là
1, bộ xử lý sẽ tạm dừng chương trình hiện tại, chuyển đến một Quy trình
Interrupt hoặc ISR.
- Được gọi là I / O điều khiển gián đoạn
- Về cơ bản, "Polling" chân ngắt được tích hợp sẵn trong phần cứng, vì
vậy không mất thêm thời gian!
● POLLING
- Polling sẽ liên tục kiểm tra trạng thái của thiết bị ngoại vi. VD như nhập
dữ liệu từ bàn phím
- Nhược điểm:
+ Tốn CPU, năng lượng
+ Đáp ứng hệ thống bị chậm đi. VD khi hệ thống gọi vòng n thiết
bị ngoại vi, cơ chế polling gọi từ 1 - n mới thực hiện được, không
có mức ưu tiên cho các thiết bị I/O.

● INTERRUPT
- Cơ chế Interrupt sẽ chỉ ra thiết bị I/O nào đang gửi tín hiệu về, chờ đến
khi CPU thực hiện xong lệnh sẽ thực thi tín hiệu I/O gửi về.
- Giải pháp phần cứng, nhận tín hiệu I/O qua các chân.
- Giải quyết được vấn đề năng lượng cho CPU
- Đánh giá được mức ưu tiên.
- Lưu nội dung của thanh ghi bên trong của CPU và thông tin trạng thái
trong Thiết bị điều khiển
6. Cơ chế ngắt:
● Chương trình xử lý ngắt:
- Chương trình được gọi và thực hiện bằng phần cứng, có bug
không theo quy luật.
- Nên viết chương trình xử lý ngắt càng ngắn càng tốt, thực hiện
trong khoảng thời gian ngắn.
● Cơ chế ngắt cố định ISR:
- Địa chỉ ngắt cố định, đã được tích hợp sẵn trong bộ vi xử lý,
không thể thay đổi.
- ISR được lưu trữ tại địa chỉ hoặc chuyển đến ISR thực được lưu
trữ nếu không có đủ byte. cơ chế xem slide
● Cơ chế vector ngắt ISR:
- Địa chỉ ngắt cho thiết bị ngoại vi cung cấp.
- Phổ biến khi bộ vi xử lý có nhiều thiết bị ngoại vi được kết nối
bởi một bus hệ thống.
- Sự khác nhau giữa Exceptions và Interrupts:
+ EX: xảy ra bên trong hệ thống
+ In: xảy ra bên ngoài hệ thống
7. Priorities and vectors
- Hai cơ chế cho phép thực hiện ngắt linh hoạt:
+ Priorities: xác định Interrupt nào lấy CPU đầu tiên.
+ Interrupt vector Table: cho phép các thiết bị ngắt khác nhau được
xử lý bởi trình xử lý khác nhau.
- Vectors number (hoặc Số ngắt) xác định mã nào được ưu
tiên cho từng loại ngắt.
- Handler address trỏ đến điểm vào ngắt trong bộ nhớ.
- Các cơ chế là trực giao: hầu hết các CPU đều cung cấp cả hai.
- Các ngắt được ưu tiên cho phép CPU bỏ qua các yêu cầu ngắt ít quan trọng hơn
trong khi nó xử lý các yêu cầu quan trọng hơn.

8. Prioritized interrupts (Mức ưu tiên):


-Cơ chế ưu tiên được đảm bảo ngắt ưu tiên thấp hơn không được xử lý
trước khi có ngắt ưu tiên cao hơn đang xử lý.
- CPU gán mức ưu tiên cho các đường nhận ngắt.
+ Masking: khi ngắt có ưu tiên thấp hơn tác động vào khi có ngắt
ưu tiên cao hơn đang xử lý thì mức thấp hơn bị che đi.
+ Non-maskable interrupt (NMI): đây là mức ưu tiên cao nhất,
không bao giờ bị từ chối (vd nút nguồn).
● Ngắt trên chip Cortex-m ARM
https://thongrobot.wordpress.com/2019/06/25/ngat-va-xu-ly-ngat-tren-chip-
arm-cortex-m-nvic-va-exti/
slide 42 trở đi ko biết dịch kiểu j
Thiết bị nhớ
1. Các khái niệm cơ bản
Lưu trữ số lượng lớn các bit:
- m x n: m từ gồm n bit mỗi từ.
- k = Log2 (m) tín hiệu đầu vào địa chỉ.
Truy cập bộ nhớ
- - r / w: chọn đọc hoặc ghi - enable: chỉ đọc hoặc ghi khi được xác
nhận.
- - đa cổng: nhiều quyền truy cập đồng thời đến các địa điểm khác
nhau.
1.1. Khả năng viết và khả năng lưu trữ dài hạn
- Phân biệt bộ nhớ ROM/RAM truyền thống
- ROM
• chỉ đọc, các bit được lưu trữ mà không cần nguồn điện
- RAM
• đọc và ghi, mất các bit được lưu trữ khi không có nguồn điện
- Sự phân biệt truyền thống bị xóa mờ
- ROM nâng cao có thể được ghi vào
• ví dụ: EEPROM
- RAM nâng cao có thể chứa các bit mà không cần
sức mạnh
• ví dụ: NVRAM
- Khả năng viết
Cách thức và tốc độ bộ nhớ có thể bằng văn bản
- Tính lâu dài của bộ nhớ
Khả năng của bộ nhớ để giữ các bit được lưu trữ sau khi chúng được viết
1.1.1. Khả năng viết
- Các khoảng:
- Cao cấp
● bộ xử lý ghi vào bộ nhớ một cách đơn giản và nhanh chóng
● ví dụ: RAM
- Tầm trung
● bộ xử lý ghi vào bộ nhớ, nhưng chậm hơn
● ví dụ: FLASH, EEPROM
- Cấp thấp hơn
● thiết bị đặc biệt, "bộ lập trình", phải được sử dụng để ghi vào bộ
nhớ
● ví dụ: EPROM, OTP ROM
- Cấp thấp
● bit chỉ được lưu trữ trong quá trình chế tạo
● ví dụ: ROM được lập trình cơ chế mặt nạ
- Bộ nhớ lập trình trong hệ thống
● Có thể được ghi bởi một bộ xử lý trong hệ thống nhúng bằng cách
sử dụng bộ nhớ
● Bộ nhớ có khả năng viết cao cấp và tầm trung

1.1.2. Lưu trữ dài hạn


- Các khoảng
- Cao cấp
● về cơ bản không bao giờ mất bit
● ví dụ: ROM được lập trình mặt nạ
- Tầm trung
● giữ từng bit ngày, tháng hoặc năm sau khi nguồn điện của bộ nhớ
bị tắt
● ví dụ: NVRAM
- Cấp thấp hơn
● giữ các bit miễn là nguồn cung cấp cho bộ nhớ
● ví dụ: SRAM
- Cấp thấp
● bắt đầu mất bit gần như ngay lập tức sau khi được viết
● ví dụ: DRAM
- Bộ nhớ không linh hoạt
- Giữ các bit sau khi nguồn điện không còn được cung cấp
- Tính lâu dài của phạm vi lưu trữ cao cấp và trung bình
1.2. ROM: “Read-only” memory
- Bên trong của một 8x4 ROM

1.2.1. ROM lập trình theo cơ chế mặt nạ


- Các kết nối được "lập trình" khi chế tạo
- bộ mặt nạ.
- Khả năng viết thấp nhất
- chỉ một lần.
- Khả năng lưu trữ lâu dài cao nhất
- bit không bao giờ thay đổi trừ khi bị hỏng.
- Thường được sử dụng cho thiết kế cuối cùng của các hệ thống khối lượng
lớn.
- phân bổ chi phí NRE để có chi phí đơn vị thấp
1.2.2. OTP ROM: ROM lập trình 1 lần
- Các kết nối được người dùng “lập trình” sau khi sản xuất
- người dùng cung cấp tệp nội dung mong muốn của ROM
- đầu vào tệp vào máy được gọi là chương trình ROM
- mỗi kết nối có thể lập trình là một cầu chì
- Lập trình viên ROM thổi cầu chì ở những nơi không nên tồn tại các kết
nối.
- Khả năng ghi rất thấp
- thường chỉ được viết một lần và yêu cầu thiết bị lập trình ROM
- Khả năng lưu trữ lâu dài rất cao
- bit không thay đổi trừ khi được kết nối lại với lập trình viên và nhiều
cầu chì ngắt hơn
- Thường được sử dụng trong các sản phẩm cuối cùng
- rẻ hơn, khó sửa đổi tùy ý
1.2.3. EPROM: Erasable programmable ROM: ROM có khả năng lập trình xóa
- Thành phần có thể lập trình là một bóng bán dẫn MOS
- Transistor có cổng "nổi" được bao quanh bởi chất cách điện
- (a) Các điện tích âm tạo thành một kênh giữa nguồn và cống
lưu trữ một logic 1
- (b) Điện áp dương lớn ở cổng gây ra các điện tích âm di chuyển ra khỏi
kênh và bị mắc kẹt trong cổng nổi lưu trữ một logic 0
- (c) (Xóa) Chiếu tia UV lên bề mặt của cổng nổi làm cho các điện tích
âm trở lại kênh từ cổng nổi để khôi phục logic 1
- (d) Một gói EPROM hiển thị cửa sổ thạch anh qua đó
Tia UV có thể đi qua
- Khả năng viết tốt hơn
- có thể được xóa và lập trình lại hàng nghìn lần
- Giảm thời gian lưu trữ lâu dài
- chương trình kéo dài khoảng 10 năm nhưng dễ bị ảnh hưởng bởi
bức xạ và tiếng ồn điện
- Thường được sử dụng trong quá trình phát triển thiết kế
1.2.4. EEPROM: Electrically erasable programmable ROM
- Được lập trình và xóa bằng điện tử
- thường bằng cách sử dụng điện áp cao hơn bình thường
- có thể lập trình và xóa các từ riêng lẻ
- Khả năng viết tốt hơn
- có thể được lập trình trong hệ thống với mạch tích hợp để cung cấp cao
hơn điện áp bình thường
● bộ điều khiển bộ nhớ tích hợp thường được sử dụng để ẩn thông
tin chi tiết khỏi người dùng bộ nhớ
- ghi rất chậm do xóa và lập trình
● Chân “bận” cho biết EEPROM của bộ xử lý vẫn đang ghi
- có thể được xóa và lập trình hàng chục nghìn lần
- Khả năng lưu trữ lâu dài tương tự đối với EPROM (khoảng 10 năm)
- Tiện lợi hơn nhiều so với EPROM, nhưng đắt hơn
1.2.5. Flash memory
- Bản mở rộng của EEPROM
- Nguyên tắc cổng nổi tương tự
- Khả năng ghi giống nhau và tính lâu dài lưu trữ
- Xóa nhanh
- Các khối bộ nhớ lớn bị xóa cùng một lúc, thay vì từng từ một
- Các khối thường lớn vài nghìn byte
- Viết các từ đơn lẻ có thể chậm hơn (xóa rồi viết)
- Toàn bộ khối phải được đọc, cập nhật từ, sau đó toàn bộ khối được ghi
lại
- Được sử dụng với các hệ thống nhúng lưu trữ các mục dữ liệu lớn trong
bộ nhớ không thay đổi
- ví dụ: máy ảnh kỹ thuật số, hộp giải mã TV, điện thoại di động
1.3. RAM: “Random - access” memory
- Điển hình là bộ nhớ dễ bay hơi
- các bit không được giữ nếu không có nguồn điện
- Đọc và ghi dễ dàng bằng hệ thống nhúng trong quá trình thực hiện
- Cấu trúc bên trong phức tạp hơn ROM
- một từ bao gồm nhiều ô nhớ, mỗi ô nhớ lưu trữ 1 bit
- mỗi dòng dữ liệu đầu vào và đầu ra kết nối với mỗi
ô trong cột của nó
- rd / wr được kết nối với mọi ô
- khi hàng được bộ giải mã bật, mỗi ô có logic lưu trữ bit dữ liệu đầu vào
khi rd / wr cho biết ghi hoặc xuất bit được lưu trữ khi rd / wr cho biết đã
đọc
1.3.1. Các dạng cơ bản của ram
- SRAM: RAM tĩnh
- Ô nhớ sử dụng flip-flop để lưu trữ bit
- Yêu cầu 6 bóng bán dẫn
- Lưu trữ dữ liệu miễn là nguồn điện được cung cấp
- DRAM: RAM động
- Ô nhớ sử dụng bóng bán dẫn MOS và tụ điện để lưu trữ bit
- Nhỏ gọn hơn SRAM
- Yêu cầu "Làm mới" do rò rỉ tụ điện
● Các ô của từ tự động được làm mới / được nạp khi đọc viết
● Các ô từ không hoạt động (không đọc / ghi) yêu cầu thủ công làm
tươi.
- Tốc độ làm tươi điển hình 15,625 microec.
- Truy cập chậm hơn SRAM
- Tiêu thụ nhiều điện năng hơn SRAM
1.3.2. Các biến thể của ram
- PSRAM: RAM giả tĩnh.
- DRAM với bộ điều khiển làm mới bộ nhớ tích hợp.
- Thay thế mật độ cao chi phí thấp phổ biến cho SRAM
- NVRAM: RAM không bay hơi
- Lưu trữ dữ liệu sau khi tháo nguồn điện bên ngoài
- RAM được hỗ trợ bằng pin
● SRAM với pin được kết nối vĩnh viễn riêng
● viết nhanh như đọc
● không giới hạn số lần ghi không giống như bộ nhớ dựa trên ROM
không linh hoạt
- SRAM với EEPROM hoặc flash
● lưu trữ toàn bộ nội dung RAM trên EEPROM hoặc flash trước khi
tắt nguồn
1.4. Kết nối bộ nhớ:
- Kích thước bộ nhớ cần thiết thường khác với kích thước sẵn sàng những
bộ nhớ có sẵn
- Khi bộ nhớ khả dụng lớn hơn, chỉ cần bỏ qua không cần thiết các bit địa
chỉ bậc cao và các dòng dữ liệu cao hơn
- Khi bộ nhớ khả dụng nhỏ hơn, hãy soạn nhiều bản nhỏ hơn bộ nhớ vào
một bộ nhớ lớn hơn
- Nối cạnh nhau để tăng chiều rộng của các từ
- Kết nối từ trên xuống dưới để tăng số lượng từ
● Dòng địa chỉ thứ tự cao được thêm vào sẽ chọn bộ nhớ nhỏ hơn
chứa từ mong muốn bằng bộ giải mã
- Kết hợp các kỹ thuật tăng số lượng và độ rộng của từ
1.5. Memory systems and memory controllers
- Bộ nhớ có tổ chức nội bộ phức tạp .
- Bộ điều khiển bộ nhớ như giao diện giữa CPU và các thành phần bộ nhớ
- Bộ điều khiển bộ nhớ ẩn chi tiết về giao diện bộ nhớ, lịch trình chuyển
đến tối đa hóa hiệu suất.

1.6. Chanel and banks


- Các kênh và ngân hàng là hai cách để thêm song song với hệ thống bộ
nhớ:
- Các kênh cung cấp kết nối riêng biệt với các phần của bộ nhớ.
- Các ngân hàng riêng biệt mảng bộ nhớ.

2. Tổ chức hệ thống bộ nhớ (Memory System Organization)


- Hệ thống bộ nhớ sử dụng hệ thống lưu trữ phân cấp để nhanh
chóng truy cập vào dữ liệu được sử dụng phổ biến nhất trong khi
vẫn có khả năng lưu trữ lượng lớn dữ liệu
- Caches: Bộ nhớ đệm: tăng hiệu suất trung bình của hệ thống bộ
nhớ. Tốc độ xung nhịp của bộ vi xử lý đang tăng với tốc độ nhanh
hơn tốc độ bộ nhớ.
- Bộ quản lý bộ nhớ: cung cấp không gian bộ nhớ ảo lớn hơn trong
một bộ nhớ vật lý nhỏ. Kích thước chương trình lớn hơn dung
lượng của bộ nhớ vật lý.

3. Caches and CPUs


- Bộ nhớ đệm là một bộ nhớ nhỏ, nhanh, chứa các bản sao của dữ
liệu bộ nhớ thường được sử dụng.

- cache hit: vị trí được yêu cầu nằm trong bộ nhớ cache.
- Cache miss: vị trí cần thiết không có trong bộ nhớ cache.
- Working set: tập hợp các vị trí được chương trình sử dụng trong
một khoảng thời gian.
- Compulsory (cold) miss: xảy ra lần đầu tiên một vị trí được sử
dụng.
- Capacity miss: bộ làm việc quá lớn.
- Conflict miss: nhiều vị trí trong tập hợp làm việc ánh xạ vào cùng
một dòng bộ nhớ cache.
- Driven by data locality (tính cục bộ của dữ liệu):
- theo thời gian: chương trình sử dụng lại cùng một dữ liệu mà
nó đã sử dụng gần đây
- không gian: chương trình sử dụng dữ liệu gần với các vị trí
được truy cập gần đây
- Nhiều vị trí bộ nhớ chính được ánh xạ vào một mục nhập bộ nhớ
cache.
- Có thể có bộ nhớ đệm cho:
- Câu lệnh;
- dữ liệu;
- dữ liệu + câu lệnh (hợp nhất).
- Thời gian truy cập bộ nhớ là sự thay đổi.
- cache hit là dữ liệu nằm trong bộ nhớ cache
- Ánh xạ trực tiếp: mỗi vị trí bộ nhớ ánh xạ vào chính xác một mục nhập
bộ nhớ cache.
- N-way set-Associative: mỗi vị trí bộ nhớ có thể đi vào một trong n bộ.
- Liên kết hoàn toàn: bất kỳ vị trí bộ nhớ nào cũng có thể được lưu trữ tại
bất kỳ mục nhập bộ nhớ cache nào trong bộ nhớ đệm (hầu như không bao
giờ được triển khai).

4. Write Operations:
- Write-through: mỗi lần ghi đều thay đổi cả bộ đệm và vị trí bộ nhớ
chính tương ứng.
- Write-back: chỉ ghi vào bộ nhớ chính khi vị trí được xóa khỏi bộ
nhớ cache.
- Replacement policy: chiến lược để chọn mục nhập bộ nhớ cache
nào cần loại bỏ để nhường chỗ cho vị trí bộ nhớ mới.
- Two popular strategies:
- Ngẫu nhiên: yêu cầu ít phần cứng hơn để thực hiện
- Ít được sử dụng gần đây (LRU): yêu cầu tương đối nhỏ
lượng phần cứng vào bộ nhớ đệm để theo dõi thời gian kể từ
lần truy cập cuối cùng cho mỗi khối.
5. Memory Management Units (here)
- Đơn vị quản lý bộ nhớ (MMU) bù đắp cho không gian địa chỉ hạn
chế trong tập lệnh của chúng
- MMU dịch các địa chỉ: - Địa chỉ ảo / logic tham chiếu đến không
gian địa chỉ trừu tượng của chương trình
- Địa chỉ vật lý tương ứng với vị trí RAM thực tế
- Dịch địa chỉ: quá trình xác định địa chỉ vật lý từ địa chỉ ảo;
- Lỗi trang: khi truy cập địa chỉ ảo không có trong bộ nhớ vật lý

- Hai chương trình cơ bản để thực hiện bộ nhớ ảo:


- Segmented: một vùng bộ nhớ lớn, có kích thước tùy ý
- Paged: các vùng nhỏ, có kích thước cố định như nhau
- Tất cả RISC hiệu suất cao bộ vi xử lý như ARM có bộ nhớ ảo phân trang
- Phân đoạn và phân trang có thể được kết hợp trong bộ vi xử lý x86.
- Page table chứa một mục nhập cho mỗi trang ảo
- Page table register: lưu trữ địa chỉ cơ sở của bảng trang trong bộ nhớ vật
lý.
6. Caching address translations
- Các bảng dịch lớn yêu cầu quyền truy cập bộ nhớ chính.
- TLB (Dịch Lookaside Buffer): bộ đệm để dịch địa chỉ.

You might also like