Các kiến thức cơ bản về hệ thống nhúng đã được bác Võ Duy Thành viết khá đầy đủ. Em đây cũng xin góp một bài .Về lập trình hệ thống nhúng cho vi điều khiển thì đây không còn là điều lạ trên thế giới và ở việt nam nhưn đối với các anh em SV thì việc này còn khá mới mẻ do quan điểm lập trình của chúng ta từ trước tới giờ chỉ có hai loại chính là :Lập trình tuyến tính và lập trình có cấu trúc.
Lập trình đa nhiệm cho hệ thống nhúng khác với lập trình có cấu trúc và lập trình tuyến tính là.Chúng không thực hiện một khối lệnh một cách liên tục (hàm) mà khối lệnh đó được chia nhỏ và thức hiện sen kẽ với các đoạn lệnh trong các khối lệnh khác.Về cấu trúc chương trình thì lập trình đa nhiệm không có một chương trình chính (hay hàm main trong C) mà chúng chia thành các task.Các task này được đặt trong bộ nhớ ,và có một câu hoỉ được đặt ra là vậy thì các task này sẽ hoạt động như thế nào ?Đúng vậy chúng phải có một chương trình để điều khiển chúng và có tên rất quen thuộc là Kernel.Kernet có nhiệm vụ quản lý sự hoạt động của các task bao gồm các công việc : Phân hạch thời gian,quản lý tài nguyên …
Như vậy để có thể xây dựng được một hệ thống đa nhiệm trên VĐK thì các bạn cần có những yêu cầu gì về phần cứng và phần mềm?
Về phần cứng:
Một điều không thể thiết đó là một bộ timer tích hợp trong VĐK.Nó có nhiệm vụ tạo đơn vị thời gian.(Có nghĩa là một chu kì hoạt động của hệ thống được chia nhỏ thành các đơn vị thời gian).Bộ nhớ chương trình đủ lớn để chứa các mã lệnh .Ngoài mã lệnh của các task cong mã lệnh của Kernel .Bộ nhớ RAM cũng là một vấn đề rất hạn chế của VĐK vì mỗi lần chuyển ngữ cảnh thì toàn bộ ngữ cảnh của một Task được lưu vào một ngăn xếp trong RAM.Chúng ta có càng nhiều task thì cần cành nhiều ngăng xếp kiểu này (Các bạn đừng nhầm ngăn xếp này với ngăn xếp cứng nhé ! đây là ngăng xếp do phần mềm chúng ta phải tạo ra)Cụ thể chúng là bao nhiêu thì tùy vào các ứng dụng mà các bạn mới có thể xác định được.
Về phần mềm:
Các bạn hiện gời có hai công cụ để lập trình cho VĐK đó là ngôn ngữ bậc thấp (Assembly) và ngôn ngữ bậc cao (C ,basic…,nhưng tôi chỉ dùng C) và ở hai ngôn ngữ này các bạn đều có thể lập trình đa nhiệm cho VĐK được.
Với Assembly đây là ngôn ngữ mà các bạn có thể làm mọi chuyên được với VĐK nhưng thực sự nó chỉ dành cho những người quá chuyên nghiệp.Để lập trình đa nhiệm cho VĐK bằng ngôn ngữ này thì các bạn phải bắt đẩu từ con số 0 !!! bạn phải xây dụng toàn bộ Kernel cho ứng dụng của bạn và nó chỉ phù hợp với các ứng dụng rất nhỏ (Đối với tôi và không giám nói tới các cao nhân).Nếu bạn nào đam mê có thể đọc quyển sách :”Real time system and programming languages” Có gần như tất cả các thuật toán tối ưu để các bạn có thể xây dựng Kernel. Song thế mạnh của Assembly là bạn có thể xác định được chính xác thời gian mà một task của bạn thực hiện và tất nhiên điều đó đồng nghĩa với việc hệ thống của các bạn sẽ tố ưu.(Thế mạnh của Assembly mà).
Với C và các ngôn ngữ bậc cao khác thì sao nhỉ ?bạn đã được cung cấp một Kernel rồi và vấn đề của các bạn là sử dụng chúng mà thôi .Nếu như phần mềm các bạn sử dụng mà chưa có thì các bạn vào các trang Web của bản hãng để mua về !!!(Vấn đề là mất tiền) tôi xin thí dụ như để viết cho 8051 Keil C có một nhân đó là RTX51.Với AVR là ….Trời tôi quên mất rồi vì hôm trước chỉ xem trên Web thôi họ không cho free nên không có (!!! Bác nào có thì share cho em nhé)
Vấn đề sd nhân RTX51 thì cũng không có gì khó cả .Các bạn có thể xem phần hướng dẫn của Keil C là có hết.Tôi xin tóm tắt đôi chut :
Các cú pháp của chương trình C thì hoàn toàn không có gì khác cả chỉ có khác về mặt cấu trúc.Các bạn không cần hàm “main” mà thay vào đó là hàm khởi tạo các task
Ví dụ :
void init (void) _task_ 0 { /* sau khi Reset chương trình sẽ chạy từ đây */
os_create_task (1); /* Bắt đầu task 0 hoạt động */
os_create_task (2); /* task 1 hoạt động */
os_create_task (3); /* */
os_delete_task (0); /*dừng khởi tạo các task */
}
Các bạn sẽ nói chẳg khác gì các chương trình C khác cả nhưng sự thật là cúng sẽ được thực hiện “đồng thời” và chỉ có thời điểm mỗi task bắt đầu là khác nhau mà thôi.
Và các bạn khai báo các task “như”(theo nghĩa hình thức) các chương trình con mà các bạn cần thực hiện.
Ví dụ:
void readADC (void) _task_ 1
{
// nội dung
}
….Vậy Task này có mã hiệu là 1 và là tham số cho hàm
os_create_task (mã hiệu của task muốn khởi tạo.);
Sau đay tôi xin gửi tới các bạn một chương trình mẫu của Keil C rất hay và cụ thể để các bạn tham khảo:
Lập trình đa nhiệm cho hệ thống nhúng khác với lập trình có cấu trúc và lập trình tuyến tính là.Chúng không thực hiện một khối lệnh một cách liên tục (hàm) mà khối lệnh đó được chia nhỏ và thức hiện sen kẽ với các đoạn lệnh trong các khối lệnh khác.Về cấu trúc chương trình thì lập trình đa nhiệm không có một chương trình chính (hay hàm main trong C) mà chúng chia thành các task.Các task này được đặt trong bộ nhớ ,và có một câu hoỉ được đặt ra là vậy thì các task này sẽ hoạt động như thế nào ?Đúng vậy chúng phải có một chương trình để điều khiển chúng và có tên rất quen thuộc là Kernel.Kernet có nhiệm vụ quản lý sự hoạt động của các task bao gồm các công việc : Phân hạch thời gian,quản lý tài nguyên …
Như vậy để có thể xây dựng được một hệ thống đa nhiệm trên VĐK thì các bạn cần có những yêu cầu gì về phần cứng và phần mềm?
Về phần cứng:
Một điều không thể thiết đó là một bộ timer tích hợp trong VĐK.Nó có nhiệm vụ tạo đơn vị thời gian.(Có nghĩa là một chu kì hoạt động của hệ thống được chia nhỏ thành các đơn vị thời gian).Bộ nhớ chương trình đủ lớn để chứa các mã lệnh .Ngoài mã lệnh của các task cong mã lệnh của Kernel .Bộ nhớ RAM cũng là một vấn đề rất hạn chế của VĐK vì mỗi lần chuyển ngữ cảnh thì toàn bộ ngữ cảnh của một Task được lưu vào một ngăn xếp trong RAM.Chúng ta có càng nhiều task thì cần cành nhiều ngăng xếp kiểu này (Các bạn đừng nhầm ngăn xếp này với ngăn xếp cứng nhé ! đây là ngăng xếp do phần mềm chúng ta phải tạo ra)Cụ thể chúng là bao nhiêu thì tùy vào các ứng dụng mà các bạn mới có thể xác định được.
Về phần mềm:
Các bạn hiện gời có hai công cụ để lập trình cho VĐK đó là ngôn ngữ bậc thấp (Assembly) và ngôn ngữ bậc cao (C ,basic…,nhưng tôi chỉ dùng C) và ở hai ngôn ngữ này các bạn đều có thể lập trình đa nhiệm cho VĐK được.
Với Assembly đây là ngôn ngữ mà các bạn có thể làm mọi chuyên được với VĐK nhưng thực sự nó chỉ dành cho những người quá chuyên nghiệp.Để lập trình đa nhiệm cho VĐK bằng ngôn ngữ này thì các bạn phải bắt đẩu từ con số 0 !!! bạn phải xây dụng toàn bộ Kernel cho ứng dụng của bạn và nó chỉ phù hợp với các ứng dụng rất nhỏ (Đối với tôi và không giám nói tới các cao nhân).Nếu bạn nào đam mê có thể đọc quyển sách :”Real time system and programming languages” Có gần như tất cả các thuật toán tối ưu để các bạn có thể xây dựng Kernel. Song thế mạnh của Assembly là bạn có thể xác định được chính xác thời gian mà một task của bạn thực hiện và tất nhiên điều đó đồng nghĩa với việc hệ thống của các bạn sẽ tố ưu.(Thế mạnh của Assembly mà).
Với C và các ngôn ngữ bậc cao khác thì sao nhỉ ?bạn đã được cung cấp một Kernel rồi và vấn đề của các bạn là sử dụng chúng mà thôi .Nếu như phần mềm các bạn sử dụng mà chưa có thì các bạn vào các trang Web của bản hãng để mua về !!!(Vấn đề là mất tiền) tôi xin thí dụ như để viết cho 8051 Keil C có một nhân đó là RTX51.Với AVR là ….Trời tôi quên mất rồi vì hôm trước chỉ xem trên Web thôi họ không cho free nên không có (!!! Bác nào có thì share cho em nhé)
Vấn đề sd nhân RTX51 thì cũng không có gì khó cả .Các bạn có thể xem phần hướng dẫn của Keil C là có hết.Tôi xin tóm tắt đôi chut :
Các cú pháp của chương trình C thì hoàn toàn không có gì khác cả chỉ có khác về mặt cấu trúc.Các bạn không cần hàm “main” mà thay vào đó là hàm khởi tạo các task
Ví dụ :
void init (void) _task_ 0 { /* sau khi Reset chương trình sẽ chạy từ đây */
os_create_task (1); /* Bắt đầu task 0 hoạt động */
os_create_task (2); /* task 1 hoạt động */
os_create_task (3); /* */
os_delete_task (0); /*dừng khởi tạo các task */
}
Các bạn sẽ nói chẳg khác gì các chương trình C khác cả nhưng sự thật là cúng sẽ được thực hiện “đồng thời” và chỉ có thời điểm mỗi task bắt đầu là khác nhau mà thôi.
Và các bạn khai báo các task “như”(theo nghĩa hình thức) các chương trình con mà các bạn cần thực hiện.
Ví dụ:
void readADC (void) _task_ 1
{
// nội dung
}
….Vậy Task này có mã hiệu là 1 và là tham số cho hàm
os_create_task (mã hiệu của task muốn khởi tạo.);
Sau đay tôi xin gửi tới các bạn một chương trình mẫu của Keil C rất hay và cụ thể để các bạn tham khảo:
Comment