
FreeRTOS 프로그래밍
홍영기
RTOS를 사용하기만 하면 실시간 처리가 된다고 믿고 계시나요? 이 강의를 보시고 확인해보세요. 까다로운 인터럽트, 우선순위, 상호배제, 포팅에 대한 통찰력을 만들어드립니다.
Basic
운영체제, FreeRTOS, 임베디드
Bạn có muốn học sâu về bộ xử lý CORTEX-M không? Chúng tôi sẽ giúp bạn chắc chắn nắm vững hai chủ đề quan trọng nhất của hệ thống nhúng là lắp ráp và ngắt quãng.

Có thể sử dụng quyền truy cập không căn chỉnh được không?
Vai trò quan trọng của ngôn ngữ lắp ráp
Nguyên lý hoạt động của đường ống
Bộ lắp ráp trực tuyến
Tập lệnh liên kết
Nguyên lý hoạt động của thiết bị NVIC
Phân tích đầy đủ các thủ tục xử lý ngoại lệ từ đầu đến cuối
Bộ điều khiển đồng hồ
Phân tích mã khởi động
 Bộ xử lý ARM Cortex-M trong một bài giảng
 Kiểm tra mọi thứ từ khái niệm đến bí quyết thực tế.
 Bộ vi xử lý 32 bit phổ biến nhất cho các hệ thống nhúng.
 Các bộ xử lý tiêu biểu bao gồm CORTEX-M3, CORTEX-M4, CORTEX-M0 và CORTEX-M33.
 Nó được áp dụng cho các sản phẩm trong nhiều lĩnh vực khác nhau vì có mức tiêu thụ điện năng thấp và giá cả cạnh tranh. 
 
    
Bộ xử lý CORTEX-M là bộ vi xử lý 32 bit phổ biến và đáng chú ý nhất được sử dụng trong các hệ thống nhúng ở nhiều lĩnh vực khác nhau bao gồm máy bay không người lái, nhà máy thông minh, xe tự hành, hàng không vũ trụ, thiết bị chẩn đoán y tế, thiết bị gia dụng, Internet vạn vật và năng lượng môi trường.
 
    
 Bộ xử lý CORTEX-M phù hợp với các ứng dụng ưu tiên giá cả và hiệu quả sử dụng điện năng hơn hiệu suất. Bộ xử lý có số lượng cổng thấp, độ trễ ngắt thấp và khả năng gỡ lỗi .
 Hỗ trợ lệnh THUMB2 làm bộ lệnh cơ bản.
 NVIC được tích hợp chặt chẽ với lõi bộ xử lý, cung cấp khả năng xử lý ngắt có độ trễ thấp .
 Hỗ trợ ngắt ' tail chaining ' và ' LATE ARRIVING ' để cải thiện thời gian phản hồi ngắt.
 Hỗ trợ các dải bit, bao gồm các hoạt động ghi và đọc dải bit để hỗ trợ truy cập nguyên tử. 
 
    
Tôi không nghĩ có thời điểm nào trong vài thập kỷ qua mà các nhà phát triển lại được coi trọng như hiện tại. Khi bạn hỏi những người trẻ rằng họ muốn trở thành người như thế nào khi lớn lên, bạn có thể nghe những câu trả lời như bác sĩ, công tố viên hoặc thậm chí là ' nhà phát triển '.
Khi các nhà phát triển trở nên có giá trị hơn và mức lương của họ tăng lên, khoa học máy tính và kỹ thuật điện tử được xếp hạng cao trong bảng xếp hạng phổ biến của các trường đại học. Giống như tiêu đề bộ phim 'It Can't Get Any Better', có vẻ như mọi người sẽ đến El Dorado trong tìm kiếm vàng ở miền Tây nước Mỹ vào thế kỷ 19. Chúng chồng chéo lên nhau. Có thể coi đây là thời kỳ hoàng kim của các nhà phát triển.
 
    
 
    
Bình luận này xuất phát từ một công ty trong nước M vào năm 2016, thậm chí còn được đưa tin trên báo và lan truyền trong một thời gian. Và, thậm chí nếu điều này chưa xảy ra thì đây cũng là từ mà mọi người đều đã từng nghe ít nhất một lần trong đời. Nhưng còn những nhà phát triển có kỹ năng giải quyết vấn đề thì sao? Tại sao đây lại là vấn đề?
Theo tôi hiểu, ý nghĩa của câu này nói một cách đơn giản là như thế này. Để tôi cho bạn một ví dụ. Mã này rõ ràng là của tôi. Chắc chắn là có lỗi trong chương trình này. Tôi cũng biết điều đó. Nhưng điều này không giải quyết được vấn đề . Quá trình này có thể ngắn chỉ vài giờ, dài nhất là vài ngày, hoặc dài nhất là vài tháng.
Nếu bạn hỏi tôi liệu điều như thế này có thực sự xảy ra không, tôi sẽ trả lời rằng tất nhiên là có thể. Cho nên đó là lý do tại sao nó lại trở thành vấn đề.
Viết mã là việc mà bất kỳ ai cũng có thể làm được chỉ cần một chút kiến thức. Nhưng giải quyết vấn đề lại là một trò chơi khác.
Việc tạo ra phần mềm hoạt động trên các hệ thống nhúng đã khó, nhưng việc giải quyết các vấn đề hiếm gặp và khó khăn còn khó hơn. Bởi vì, tùy từng trường hợp, việc thu hẹp phạm vi vấn đề xuống chỉ còn phần mềm có thể không giải quyết được vấn đề. Cần phải xem xét rằng các thành phần của hệ thống nhúng bao gồm 'phần cứng + phần mềm'.
Ngay cả bây giờ, nhiều loại silicone mới vẫn liên tục được tung ra thị trường thế giới mỗi năm. Ngoài ra, còn có nhiều loại phần cứng khác được tạo ra sử dụng những con chip này. Chúng ta có thực sự tin rằng tất cả những điều này đều hoàn hảo về mặt phần cứng không?
Khi khắc phục sự cố, khả năng xảy ra lỗi phần cứng cũng phải được xem xét. Khi một vấn đề không dễ giải quyết, các nhà phát triển phần mềm cần cân nhắc xem đó là vấn đề về phần cứng hay phần mềm.
Nhưng vấn đề là đây là điều cần phải được đào tạo thường xuyên. Việc tuyên bố "đó là vấn đề về phần cứng" hoặc "đó là vấn đề về phần mềm" mà không có cơ sở nào có lẽ sẽ không thuyết phục được bất kỳ ai.
 
    Tôi đã gặp khá nhiều nhà phát triển phần mềm, dù tự nguyện hay không, có ít kiến thức về phần cứng hoặc đơn giản là không quan tâm đến nó. Đó là lý do tại sao các nhà phát triển có kỹ năng giải quyết vấn đề ngày càng có giá trị và quan trọng trong lĩnh vực này.
 Kết luận đã được đưa ra rồi. Bạn phải cố gắng hiểu phần cứng.
 Hiểu biết về phần cứng không nhất thiết có nghĩa là hàn các linh kiện điện tử vào bảng mạch in. Điều này không có nghĩa là bạn có thể kiểm soát hoàn toàn đèn LED hoặc phím bấm.
Thay vào đó, bạn nên nghiên cứu trình biên dịch và hiểu các nguyên tắc cơ bản về cách thức hoạt động của hệ thống nhúng . Hai từ khóa mà tôi tin tưởng và hiểu rõ khi phát triển phần mềm nhúng là trình biên dịch và ngắt .
Assembler có nhiệm vụ hiểu phần cứng, còn ngắt là cơ chế phần mềm chạy không đồng bộ, khiến chúng có khả năng làm giảm tính ổn định của hệ thống. Do đó, để tạo ra phần mềm có độ tin cậy cao, bạn phải học thật tốt.
 Có nhiều quan điểm khác nhau về ngôn ngữ lắp ráp giữa các nhà phát triển. Đầu tiên, hãy đọc bài đăng này từ một diễn đàn cộng đồng nhà phát triển trong nước nổi tiếng.
 Trình biên dịch hiện đại thông minh hơn nhiều so với trước đây. Nó tạo ra mã được tối ưu hóa tốt. Việc mã hóa bằng trình biên dịch để cải thiện hiệu suất hệ thống đã là chuyện của quá khứ. Vậy thì tại sao tôi lại nhấn mạnh nhiều đến trình biên dịch?
 Lý do chúng ta học trình biên dịch là để hiểu rõ hơn cách thức hoạt động của các hệ thống nhúng. Assembler giúp các nhà phát triển nhìn thấy hoạt động bên trong của các hệ thống nhúng .
 Giống như câu nói “Đừng nhìn cây, hãy nhìn rừng”, bất kể bạn học ngành gì, bạn cũng nên liên tục cố gắng hiểu cấu trúc (hệ thống) của môn học mà bạn đang học. Chúng ta cần phải suy nghĩ lại về hệ thống nhúng như là 'phần cứng + phần mềm' .
 Nếu bạn đã phát triển trong hơn hai năm và không thấy bất kỳ cải thiện đáng kể nào trong kỹ năng phát triển hệ thống nhúng của mình, đã đến lúc bạn cần thay đổi căn bản phương pháp học tập.
Có câu nói rằng nếu bạn đầu tư 10.000 giờ vào bất kỳ lĩnh vực nào, bạn sẽ trở thành chuyên gia trong lĩnh vực đó. Tôi đồng ý với bạn, nhưng tôi muốn thay đổi câu này một chút. Giống như thế này. ' Nếu bạn đầu tư 10.000 giờ vào bất kỳ lĩnh vực nào một cách hiệu quả, bạn sẽ trở thành chuyên gia trong lĩnh vực đó .'
 Lợi ích của việc học assembler
 Lợi ích của việc học assemblerNgoài những lợi ích đã nêu ở trên, việc học lập trình assembler còn có một số lợi ích bổ sung khác.
 Đầu tiên , bất kỳ phần mềm nào cũng bao gồm 1-5% mã lắp ráp (nếu bạn học về trình biên dịch, bạn sẽ hiểu tại sao). Hiểu được mã lệnh lắp ráp cơ bản giúp bạn kiểm soát 100% phần mềm.
 Thứ hai , nó tạo ra nền tảng để hiểu mã khởi động (không phải bộ nạp khởi động) được viết bằng trình biên dịch và có khả năng tự mình mã hóa mã đó.
 Thứ ba , khả năng sử dụng công cụ gỡ lỗi (khắc phục sự cố) được mở rộng và đào sâu hơn.
 Thứ tư , chúng ta có thể cải thiện chất lượng phần mềm để nâng cao hiệu suất hệ thống và sử dụng bộ nhớ một cách hiệu quả.
 Thứ năm , việc tạo ra phần mềm chạy trên phần cứng này có thể chạy trên phần cứng khác được gọi là chuyển đổi, và trong trường hợp này, khả năng sử dụng trình biên dịch là điều cần thiết.
 Thứ sáu , bạn có thể dễ dàng hiểu được con trỏ trong ngôn ngữ C. (Khái niệm địa chỉ rất cần thiết khi điều khiển bộ nhớ hoặc thiết bị I/O trong ngôn ngữ lắp ráp.)
 Khóa đào tạo này (Lập trình bộ xử lý ARM Cortex-M) chắc chắn sẽ bao gồm cả hai nội dung này (trình biên dịch, ngắt).
 Nếu bạn nghĩ mình không hứng thú với ngôn ngữ lập trình hợp ngữ, vui lòng bỏ qua bài giảng này. Tôi chỉ muốn đi với những người hiểu được giá trị thực sự.
 Trong khóa đào tạo bộ xử lý ARM ngoại tuyến, tôi đã nhấn mạnh điều này với học viên của mình như một niềm tin cá nhân. Thông qua khóa học này, tôi hy vọng có thể cung cấp cho bạn góc nhìn khác về hệ thống nhúng. 
Tất cả những nội dung trên là chủ đề cốt lõi của bài giảng này. Được rồi, chúng ta hãy đi vào chi tiết.
Không giống như các bộ xử lý ARM trước đây không cho phép truy cập không liên kết, bộ xử lý CORTEX-M hỗ trợ truy cập không liên kết theo mặc định. Cân nhắc ưu và nhược điểm của việc sử dụng quyền truy cập không liên kết
 
    
Khi phát triển phần mềm nhúng, người ta dễ cho rằng sẽ không có vấn đề gì về phần cứng, nhưng khi phát triển phần mềm, bất kỳ ai cũng có thể rơi vào những cái bẫy bất ngờ bất cứ lúc nào. Việc tìm kiếm và giải quyết những vấn đề như thế này đòi hỏi phải có trình độ hiểu biết nhất định về phần cứng. Mỗi thiết bị phần cứng riêng lẻ, bao gồm cả bộ nhớ, đều có đặc điểm vận hành riêng và việc hiểu chúng là điều quan trọng. Việc đầu tiên dễ dàng bạn có thể làm để tăng hiểu biết về phần cứng là học trình biên dịch. Tôi muốn nhắc lại rằng việc trải nghiệm gián tiếp phần cứng thông qua ngôn ngữ lắp ráp là điểm khởi đầu để các kỹ sư phần mềm hiểu được phần cứng.
 
    
Bộ xử lý theo đường ống hiệu quả hơn bộ xử lý không theo đường ống. Thật khó để tưởng tượng một bộ xử lý ARM không sử dụng công nghệ đường ống. Nghiên cứu nguyên lý hoạt động của đường ống và ý nghĩa của nó đối với bộ xử lý CORTEX-M.
 
    
Lắp ráp trực tuyến có nghĩa là gì? Nói một cách đơn giản, điều này có nghĩa là viết mã lệnh dưới dạng hàm C. Hình thức bên ngoài của lệnh lắp ráp nội tuyến giống như một hàm ngôn ngữ C, nhưng nội dung thực tế của nó là một lệnh lắp ráp. Hướng dẫn lắp ráp cũng liên kết chặt chẽ với các biến cục bộ trong các hàm C. Trong trường hợp các lệnh MSR và MRS không thể thay thế bằng ngôn ngữ C, giá trị của trình biên dịch nội tuyến sẽ phát huy khi được triển khai và sử dụng trong trình biên dịch nội tuyến.
 
    
Trình biên dịch STM32CubeIDE tự động tạo ra nhiều nguồn và nhiều tệp khác nhau, bao gồm các tệp makefile cần thiết cho quá trình biên dịch, thông qua một quy trình tự động. Một tệp được gọi là tập lệnh liên kết cũng là một trong những tệp được tạo tự động và trình liên kết luôn tham chiếu đến tệp này để tạo tệp thực thi cuối cùng theo mong muốn của người dùng. Tìm hiểu về vai trò của trình liên kết và cú pháp tập lệnh trình liên kết.
 
    
Không giống như bộ xử lý ARM7, ARM9 và ARM11, bộ xử lý CORTEX-M được thiết kế để có kết nối chặt chẽ hơn bằng cách đưa NVIC, một thiết bị điều khiển ngắt, vào bên trong bộ xử lý CORTEX-M. Hiểu được cách NVIC hoạt động cũng là điểm khởi đầu để hiểu về ngắt, đóng vai trò quan trọng trong các hệ thống nhúng.
 
    
Quá trình cho đến khi trình xử lý ngoại lệ được thực thi khi xảy ra ngoại lệ, bao gồm cả ngắt phần cứng. Mô tả toàn bộ quá trình từ khi thực thi mã xử lý ngoại lệ đến khôi phục mã chương trình ngay trước khi ngoại lệ xảy ra.
 
    
Tìm hiểu nguyên lý hoạt động của hệ thống đồng hồ, cung cấp đồng hồ cho nhiều thiết bị phần cứng giao tiếp với AHB và APB, bao gồm lõi CORTEX-M, bên trong bộ xử lý STM32 CORTEX và thay đổi tần số đồng hồ hệ thống trực tiếp thông qua khóa học thực hành để kiểm soát đồng hồ. Tăng cường sự tự tin của bạn vào bản thân.
 
    
Bộ xử lý CORTEX-M hỗ trợ công nghệ 'chuỗi đuôi' để cải thiện hiệu quả xử lý ngoại lệ. Tìm hiểu cách thức hoạt động của công nghệ này và xem nó có thể giúp cải thiện khả năng phản hồi khi bị ngắt như thế nào. Chúng ta cũng sẽ xem xét lồng nhau ngắt.
 
    
Cố gắng hiểu mã khởi động của một số phần mềm cũng có thể giúp ích rất nhiều trong việc hiểu cấu trúc tổng thể của phần mềm hệ thống nhúng. Bằng cách diễn giải ý nghĩa chứa trong mã khởi động thay vì chỉ sử dụng nó, chúng ta có thể đưa ra hướng phát triển phần mềm tiên tiến hơn. Tất nhiên, điều này cũng đòi hỏi kiến thức tiên quyết quan trọng cho các tác vụ như chuyển bộ nạp khởi động hoặc RTOS.
 
    
Tôi tạo ra khóa học này với thời gian quý báu của bạn cũng như của tôi.
Dựa trên kinh nghiệm giảng dạy bộ xử lý ARM tại chỗ cho hơn 1.000 sinh viên trong hơn 14 năm, tôi quyết định tạo khóa học trực tuyến này để gặp gỡ nhiều sinh viên hơn. Chúng tôi sẽ cung cấp cho bạn bài giảng trực tuyến giúp tối ưu hóa nội dung của 5 ngày giảng dạy tại chỗ thành 15 giờ .
 
     Hệ thống nhúng
 Người mới bắt đầu 
 
     Đã là CORTEX-M
 Tôi đang sử dụng nó nhưng
 Tổ chức có hệ thống
 Bất cứ ai cần 
 
     Trong phần mềm nhúng
 Để tăng cường hiểu biết về Hàn Quốc
 Nhà phát triển phần cứng 
 
     Chuyển RTOS thành công và
 Để vận hành
 Kiến thức về máy vi tính
 Bất cứ ai cần
📢 Kiểm tra kiến thức chơi của bạn!
 
    
 
    Lịch sử chính
vân vân
H. Người không biết ngôn ngữ C có thể tham gia khóa học này không?
Nếu bạn không biết ngôn ngữ C, bạn có thể gặp khó khăn trong việc hiểu các phần thực hành của lớp học.
H. Học viên trình độ trung cấp có thể tham gia khóa học này không?
Chúng tôi đã lên kế hoạch cho khóa học không chỉ dành cho những người mới bắt đầu phát triển hệ thống nhúng mà còn dành cho những người dùng trung cấp đang sử dụng CORTEX-M. Với 14 năm kinh nghiệm giảng dạy bộ xử lý ARM tại Samsung Electronics, SK Hynix, Hancom Academy, Korea Radio Promotion Agency, KEA, Motorola Semiconductor và Polytech (Incheon), tôi có hiểu biết sâu sắc về các phần đặc biệt khó và các chủ đề quan trọng trong Lập trình nhúng bộ xử lý ARM.
H. Có nhiều loại bo mạch STM32 để thực hành. Có loại nào ổn không?
 Trong video, lớp học hiện đang được tiến hành dựa trên bo mạch STM32F429I-DISC1 .
 Ngoài ra, bo mạch NUCLEO-F103RB và NUCLEO-F401RE cũng được hỗ trợ. Không có kế hoạch hỗ trợ bất kỳ bảng bổ sung nào. Đối với những bạn đang muốn mua bo mạch mới để thực hiện hướng dẫn này, chúng tôi đặc biệt khuyên dùng bo mạch STM32F429I-DISC1. 
📢 Vui lòng kiểm tra trước khi tham gia lớp học! (Giấy phép)
Khóa học này dành cho ai?
Người mới bắt đầu về hệ thống nhúng
Bất kỳ ai đang cân nhắc tối ưu hóa hệ thống nhúng
이미 CORTEX-M đang sử dụng nhưng cần sắp xếp hệ thống
Các nhà phát triển phần cứng muốn nâng cao hiểu biết về phần mềm nhúng.
성공적인 RTOS porting và vận hành cần kiến thức về vi điều khiển
Những người muốn học ngôn ngữ lắp ráp ARM
Bất kỳ ai cần học lắp ráp nội tuyến, tập lệnh liên kết và mã khởi động
Bất kỳ ai cần các kỹ thuật gỡ lỗi chuyên nghiệp cho phần mềm hệ thống nhúng
Cần biết trước khi bắt đầu?
ngôn ngữ C
3,251
Học viên
229
Đánh giá
269
Trả lời
4.7
Xếp hạng
5
Các khóa học
인하대학교 공과대학에서 전자공학 학사 학위를 받았으며 임베디드 시스템용 소프트웨어 개발자로써 수년간의 경력을 쌓았습니다. 임베디드 시스템 및 프로그래밍을 위한 전문 강사로도 활동 중입니다. 아이폰 3GS 등장과 같은 시기에 맥(북)에 입문하였고, 그때부터 맥(북) 자동화에 관심을 갖게 되었습니다. '맥(북)에서 사용할 수 있는 시리 리모트', '키보드마에스트로를 이용한 구글번역기' 같은 오픈 소스를 깃허브(https://github.com/guileschool) 에 두고 개발 및 유지보수하고 있습니다. 오픈 소스 하드웨어 '비글본블랙' 에도 많은 관심을 가지고 있습니다. 맥(북) 자동화를 이용하여 생산성을 높일 수 있는 컴퓨터를 사용하는 모든 분야에 관심을 가지고 있고, 이를 필요로 하는 사람들을 돕고 있습니다.
강의 요청 및 기타 문의사항은 guileschool@gmail.com으로 보내주세요 :)
Tất cả
111 bài giảng ∙ (15giờ 10phút)
Tài liệu khóa học:
7. s205_THUMB2 lệnh
09:00
13. s211_AAPCS
14:29
22. s304_IT lệnh
10:03
35. Lệnh s317_REV
05:09
36. Lệnh s318_CLZ
04:01
40. s322_ADR và nhãn
01:26
43. s325_BRANCH lệnh
04:19
45. s327_lệnh nhân
02:53
48. s330_lệnh chia
03:57
Tất cả
39 đánh giá
4.9
39 đánh giá
Đánh giá 4
∙
Đánh giá trung bình 5.0
5
※ 1줄 요약: 아무 걱정 마시고 그냥 무조건 들으세요. 수강료가 100만 원이 돼도 무조건 들어야 합니다. <임베디드스케치>, <임베디드레시피> 책을 읽은 뒤 ARM 내용을 정리 & 실습하기 위한 목적으로 홍영기 선생님의 강의를 결제 후 완강까지 7일 소요됐습니다. ◆ 장점 - 너무 잘 설명해주셔서 이해하기 쉽습니다. - 말과 말 사이 간격 편집, 기다리는 과정 편집, 보드 영상 편집 등으로 수강하기 너무 편합니다. - 특히 마지막 챕터 링커스크립트와 부트로더 한 줄 한 줄 설명해주시는 게 가장 좋았습니다. ◆ 팁 - 질문에 정말 친절하게 답해주시고, 추가로 읽으면 좋은 자료도 소개해주십니다. 한 강의 수강하실 때마다 질문게시판 확인하세요. - PM0214, RM0090 두 datasheet 열어놓고 강의 들으시면 좋습니다.
완강하셨네요 ^^. 영상을 끝까지 봐주셔서 감사드리고, 수고하셨습니다. 부족한 점도 많을텐데 강의에 대한 좋은 평가도 감사드립니다. 적어주신 자세한 수강평 내용은 앞으로 이 강의 수강을 검토하시는 많은 분들에게 좋은 참고가 될 것입니다. 임베디드 쥰님 새해 복 많이 받으시고 꼭 소원 성취하세요 :-)
Đánh giá 2
∙
Đánh giá trung bình 5.0

Đánh giá 1
∙
Đánh giá trung bình 5.0

Đánh giá 3
∙
Đánh giá trung bình 5.0
5
"임베디드의 인프라 기술, ARM 동작원리를 쉽게 알고 싶은 분들에게 추천하고 싶은 강의입니다. 컴파일 에러가 뜨면 심리적으로 위축되고, 그게 C 문법이 아닌 처음 보는 이상한 명령들이라면 더욱 더 스트레스를 받습니다. 이 강의를 수강하면서 그런 에러들을 좀 더 여유있게 처리할 수 있게 되었습니다. 핵심 내용을 짧게 나눠서 실습과 함께 설명해 주시기 때문에 이해하기 쉽습니다. 실무에서 ARM 명령어를 직접 다루지 않더라도 강의에서 배운 프로세서의 기반기술을 알고 있기 때문에 문제 해결을 좀 더 다양한 관점에서 접근할 수 있을것 같습니다. 강의를 만들어 주셔서 감사합니다^^
안녕하세요. Taewan Sung 님! 이 강의가 도움이 되셨다니 제가 더 감사한 일입니다. 앞으로도 더욱 유익하고 다양한 강의 제작에 힘쓰겠습니다. 강의에 대한 좋은 평가 감사드려요 :-)

Đánh giá 4
∙
Đánh giá trung bình 5.0
3.219.213 ₫
Hãy khám phá các khóa học khác của giảng viên!
Khám phá các khóa học khác trong cùng lĩnh vực!