










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