inflearn logo

Lập trình FreeRTOS 3 - Phân tích mã nguồn kernel, tìm hiểu nội bộ RTOS bằng cách đọc từng dòng và kiểm chứng trên bo mạch

Dù đang dùng FreeRTOS, bạn đã bao giờ tự hỏi kernel thực sự làm gì ngay bên dưới một dòng vTaskDelay chưa? Hãy lần theo từng dòng trong tasks.c và port.c, kiểm chứng bằng các thanh ghi và bộ nhớ trên bo mạch STM32, rồi tự mình khám phá nội bộ kernel, từ danh sách, chuyển đổi ngữ cảnh, bộ lập lịch, hàng đợi đến quản lý bộ nhớ.

4 học viên đang tham gia khóa học này

Độ khó Trung cấp trở lên

Thời gian Không giới hạn

FreeRTOS
FreeRTOS
rtos
rtos
stm32
stm32
C
C
FreeRTOS
FreeRTOS
rtos
rtos
stm32
stm32
C
C

Bạn sẽ nhận được điều này sau khi học.

  • Cách đọc tasks.c, queue.c và port.c theo số dòng

  • Nguyên lý chuyển đổi ngữ cảnh Cortex-M (PendSV·SVC·SysTick) và vùng tới hạn BASEPRI

  • Quá trình bộ lập lịch chọn tác vụ tiếp theo và đánh thức tác vụ ở mỗi nhịp tick

  • Cấu trúc bên trong và sự khác biệt giữa hàng đợi, semaphore, mutex, thông báo, nhóm sự kiện và bộ định thời

  • heap_4, watermark ngăn xếp, đọc bo mạch bị dừng do configASSERT·HardFault

Những gì bạn sẽ đạt được sau khóa học

Bạn sẽ có thể giải thích những gì FreeRTOS thực hiện trên bo mạch của mình bằng số dòng mã nguồn. Khi bo mạch bị treo hoặc thời gian chạy sai lệch, thay vì coi kernel như một hộp đen và phỏng đoán, bạn sẽ tìm bằng chứng trong mã nguồn và bộ nhớ.

Tóm tắt trong một câu

Bắt đầu từ danh sách và TCB, tìm hiểu lần lượt về chuyển đổi ngữ cảnh, bộ lập lịch, tick, vùng tới hạn, hàng đợi và đồng bộ hóa, heap và stack, phân tích lỗi cho đến đa lõi. Đọc mã nguồn kernel FreeRTOS V10.3.1 và kiểm chứng bằng đo đạc thực tế trên bo mạch STM32F429I-DISC1. Gồm 39 chương, thời lượng khoảng 6 giờ 55 phút.

Thông tin về quy trình sản xuất

Khóa học này được thực hiện bằng quy trình sản xuất ứng dụng AI. Phần thuyết minh sử dụng công nghệ tổng hợp giọng nói được huấn luyện từ chính giọng nói của giảng viên; AI cũng được sử dụng để hỗ trợ biên soạn kịch bản, thiết kế đồ họa và sản xuất video giới thiệu. Giảng viên trực tiếp lên kế hoạch và kiểm duyệt nội dung. Tất cả kết quả thực hành đều được chạy và xác nhận trên bo mạch STM32F429I-DISC1 thực tế và trong STM32CubeIDE.

vTaskDelay(1) có thực sự là 1 mili giây không?

Ngay cả khi đã dùng FreeRTOS nhiều năm, vẫn có những câu hỏi không dễ trả lời. vTaskDelay(1) thực sự chờ bao lâu, tại sao không có tệp mã nguồn dành cho semaphore, và vì sao call stack của bo mạch bị treo lại trỏ đến vListInsert? Tài liệu API cho biết nó làm gì, nhưng không giải thích cách nó hoạt động.

Khóa học này đọc tasks.c, queue.c và port.c theo thứ tự thực thi, lần theo từng số dòng. Sau đó, chúng ta kiểm chứng những gì đã đọc bằng bộ nhớ, thanh ghi và số chu kỳ trên bo mạch. Hiểu kernel bằng chứng cứ, không phải phỏng đoán.

Không đọc 5.000 dòng ngay từ đầu

Chỉ riêng tasks.c đã có hơn 5.000 dòng. Khóa học này không đi theo thứ tự tệp mà theo trình tự kernel thực sự chạy, tiến qua ba giai đoạn.

BƯỚC 1

Bộ khung của kernel

Danh sách, TCB, ngăn xếp đầu tiên

BƯỚC 2

Trái tim của kernel

Chuyển đổi ngữ cảnh, bộ lập lịch, nhịp tick

STEP 3

Công cụ trên kernel

Khóa, hàng đợi, bộ nhớ, đọc lỗi hỏng

Tại sao lại là mã nguồn kernel ngay lúc này?

STM32CubeMX thêm FreeRTOS vào dự án chỉ với một lần đánh dấu. Nhờ vậy, việc sử dụng RTOS trở nên dễ dàng hơn, nhưng cũng có nhiều người dùng mà không biết bên dưới đang diễn ra những gì. Muốn quyết định nên đặt kích thước stack bao nhiêu, mức ưu tiên ngắt là bao nhiêu, hay vì sao chương trình dừng ở điểm này, thì cuối cùng bạn vẫn cần hiểu cách kernel hoạt động. Càng có nhiều công cụ viết mã thay bạn, giá trị của những nhà phát triển có thể giải thích vì sao mã đó hoạt động như vậy càng tăng.

Bạn sẽ học được những điều này

Bộ khung và trái tim của kernel

01 Cách đọc tasks.c và cấu trúc danh sách liên kết

02 Mổ xẻ TCB, cách biết trạng thái mà không cần biến trạng thái

03 Thiết lập ngăn xếp đầu tiên và đi từ main() đến tác vụ đầu tiên

04 Chuyển đổi ngữ cảnh PendSV·SVC·SysTick và BASEPRI

05 Chọn tác vụ, tick và hai danh sách trì hoãn

Công cụ và cách đọc lỗi trên kernel

06 Vùng tới hạn, tạm dừng bộ lập lịch và hai loại khóa

07 Bên trong hàng đợi và xQueueGenericSend từng dòng một

08 Semaphore, mutex, kế thừa, thông báo, sự kiện và bộ định thời

09 heap_4, dấu mức ngăn xếp, xóa tác vụ và bộ nhớ

10 Đọc configASSERT·HardFault, lớp bọc CMSIS và đa lõi

18 năm kinh nghiệm giảng dạy thực tế

Từ năm 2008, tôi đã giảng dạy cho các nhà phát triển tại những doanh nghiệp và tổ chức như Samsung Electronics, LG Electronics, SK hynix và Hyundai Mobis. Câu hỏi tôi thường nhận được nhất trong công việc thực tế là "Vậy bên trong kernel đang diễn ra chuyện gì?" Khóa học này được xây dựng để trả lời câu hỏi đó bằng một dòng mã nguồn và một con số trên bo mạch.

Dành cho những ai đã quen dùng API nhưng tò mò về những gì diễn ra bên dưới

Nếu bạn không gặp vấn đề gì khi tạo task và dùng queue, nhưng mỗi khi bo mạch bị treo hoặc thời gian bị lệch lại chỉ có thể đoán mò nguyên nhân, khóa học này sẽ giúp bạn thay những phỏng đoán đó bằng căn cứ xác thực.

Điểm đặc biệt của khóa học này

Đọc mã nguồn theo số dòng

Trên màn hình hiển thị mã nguồn kernel thực tế cùng số dòng, bên cạnh là danh sách và các thanh ghi được dòng đó thay đổi, cùng chuyển động.

Kiểm chứng bằng bo mạch

Trong mỗi chương, chúng tôi nạp bản build thực hành lên bo mạch, đọc bộ nhớ, thanh ghi và số chu kỳ để xác minh những gì đã thấy trong mã nguồn.

theo đúng thứ tự thực thi

Đọc theo thứ tự kernel chạy, không phải thứ tự các tệp.

Đính chính những hiểu lầm thường gặp

Trong mỗi chương, chúng tôi làm rõ những hiểu lầm phổ biến và cách áp dụng trong thực tế.

Đến cả V11 và đa lõi

Chúng ta cũng sẽ xem những điểm thay đổi trong SMP dựa trên V10.3.1.

Màn hình bài giảng thực tế

tasks.c dòng 2740 và hai danh sách trì hoãn đi cùng với nó

Địa chỉ đánh dấu phần cuối của danh sách được đọc trực tiếp từ bộ nhớ bo mạch

Thời gian thực sự chờ khi gọi vTaskDelay(1)

Hai lõi thì có bao nhiêu kernel, AMP và SMP

Nên đọc từ đâu, số dòng của từng tệp kernel

Lý do pxTopOfStack phải là thành viên đầu tiên của TCB, dòng 247 trong port.c

Thiết lập stack ban đầu cho tác vụ chưa từng chạy lần nào

Dù yêu cầu chuyển đổi được gửi hai lần, PendSV vẫn chỉ chạy một lần

Dòng 911 của xQueueGenericSend, ba khóa cùng bị chặn

Danh sách chờ nhóm sự kiện được đọc từ bo mạch

Khi xóa task, bộ nhớ được thu hồi lúc nào? Hai nhánh của vTaskDelete

Sơ đồ configASSERT để xác định vị trí đã dừng

Môi trường thực hành

Môi trường cơ bản

  • Bo mạch STM32F429I-DISC1

  • STM32CubeIDE, STM32CubeMX

  • FreeRTOS V10.3.1 (CMSIS-RTOS v2, heap_4)

  • Cung cấp file zip dự án thực hành (chỉ cần đổi số bài thực hành ở mỗi chương rồi biên dịch)

ngay cả khi không có bo mạch

  • Tất cả kết quả đo đều được trình bày trong video.

  • Ở phần đa lõi, chúng ta sẽ cùng đọc mã nguồn V11.1.0.

Câu hỏi thường gặp

Q. Tôi có nhất thiết phải có bo mạch không?

Không. Video sẽ trình bày cả màn hình đọc mã nguồn lẫn kết quả đo trên bo mạch. Nếu muốn tự mình tái hiện, hãy chuẩn bị bo mạch STM32F429I-DISC1, build dự án thực hành được cung cấp trong khóa học và thử thực hiện phép đo tương tự.

Hỏi: Có cần học trước phần 1 và 2 về lập trình FreeRTOS không?

Không bắt buộc. Chỉ cần từng sử dụng các API của FreeRTOS như task, queue và semaphore là đủ. Nếu phần 2 là khóa học hướng dẫn khắc phục các sự cố thực tế dựa trên bằng chứng, thì phần 3 là khóa học đọc mã nguồn để tìm hiểu bên trong kernel, nơi những sự cố đó phát sinh.

Hỏi. Tôi có thể theo học dù chưa biết rõ cấu trúc Cortex-M không?

Những nội dung cần thiết cho khóa học sẽ được giải thích trong từng chương. Nếu muốn tìm hiểu sâu hơn, ở chương tương ứng, chúng tôi sẽ giới thiệu tài liệu tham khảo về kiến trúc ARM và khóa học “Lập trình bộ xử lý ARM Cortex-M” trên Inflearn.

Q. Giọng đọc là giọng AI phải không?

Đúng vậy. Đây là giọng nói tổng hợp được huấn luyện từ giọng của chính giảng viên. Kịch bản và nội dung thực hành do giảng viên trực tiếp lên kế hoạch và kiểm duyệt; các màn hình thực hành hiển thị kết quả được đo khi chạy trên bo mạch thực tế.

Khuyến nghị cho
những người này

Khóa học này dành cho ai?

  • Nhà phát triển đã từng sử dụng API FreeRTOS nhưng tò mò về nội bộ kernel.

  • Dành cho những ai muốn truy tìm sự cố RTOS ở cấp độ mã nguồn

  • Học viên khóa Lập trình FreeRTOS 1·2

Cần biết trước khi bắt đầu?

  • Con trỏ và cấu trúc trong ngôn ngữ C

  • Kinh nghiệm sử dụng API FreeRTOS

  • Kiến thức cơ bản về phát triển STM32

Xin chào
Đây là guileschool

Xác minh sự nghiệp

3,629

Học viên

263

Đánh giá

281

Trả lời

4.7

Xếp hạng

9

Các khóa học

Tôi đã học chuyên ngành Kỹ thuật Điện tử tại Đại học Inha và làm việc với tư cách là nhà phát triển phần mềm nhúng.

Từ năm 2008, tôi đã giảng dạy trực tiếp tại các cơ sở trong 18 năm. Tôi đã đào tạo các nhà phát triển tại những doanh nghiệp và tổ chức như Samsung Electronics, LG Electronics, SK hynix, Hyundai Mobis, LIG D&A, Đại học Quốc gia Seoul, đồng thời hệ thống hóa những kinh nghiệm đó thành giáo trình giảng dạy.

『RTOS』(2008), 『Linux Shell』(2018), 『FreeRTOS』(2019), 『Cortex-M』(2022), 『Hệ thống nhúng dựa trên bootloader』(2023)

Kênh YouTube Guileschool (https://www.youtube.com/@guileschool): Các bài giảng về hệ thống nhúng và phát triển phần mềm

Tôi cũng đã nghiên cứu về tự động hóa trên máy Mac được 15 năm. Tôi hướng dẫn cách giảm các công việc lặp đi lặp lại bằng Keyboard Maestro và AppleScript, đồng thời trực tiếp phát triển và bán plugin tự động hóa Greenlight cho Final Cut Pro. Các công cụ do tôi tự tạo được công khai trên GitHub (https://github.com/guileschool).

YouTube CaptainMacBot (https://www.youtube.com/@captainmacbot): Cách sử dụng AI và tự động hóa trên máy Mac

Vui lòng gửi yêu cầu về khóa học và các thắc mắc khác đến guileschool@gmail.com.

Thêm

Chương trình giảng dạy

Tất cả

41 bài giảng ∙ (7giờ 3phút)

Tài liệu khóa học:

Tài liệu bài giảng
Ngày đăng: 
Cập nhật lần cuối: 

Đánh giá

Chưa có đủ đánh giá.
Hãy trở thành tác giả của một đánh giá giúp mọi người!

Khóa học khác của guileschool

Hãy khám phá các khóa học khác của giảng viên!

Khóa học tương tự

Khám phá các khóa học khác trong cùng lĩnh vực!

Ưu đãi có thời hạn

20.110 ₫

34%

4.954.989 ₫