User Program Đa số các hệ thống đơn giản là các chương trình người dùng được chạy trên vi điều khiển. Microcontroller Mem Timer I/O Peripheral Program Sensors Devices
Operating System Hệ điều hành (Operating System) là phần mềm quản lý và xử lý các tài nguyên, đóng vai trò như 1 giao diện giao tiếp giữa người dùng và phần cứng máy tính. OS Microcontroller Mem Timer I/O Peripheral User Program User Program User Program Devices
Quản lý tài nguyên hệ thống: Cung cấp các giải thuật cấp phát & quản trị tài nguyên. ⇒ Đảm bảo tài nguyên được sử dụng hiệu quả cân bằng. Program Program Resource Resource OS Vai trò của OS CPU RAM Periph CPU RAM Periph
Vai trò của OS Phối hợp việc thực thi cho chương trình: Lên lịch điều phối và phân bổ tài nguyên cho chương trình. ⇒Đảm bảo các chương trình được vận hành công bằng hiệu quả. OS User Program User Program User Program CPU time Memory Priority
Vai trò của OS Quản lý thiết bị: Theo dõi tất cả các thiết bị được kết nối với hệ thống. ⇒Tạo ra môi trường có tính linh hoạt về dễ dàng cho việc sử dụng các thiết bị.
Các dịch vụ OS Giao diện cho người dùng. ⇒Cung cấp giao diện thống nhất cho người dùng để tương tác với hệ thống. Program Program OS Drivers APIs BareMetal (Register level) User Interface (UI) GUI/Batch/Command-line Drivers Drivers Drivers BareMetal (Register level)
Thực thi chương trình: ⇒Đảm bảo quá trình tạo, khởi chạy chương trình khi cần thiết, đồng bộ cũng như loại bỏ chương trình. Các dịch vụ OS User Program User Program User Program RAM Manager Scheduler Task … Execution on CPU Manager
Bảo mật: ⇒Cung cấp cơ chế kiểm tra và bảo mật đối với các phần mềm, file. Các dịch vụ OS
Quản lý tập tin: ⇒Cung cấp cơ chế quản lý tập tin trong bộ nhớ cho các chương trình đang chạy. Các dịch vụ OS Program File management File .img .pdf .cpp
Giao tiếp: ⇒Cung cấp cơ chế để chia sẻ, trao đổi dữ liệu giữa các tác vụ/tiến trình. Phát hiện và xử lý lỗi: ⇒Đảm bảo hệ thống có thể vận hành khi có lỗi xảy ra. Các dịch vụ OS P1 P2 P3 Data sharing
UNIX Unix là một hệ điều hành máy tính đa nhiệm, mã nguồn mở và dựa trên giao diện dòng lệnh. Đặc điểm nổi bật của Unix là khả năng xử lý nhiều tác vụ đồng thời, cung cấp một giao diện dòng lệnh linh hoạt để tương tác với hệ thống.
UNIX History Những năm 1960 tại Bell Labs, của AT&T. Hệ điều hành này được phát triển với mục đích ban đầu là để sử dụng trong hệ thống Bell của AT&T. Sau đó, Unix đã được cấp phép rộng rãi và trở thành nền tảng cho nhiều hệ điều hành khác sau này như BSD, Xenix, mac OS và Linux.
LINUX Linux là 1 dự án mã nguồn mở và hoàn toàn miễn phí. Linux là 1 UNIX-Clone OS: dựa trên ý tưởng của UNIX, nhưng không sử dụng trực tiếp mã nguồn của UNIX. Linux chỉ là một Kernel Project.
POSIX POSIX POSIX (Portable Operating System Interface) là 1 chuẩn hệ điều hành dành cho biến thể của HĐH Unix được định ra bởi IEEE. POSIX nhắm đến khả năng tương thích và tương tác giữa các hệ điều hành. Command-line System APIs Utilities Interface POSIX OS POSIX OS … Program
POSIX & LINUX LINUX có tính tương thích cao với các UNIX OS qua tiêu chuẩn mở POSIX. Ví dụ: Cả LINUX và UNIX đều sử dụng giao diện Command-Line với cùng các lệnh và options ( tuy vẫn có khác biệt nhưng rất ít). ⇒Nâng cao tính linh hoạt giữa các OS và giữa các phiên bản của cùng 1 OS cho người dùng khi phát triển các ứng dụng. Program Linux 1.0 Linux 2.0 Unix
LINUX vs other UNIX based OS Đặc điểm Unix Linux Cấp phép Độc quyền Mã nguồn mở Kiến trúc C C và C++ Cộng đồng phát triển Nhà phát triển chuyên nghiệp Cộng đồng các nhà phát triển Hỗ trợ phần mềm Thương mại và mã nguồn mở Mã nguồn mở
LINUX vs other UNIX based OS Linux và cả UNIX đều phát triển dựa trên các tiêu chuẩn đã có sẵn. LINUX hoàn toàn được phát triển với source riêng.
Kernel Project Kernel Project là nhân của 1 OS, thành phần chính để các nhà phát triển tạo nên các OS. Kernel là chương trình thay mặt các chương trình người dùng để tương tác với phần cứng.\ Kernel không bao gồm các ứng dụng và giao diện người dùng. Program Hardware Kernel Driver Driver Driver Program Hardware Driver Driver Driver
Full Stack OS Full Stack OS Bao gồm Kernel và các ứng dụng, giao diện người dùng. Các hệ điều hành ta thường dùng phổ biến như Windows, MacOS… là những FullStack OS KERNEL Hardware Application & Service Driver Driver Driver
Full Stack OS Nhiều Full Stack OS khác nhau có thể được phát triển từ cùng Kernel. Một số OS Linux thường gặp: Ubuntu, Debian… đây gọi là các bản phân phối của Linux, các FullStack OS phát triển từ nhân Linux. KERNEL Hardware Application & Service Application & Service Application & Service Driver Driver Driver OS 1 OS 2 …
CPU Trap & Syscall. Vì có nhiều đặc quyền nên cơ chế Trap và Syscall được sử dụng để có thể chuyển đổi giữa các cấp độ đặc quyền. Trap Syscall
Kiến trúc cấp cao của OS Kernel. Kernel cũng được phát triển với nhiều chương trình phụ trách nhiều chức năng, nhiệm vụ khác nhau.
MAKFILE Giới thiệu về Makefile Quá trình biên dịch một chương trình C Static Lib va ̀ Shared Lib
CMAKE Giới Thiệu Make và Makefile cung cấp một hệ thống build mà chúng ta có thể sử dụng để quản lý việc compile và re-compilation của một chương trình được viết bằng ngôn ngữ bất kỳ . Như vậy sẽ khó cho trường hợp project có nhiều subdirectories hoặc phải chạy trên nhiều nền tảng khác nhau . ⇒ CMake ra đời . CMake là một công cụ sinh Makefile đa nền tảng (Windows/Unix/Linux). Nói đơn giản thì CMake sẽ tự động tạo ra Makefile cho project của chúng ta. Other Cmake Modules CmakeList.txt CMake MakeFile Make
Bước 1 : Tạo file .c Bước 2 : Tạo file CMakeLists.txt. Đây là đầu vào của hệ thống build CMake , giúp build các gói phần mềm . Bước 3 : Tạo thư mục Build. CMake sẽ tạo ra nhiều tệp trong quá trình chạy , tốt nhất nên có thư mục Build để tổ chức chúng gọn gàng . Bước 4 : Cấu hình CMake ( tạo file Config và Makefile ). Chạy lệnh cd Build để vào thư mục Build. Tùy hệ điều hành mà chạy lệnh CMake phù hợp : Linux : sh cmake .. Windows : sh cmake -G "Unix Makefiles " .. cmake -DCMAKE_MAKE_PROGRAM="make.exe" -G "Unix Makefiles " .. Bước 5 : Build mã nguồn . Chạy lệnh : sh cmake --build . CMAKE
Build.sh Viết build.sh để biên dịch thư viện và chương trình 2. Viết install.sh để cài đặt thư viện 3. CMakeLists.txt File build.sh này sẽ thực hiện các bước sau : Tạo thư mục build/ nếu chưa có Biên dịch các file . cpp thành các file .o Tạo thư viện tĩnh libipb_arithmetic.a từ các file .o Biên dịch chương trình main_exec và liên kết với thư viện Tạo thư mục results/bin/ và results/lib/ nếu chưa có Di chuyển thư viện và file thực thi vào results/ Khi chạy ./build.sh , nó sẽ : ✅ Tạo thư mục build nếu chưa có ✅ Biên dịch file . cpp thành .o ✅ Tạo thư viện tĩnh .a ✅ Biên dịch chương trình main_exec và liên kết với thư viện ✅ Di chuyển file thư viện và file thực thi vào thư mục results/ Install.sh File install.sh giúp cài đặt các file cần thiết sau khi build xong ✅ Tạo thư mục install/ nếu chưa có ✅ Sao chép thư viện .a vào install/lib/ ✅ Sao chép file header vào install/include/ ✅ Sao chép file thực thi vào install/bin/
Kiểm tra định dạng code với clang-format Kiểm tra và hiển thị kết quả ra màn hình ( không sửa file) clang-format your_file.cpp Tự động sữa trực tiếp trong file clang-format -i your_file.cpp Một số lưu ý khi chạy clang-format, clang-tidy Thường các dự án sẽ có file cấu hình ( ví dụ .clang-format, .clang-tidy) để quy định style cũng như danh sách check. Nếu có sẵn , clang-format và clang-tidy sẽ tự động đọc và áp dụng . Bạn nên chạy clang-format - i trước để định dạng code, sau đó chạy clang-tidy để phát hiện lỗi logic hoặc vi phạm quy tắc code.
Html_writer.cpp Hàm Chức năng OpenDocument() Mở đầu trang HTML (<!DOCTYPE html>). CloseDocument() Kết thúc trang HTML (</html>). AddCSSStyle(stylesheet) Thêm file CSS vào HTML. AddTitle(title) Đặt tiêu đề cho trang web. OpenBody () Mở phần <body> của trang web. CloseBody() Đóng <body> của trang web. OpenRow() Mở <div class="row"> (hàng ảnh). CloseRow() Đóng <div class="row">. AddImage(img_path, score, highlight) Thêm ảnh vào HTML với điểm số. Ảnh đầu tiên được bôi đỏ nếu highlight = true .
image_browser.cpp AddFullRow (row, first_row ) Thêm một hàng gồm 3 ảnh vào HTML. Ảnh đầu tiên của hàng đầu tiên được bôi đỏ. CreateImageBrowser(title, stylesheet, rows) Tạo toàn bộ trang HTML với nhiều hàng ảnh . #include "image_browser.hpp" int main() { std::vector< image_browser :: ImageRow > rows = { { {" web_app /data/000000.png", 9.5f}, {" web_app /data/000100.png", 8.9f}, {" web_app /data/000200.png", 7.6f} }, { {" web_app /data/000300.png", 8.5f}, {" web_app /data/000400.png", 7.2f}, {" web_app /data/000500.png", 6.6f} } }; image_browser :: CreateImageBrowser ("Image Gallery", "style.css", rows); return 0; }