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 *

Đây là cửa hàng demo nhằm mục đích thử nghiệm — các đơn hàng sẽ không có hiệu lực. Bỏ qua