Sau bài viết này bạn đọc sẽ​​ hiểu được

  • Làm thế​​ nào FreeRTOS phân bổ​​ thời gian xử​​ lý cho mỗi task trong một​​ ứng dụng

  • Làm thế​​ nào FreeRTOS chọn task để​​ thực thi.

  • Độ​​ ưu tiên của Task​​ ảnh​​ hưởng như thế​​ nào đối với hoạt động của hệ​​ thống.

  • Các trạng thái mà một state có thể​​ có.

Các trạng thái chính của 1 Task.

  • Trong một​​ ứng dụng bạn có thể​​ có nhiều tác vụ​​ khác nhau: ví dụ​​ task chuyên xử​​ lý đọc ghi dữ​​ liệu UART, task chuyên điều khiển động cơ,​​ task chuyên điều khiển màn hình hiển thị, task chuyên xử​​ lý tín hiệu nút nhấn.

  • FreeRTOS có thể​​ ứng dụng trong các phần cứng nhiều core như CPU máy tính, core arm ​​ nhiều lõi, và củng có thể​​ sử​​ dụng cho các chip đơn lõi như Vi điều khiển. Đối với các chip chỉ​​ có 1 core thì tại một thời điểm chỉ​​ có duy nhất một task chạy, và task này sẽ​​ có trạng thái là Running State, các Task còn lại sẽ​​ có trạng thái Not Running State. Trong trạng thái Not Running State thì sẽ​​ chia ra các trường hợp nhỏ​​ nữa: Blocked State và​​ Ready State.

  • Khi một task đang trong trạng thái chạy thì CPU sẽ​​ thực thi phần code của task đó, trong trường hợp đẹp nhất là CPU thực hiện xong hết code của task trước khi chuyển qua phục vụ​​ cho task khác. Nếu code quá nhiều, hoặc thời gian xữ​​ lý quá lâu,​​ thì CPU sẽ​​ lưu lại trạng thái đang chạy của task hiện tại và đi phục vụ​​ cho task khác , và sẽ​​ trở​​ lại phục vụ​​ cho task này trong các thời gian sau.

 

Đến đây bn s​​ thc mc ngay, vy khi nào thì CPU đi vc v​​ task khác, và phc v​​ bao lâu, và task nào s​​ đưc CPU chn đ​​ phc v​​ tiếp theo sau khi tm dng task hin ti???​​ 

 

Đây là câu hỏi cực kì quan trọng ​​ mà bạn phải nắm thật chắc để​​ xây dựng​​ ứng dụng hiệu quả​​ nhất nhé, nếu không nắm rõ vấn đề​​ chỗ​​ này thì rất có thể​​ ứng dụng của bạn đã viết đúng hết rồi nhưng chương trình chạy vẫn không như ý và bạn không hiểu vì sao nhé!!!!

 

  • Mình sẽ​​ trả​​ lời từng phần nhỏ​​ trong câu hỏi trên nhé, để​​ trả​​ lời câu hỏi trên thì bạn cần trang bị​​ thêm 3 kiến thức là: TimeSlice, Task State và Task Priority.

    • Task State:​​ (Running/Blocked,Ready): Giả​​ sử ​​​​ CPU đang phục vụ​​ 1 task có độ​​ ưu tiên là 1 và task này đang trong state Running, nếu lúc này có 1 task có độ​​ ưu tiên là 2 có state là Ready thì ngay lập tức CPU sẽ​​ dừng task 1 và đi phục vụ​​ cho task 2.

    • TimeSlice : là khoảng​​ thời gian tối đa mà CPU phục vụ​​ cho một task, nghĩa là nếu 1 task đang chạy và không có bất kỳ​​ task có độ​​ ưu tiên cao hơn nào vào state Ready , thì cứ​​ sau khoảng thời gian này CPU sẽ​​ thực hiện việc kiểm tra và phân bổ​​ lại CPU.

    • Task Priority: Task nào có độ​​ ưu tiên cao ​​ và có state Ready thì sẽ​​ được CPU thực hiện ngay, bất kể​​ nó đang​​ ​​ trong task nào có độ​​ ưu tiên thấp hơn.

  • Khi nào thì CPU đi phục vụ​​ task khác?

  • Nguyên tắc cơ bản là nếu có 1 task có độ​​ ưu tiên cao hơn task đang chạy có state Ready thì CPU sẽ​​ ngay lập tức đi phục vụ​​ task này. Lưu ý nhé, nếu task có độ​​ ưu tiên thấp hơn có state Ready thì cũng không được vụ​​ vụ​​ đâu nhé.

  • CPU phục vụ​​ cho 1 task bao lâu?

CPU sẽ​​ rời task theo thứ​​ tự​​ ưu tiên sau:

  • Nếu có task ưu tiên cao hơn vào state Ready thì CPU sẽ​​ rời đi.

  • Sau khoảng thời gian Time Slice CPU cũng sẽ ​​​​ rời đi để​​ kiểm tra​​ 

  • CPU thực thi xong code của task.

  • Task nào sẽ​​ được chọn thực thi tiếp theo?

Một task sẽ​​ được chọn để​​ phục vụ​​ theo thứ​​ tự​​ sau

  • Task có độ​​ ưu tiên cao hơn, và vào state ready.

  • Nếu 2​​ task có cùng độ​​ ưu tiên và cũng đang​​ ​​ trong state Ready thì CPU sẽ​​ phục vụ​​ mỗi task một khoảng thời gian là TimeSlice

 

 

Tóm lại thế​​ này nhé:

 

  • Sau khoảng thời gian Time Slice, CPU sẽ​​ thực hiện việc chọn Task nào để​​ thực hiện, thứ​​ tự​​ chọn task tiếp:

  • Task​​ ưu tiên cao hơn đang trong state Ready

  • Task cùng cấp đang trong ready state, sau khi hết Time Slice

  • Task ưu tiên thp hơn đang trong ready state, và tt c​​ các task ưu tiên cao hơn đang trong state Blocked.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *