Tài liệu lập trình hệ thống
I. Lý thuyết:
1. Trình bày cấu trúc CPU core i3, i5, i7:
Các dòng chip CPU Intel Core i3, i5 i7 đều thuộc dòng sản phẩm Core
của Intel, nhưng chúng những đặc điểm khác nhau về cấu trúc hiệu
suất. Dưới đây một số thông tin bản về cấu trúc của các dòng CPU
này:
Intel Core i3:
Số lõi và luồng:
Thường có ít lõi và luồng hơn so với i5 và i7. Một số phiên
bn i3 thể có 2 hoặc 4 lõi và hỗ trợ 4 hoặc 8 luồng (tùy phiên bản c
ít cache hơn so với i5 và i7.
Thấp hơn so với
i5 và i7.
Thường thích hợp
cho các công việc hàng ngày như
lướt web, xem phim, làm văn phòng, nhưng không phù hợp cho các tác vụ
yêu cầu nhiu xử lý đa nhiệm hoặc gaming nặng.
Tần số xung nhịp cơ bản (Base Clock):
thể).
Hiệu suất đa nhiệm:
Cache:
Intel Core i5:
Thường có 4 lõi và hỗ trợ 4 luồng (4 lõi / 4 luồng) hoặc 6
lõi và h tr6 luồng (6 lõi / 6 luồng).
cache lớn hơn so với i3, giúp tăng hiệu suất xử lý dữ
liệu.
Tốt hơn so với i3.
Thích hợp cho
nhiều tác vụ đa
nhiệm, xử lý dữ liệu và
Tần số xung nhịp cơ bản (Base Clock):
Hiệu suất đa
nhiệm:
gaming.
Cache:
Intel Core i7:
Số lõi và luồng:
Thường có 4, 6 hoặc 8 lõi với hỗ trợ 8 hoặc 12 luồng (8
lõi / 8 lung hoặc 8 lõi / 12 luồng).
cache lớn hơn so với cả i3 và i5, giúp cải thiện hiệu suất xử lý dữ
Thường cao hơn
so với i5 i3.
Tần số xung nhịp cơ bản (Base Clock):
liệu.
Hiệu suất đa
nhiệm:
Cache:
Thích hợp cho các tác vụ đa nhiệm nặng, xử lý video,
thiết kế đ ha và gaming chuyên nghiệp.
Tổng kết:
i3:
Dành cho người dùng thông thường với yêu cầu cơ bản về hiệu suất.
Phù hợp với người dùng muốn hiệu suất tốt hơn nhu cầu đa nhiệm
trung bình.
Cho người dùng chuyên nghiệp hoặc yêu cầu hiệu suất cao trong các tác
vụ đa nhiệm nặng.
i5:
i7:
2. Trình bày cấu trúc ngăn xếp:
Trong lập trình hệ thống, cấu trúc ngăn xếp được sử dụng trong các
thành phần sau:
Hệ điều hành: Hệ điều hành sử dụng cấu trúc ngăn xếp để lưu trữ trạng
thái của các tiến trình và các luồng.
Thư viện chuẩn: Thư viện chuẩn cung cấp các hàm để thao tác với cấu
trúc ngăn xếp, chẳng hạn như push(), pop() và peek().
Ngôn ngữ lập trình: Nhiều ngôn nglập trình cung cấp hỗ trợ tích hợp
cho cấu trúc ngăn xếp. dụ, ngôn ngữ C có các hàm push(), pop()
peek().
3. Trình bày chương trình con trong Assembly:
Chương trình con trong assembly là một đoạn mã thể được gọi từ các
chương trình khác. Chương trình con thường được sử dụng để thực hiện
các nhiệm vụ cụ thể, chẳng hạn như tính toán một hàm toán học hoặc xử
lý dữ liệu.
Khai báo chương trình con
Để khai báo một chương trình con, bạn cần sử dụng lệnh proc. Lệnh
này nhận hai tham số:
Tên chương trình con
Kiểu dữ liệu trả về
Ví dụ:
Đoạn mã
proc sum(int a, int b)
content_copy
Tên chương trình con phải bắt đầu bằng chữ cái không được
trùng với tên của các biến hoặc chương trình con khác. Kiểu dữ liệu
trả về có thể là int, char, float, double, hoặc void.
Kết thúc khai báo chương trình con
Để kết thúc khai báo chương trình con, bạn cần sử dụng lệnh endp.
Viết mã chương trình con
của chương trình con sẽ được viết giữa hai lệnh proc endp.
của chương trình con có thể bao gồm các lệnh assembly như mov, add,
sub, mul, div, cmp, jmp, jne, je, jg, jl, lea, push, pop, v.v.
Trả về từ chương trình con
Để trả về từ chương trình con, bạn cần sdụng lệnh ret. Lệnh này có
thể không có tham số hoặc có một tham số là giá trị trả về của chương
trình con.
Cách gọi chương trình con
Để gọi một chương trình con, bạn cần sử dụng lệnh call. Lệnh này nhận
một tham số là tên của chương trình con cần gọi.
Ví dụ:
Đoạn mã
proc main
mov ax, 10
mov bx, 20
call sum
mov cx, ax
endp
Chương trình
trên sẽ gọi
chương trình
con sum()
với tham số a
= 10 và b =
20. Kết quả
của chương
trình con sẽ
được lưu trữ
trong biến cx
II. Code:
1. Arduino:
a. Điều khiển hệ thống đèn qua Internet:
#define BLYNK_TEMPLATE_ID "TMPL6v74uiG9n"
#define BLYNK_TEMPLATE_NAME "test blynk1"
#define BLYNK_AUTH_TOKEN "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G"
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G";
char ssid[] = "Nhật Eo Vì";
char pass[] = "mangyeulam";
#define led D1
int button1;
int tudong = HIGH;
int cambien = 500;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(led, OUTPUT);
pinMode(cambien, INPUT);
}
BLYNK_WRITE(V0){
tudong = param.asInt();
if(tudong == 1){
int value = analogRead(cambien);
BLYNK_WRITE(V2){
Blynk.virtualWrite(V2, value);
if (value > 500) {
digitalWrite(led, LOW);
} else {
digitalWrite(led, HIGH);
}
}
}
else{
BLYNK_WRITE(V1){
button = param.asInt();
if(button == 1){
digitalWrite(led, HIGH);
}
else{
digitalWrite(led, LOW);
}
}
}
}
void loop() {
// put your main code here, to run repeatedly:
Blynk.run();
}
b. Điều khiển hệ thống máy bơm qua Internet:
#define BLYNK_TEMPLATE_NAME "test blynk1"
#define BLYNK_AUTH_TOKEN "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G"
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
char auth[] = "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G";
char ssid[] = "Nhật Eo Vì";
char pass[] = "mangyeulam";
#define maybom D1
#define DHTPIN D5
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
int button_tudong;
int button_maybom;
float nhietdo;
float doam;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(maybom,OUTPUT);
}
BLYNK_WRITE(V0){
button_tudong = param.asInt();
if(button_tudong == 1){
doam = dht.readHumidity();
nhietdo = dht.readTemperature();
Blynk.virtualWrite(V1,nhietdo);
Blynk.virtualWrite(V2,doam);
if(doam < 30 || nhietdo > 50){
digitalWrite(maybom, HIGH);
}else{
digitalWrite(maybom, LOW);
}
}
else{
BLYNK_WRITE(V3){
button_maybom = param.asInt();
if(button_maybom==1){
digitalWrite(maybom, HIGH);
}else{
digitalWrite(maybom, LOW);
}
}
}
}
void loop() {
// put your main code here, to run repeatedly:
Blynk.run();
}
2. Assembly:
a. Nhập vào ký tự đầu tiên của tên SV, sau đó in ra chuỗi ký tự từ A
đến ký tự vừa nhập:
data segment
space db " $"
enter db 10, 13, "$"
ends
stack segment
dw 128 dup(0)
ends
code segment assume
cs:code, ds:code
start:
mov ah,1 ;nhap ky tu dau cua ten SV
int 21h
mov cl, al
mov bl, 'A' LAP:
; vong lap mov ah,
9
lea dx, enter ; dat chuoi enter vao thanh ghi dx
int 21h
mov ah, 2
mov dl, bl
int 21h
inc
bl
cmp cl, bl ; so sanh bl voi cl, nhay toi nhan
al_nho_hon
jl al_nho_hon
jmp LAP ; nhay toi nhan LAP
al_nho_hon: jmp end_if ; nhay
toi nhan end_if
end_if:
IN_END:
mov ax, 4c00h
int 21h
ends
end start
b. Nhập vào 1 số bất kỳ, sau đó in ra chuỗi Đại học Kiến trúc
data segment
num db ? mess db "DH
Kien Truc$" ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; Nhap so tu bàn
phim mov ah, 1 lea
dx, num int 21h
; In so da nhap
mov ah, 2
lea dx, num
int 21h
; Dat con tro vi tri dong 20, cot
10 mov ah, 02h mov bh, 0
mov dh, 20 mov dl, 10
int 10h
mov ah, 09h
lea dx, mess
int 21h
; Ket thuc chuong
trinh mov ah, 4Ch
int 21h
mov ax, 4c00h
int 21h ends
end start
//Điều khiển arduino điều khiển hệ thống làm mát bằng relay và cảm biến nhiệt độ,
đọ ẩm ở 2 chế dộ tự động và thủ công qua internet
// khởi tạo và kết nối
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "";
char ssid[] = "";
char pass[] = "";
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int soilMoisturePin = A0; // chân cảm biến độ ẩm
const int relayPin = 12; // chân relay
BlynkTimer timer;
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
timer.setInterval(60000, sendSensorData); // Gửi dữ liệu cảm biến mỗi 60 giây
}
void loop() {
Blynk.run();
timer.run();
}
// hàm đọc dữ liệu cảm biến và gửi đến Blynk
void sendSensorData() { float temperature =
dht.readTemperature(); float humidity =
dht.readHumidity(); int soilMoisture =
analogRead(soilMoisturePin);
Blynk.virtualWrite(V5, temperature);
Blynk.virtualWrite(V6, humidity);
Blynk.virtualWrite(V7, soilMoisture);
if (soilMoisture < 500) { digitalWrite(relayPin, HIGH); // Bật mô-đun Relay để
làm mát tủ lạnh nếu độ ẩm đất thấp
Blynk.virtualWrite(V8, "Làm mát");
} else {
digitalWrite(relayPin, LOW); // Tắt mô-đun Relay
Blynk.virtualWrite(V8, "Độ ẩm OK");
}
}

Preview text:

Tài liệu lập trình hệ thống I. Lý thuyết:
1. Trình bày cấu trúc CPU core i3, i5, i7:
Các dòng chip CPU Intel Core i3, i5 và i7 đều thuộc dòng sản phẩm Core
của Intel, nhưng chúng có những đặc điểm khác nhau về cấu trúc và hiệu
suất. Dưới đây là một số thông tin cơ bản về cấu trúc của các dòng CPU này: Intel Core i3:
Số lõi và luồng: Thường có ít lõi và luồng hơn so với i5 và i7. Một số phiên bản t i h 3 ể có
). thể có 2 hoặc 4 lõi và hỗ trợ 4 hoặc 8 luồng (tùy phiên bản cụ Cache:
Có ít cache hơn so với i5 và i7.
Tần số xung nhịp cơ bản (Base Clock): Thấp hơn so với Hiệu suất đa nhiệm: i5 và i7. Thường thích hợp
cho các công việc hàng ngày như
lướt web, xem phim, làm văn phòng, nhưng không phù hợp cho các tác vụ
yêu cầu nhiều xử lý đa nhiệm hoặc gaming nặng. Intel Core i5:
Số lõi và luồng: Thường có 4 lõi và hỗ trợ 4 luồng (4 lõi / 4 luồng) hoặc 6 C laõi và h
che: ỗ trợ 6 luồng (6 lõi / 6 luồng).
Có cache lớn hơn so với i3, giúp tăng hiệu suất xử lý dữ liệu.
Tần số xung nhịp cơ bản (Base Clock): Tốt hơn so với i3. Hiệu suất đa Thích hợp cho nhiệm: nhiều tác vụ đa gaming.
nhiệm, xử lý dữ liệu và Intel Core i7:
Số lõi và luồng: Thường có 4, 6 hoặc 8 lõi với hỗ trợ 8 hoặc 12 luồng (8 C laõi / 8
che: luồng hoặc 8 lõi / 12 luồng).
Có cache lớn hơn so với cả i3 và i5, giúp cải thiện hiệu suất xử lý dữ liệu.
Tần số xung nhịp cơ bản (Base Clock): Thường cao hơn Hiệu suất đa so với i5 và i3. nhiệm:
Thích hợp cho các tác vụ đa nhiệm nặng, xử lý video,
thiết kế đồ họa và gaming chuyên nghiệp. Tổng kết:
i3: Dành cho người dùng thông thường với yêu cầu cơ bản về hiệu suất.
i5: Phù hợp với người dùng muốn hiệu suất tốt hơn và có nhu cầu đa nhiệm trung bình.
i7: Cho người dùng chuyên nghiệp hoặc yêu cầu hiệu suất cao trong các tác vụ đa nhiệm nặng.
2. Trình bày cấu trúc ngăn xếp:
Trong lập trình hệ thống, cấu trúc ngăn xếp được sử dụng trong các thành phần sau: •
Hệ điều hành: Hệ điều hành sử dụng cấu trúc ngăn xếp để lưu trữ trạng
thái của các tiến trình và các luồng. •
Thư viện chuẩn: Thư viện chuẩn cung cấp các hàm để thao tác với cấu
trúc ngăn xếp, chẳng hạn như push(), pop() và peek(). •
Ngôn ngữ lập trình: Nhiều ngôn ngữ lập trình cung cấp hỗ trợ tích hợp
cho cấu trúc ngăn xếp. Ví dụ, ngôn ngữ C có các hàm push(), pop() và peek().
3. Trình bày chương trình con trong Assembly:
Chương trình con trong assembly là một đoạn mã có thể được gọi từ các
chương trình khác. Chương trình con thường được sử dụng để thực hiện
các nhiệm vụ cụ thể, chẳng hạn như tính toán một hàm toán học hoặc xử lý dữ liệu.
Khai báo chương trình con
Để khai báo một chương trình con, bạn cần sử dụng lệnh proc. Lệnh này nhận hai tham số: • Tên chương trình con • Kiểu dữ liệu trả về Ví dụ: Đoạn mã proc sum(int a, int b) content_copy
Tên chương trình con phải bắt đầu bằng chữ cái và không được
trùng với tên của các biến hoặc chương trình con khác. Kiểu dữ liệu
trả về có thể là int, char, float, double, hoặc void.
Kết thúc khai báo chương trình con
Để kết thúc khai báo chương trình con, bạn cần sử dụng lệnh endp.
Viết mã chương trình con
Mã của chương trình con sẽ được viết giữa hai lệnh proc và endp. Mã
của chương trình con có thể bao gồm các lệnh assembly như mov, add,
sub, mul, div, cmp, jmp, jne, je, jg, jl, lea, push, pop, v.v.
Trả về từ chương trình con
Để trả về từ chương trình con, bạn cần sử dụng lệnh ret. Lệnh này có
thể không có tham số hoặc có một tham số là giá trị trả về của chương trình con.
Cách gọi chương trình con
Để gọi một chương trình con, bạn cần sử dụng lệnh call. Lệnh này nhận
một tham số là tên của chương trình con cần gọi. Ví dụ: Đoạn mã proc main mov ax, 10 mov bx, 20 call sum mov cx, ax endp Chương trình trên sẽ gọi chương trình con sum() với tham số a = 10 và b = 20. Kết quả của chương trình con sẽ được lưu trữ trong biến cx II. Code: 1. Arduino:
a. Điều khiển hệ thống đèn qua Internet:
#define BLYNK_TEMPLATE_ID "TMPL6v74uiG9n"
#define BLYNK_TEMPLATE_NAME "test blynk1"
#define BLYNK_AUTH_TOKEN "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G" #include #include
char auth[] = "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G";
char ssid[] = "Nhật Eo Vì"; char pass[] = "mangyeulam"; #define led D1 int button1; int tudong = HIGH; int cambien = 500; void setup() {
// put your setup code here, to run once: Serial.begin(9600);
Blynk.begin(auth, ssid, pass); pinMode(led, OUTPUT); pinMode(cambien, INPUT); } BLYNK_WRITE(V0){ tudong = param.asInt(); if(tudong == 1){
int value = analogRead(cambien); BLYNK_WRITE(V2){
Blynk.virtualWrite(V2, value); if (value > 500) { digitalWrite(led, LOW); } else { digitalWrite(led, HIGH); } } } else{ BLYNK_WRITE(V1){ button = param.asInt(); if(button == 1){ digitalWrite(led, HIGH); } else{ digitalWrite(led, LOW); } } } } void loop() {
// put your main code here, to run repeatedly: Blynk.run(); }
b. Điều khiển hệ thống máy bơm qua Internet:
#define BLYNK_TEMPLATE_NAME "test blynk1"
#define BLYNK_AUTH_TOKEN "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G" #include #include #include
char auth[] = "TCIhp7307v0LD41b_AqxUKgkj2GHtz-G";
char ssid[] = "Nhật Eo Vì"; char pass[] = "mangyeulam"; #define maybom D1 #define DHTPIN D5 #define DHTTYPE DHT11 DHT dht(DHTPIN,DHTTYPE); int button_tudong; int button_maybom; float nhietdo; float doam; void setup() {
// put your setup code here, to run once: Serial.begin(9600);
Blynk.begin(auth, ssid, pass); pinMode(maybom,OUTPUT); } BLYNK_WRITE(V0){
button_tudong = param.asInt(); if(button_tudong == 1){ doam = dht.readHumidity();
nhietdo = dht.readTemperature();
Blynk.virtualWrite(V1,nhietdo); Blynk.virtualWrite(V2,doam);
if(doam < 30 | nhietdo > 50){ digitalWrite(maybom, HIGH); }else{ digitalWrite(maybom, LOW); } } else{ BLYNK_WRITE(V3){
button_maybom = param.asInt(); if(button_maybom==1){ digitalWrite(maybom, HIGH); }else{ digitalWrite(maybom, LOW); } } } } void loop() {
// put your main code here, to run repeatedly: Blynk.run(); } 2. Assembly:
a. Nhập vào ký tự đầu tiên của tên SV, sau đó in ra chuỗi ký tự từ A đến ký tự vừa nhập: data segment space db " $" enter db 10, 13, "$" ends stack segment dw 128 dup(0) ends code segment assume cs:code, ds:code start:
mov ah,1 ;nhap ky tu dau cua ten SV int 21h mov cl, al mov bl, 'A' LAP: ; vong lap mov ah, 9
lea dx, enter ; dat chuoi enter vao thanh ghi dx int 21h mov ah, 2 mov dl, bl int 21h inc bl
cmp cl, bl ; so sanh bl voi cl, nhay toi nhan al_nho_hon jl al_nho_hon jmp LAP ; nhay toi nhan LAP al_nho_hon: jmp end_if ; nhay toi nhan end_if end_if: IN_END: mov ax, 4c00h int 21h ends end start
b. Nhập vào 1 số bất kỳ, sau đó in ra chuỗi Đại học Kiến trúc data segment num db ? mess db "DH Kien Truc$" ends stack segment dw 128 dup(0) ends code segment start: ; Nhap so tu bàn phim mov ah, 1 lea dx, num int 21h ; In so da nhap mov ah, 2 lea dx, num int 21h
; Dat con tro vi tri dong 20, cot 10 mov ah, 02h mov bh, 0 mov dh, 20 mov dl, 10 int 10h mov ah, 09h lea dx, mess int 21h ; Ket thuc chuong trinh mov ah, 4Ch int 21h mov ax, 4c00h int 21h ends end start
//Điều khiển arduino điều khiển hệ thống làm mát bằng relay và cảm biến nhiệt độ,
đọ ẩm ở 2 chế dộ tự động và thủ công qua internet
// khởi tạo và kết nối #define BLYNK_PRINT Serial #include #include char auth[] = ""; char ssid[] = ""; char pass[] = ""; #include #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE);
const int soilMoisturePin = A0; // chân cảm biến độ ẩm
const int relayPin = 12; // chân relay BlynkTimer timer; void setup() { Serial.begin(9600);
Blynk.begin(auth, ssid, pass); pinMode(relayPin, OUTPUT); digitalWrite(relayPin, LOW);
timer.setInterval(60000, sendSensorData); // Gửi dữ liệu cảm biến mỗi 60 giây } void loop() { Blynk.run(); timer.run(); }
// hàm đọc dữ liệu cảm biến và gửi đến Blynk
void sendSensorData() { float temperature =
dht.readTemperature(); float humidity =
dht.readHumidity(); int soilMoisture = analogRead(soilMoisturePin);
Blynk.virtualWrite(V5, temperature);
Blynk.virtualWrite(V6, humidity);
Blynk.virtualWrite(V7, soilMoisture);
if (soilMoisture < 500) { digitalWrite(relayPin, HIGH); // Bật mô-đun Relay để
làm mát tủ lạnh nếu độ ẩm đất thấp
Blynk.virtualWrite(V8, "Làm mát"); } else {
digitalWrite(relayPin, LOW); // Tắt mô-đun Relay
Blynk.virtualWrite(V8, "Độ ẩm OK"); } }