[Series RTOS] FreeRTOS trên Cortex-M3 (Phần 1)
FreeRTOS
1
Cortex-M3
1
C++
27
Male avatar

danhphan1307 viết ngày 12/01/2017

Lời ngỏ

Đây là series giới thiệu cơ bản về FreeRTOS trên Cortex-M3, cụ thể là LPC 1549. Dự kiến series sẽ gồm 8 bài viết nhằm giới thiệu với các bạn những thuật ngữ thường được dùng cũng như ví dụ minh hoạ để các bạn dễ hình dung, từ đó tạo ra sản phẩm cho riêng mình. Một số cụm từ mình sẽ để nguyên tiếng Anh để tiện cho các bạn tra cứu tài liệu. Do project nhiều cộng thêm thời gian đi làm nên mình sẽ không ra bài đều đặn hoặc nhanh được. Nhưng các bạn yên tâm là mình tổng hợp nhiều nguồn và dựa trên kinh nghiệm cá nhân để gửi đến các bạn bài viết chất lượng nhất. Nếu các bạn có góp ý về chất lượng bài viết, tìm thấy lỗi sai hoặc cần tìm hiểu thêm, vui lòng comment để mình khắc phục vì kiến thức là vô hạn.

“Two things are infinite: the universe and human stupidity; and I'm not sure about the universe.”- Albert Einstein

Tài liệu
Không có gì cao siêu, chỉ là 2 cuốn:

Chắc các bạn sẽ thắc mắc tại sao mình lại reference manual vào? Manual rất quan trọng, document lại toàn bộ API, Interface, Design, ... của sản phẩm. Thông qua manual, các bạn tự thân vận động tìm cách giải quyết vấn đề khi gặp rắc rối trước khi nhờ đến sự giúp đỡ từ người khác. Cuộc sống thực tế không phải ai cũng dâng cơm lên tận miệng, giúp bạn solve từng problem một. Sẽ đến một lúc bạn là người đầu tiên phát hiện ra một vấn đề mới và không ai khác ngoài bạn có trách nhiệm phải giải quyết nó.

“Give a man a fish and you feed him for a day; teach a man to fish and you feed him for a lifetime.”- Maimonides

1. Real-time Operating System

1.1 Operating System là gì

Trước khi làm quen với Real-time Operating System(RTOS) , các bạn cần phải nắm khái niệm hệ điều hành là gì.

Hệ điều hành là một phần mềm chạy trên máy tính, dùng để điều hành, quản lý các thiết bị phần cứng và các tài nguyên phần mềm trên máy tính. Dựa trên nhu cầu và phần cứng khác nhau, nhà sản xuất tích hợp hệ điều hành tương ứng vào sản phẩm của mình, như:

  • Hệ điều hành cho máy tính cá nhân (MacOS, Linux, Windows, etc) - General Purpose Operating System (GPOS).
  • Hệ điều hành cho Server, Router, Switch ( Cisco IOS, etc)
  • Hệ điều hành cho hệ thống nhúng ( FreeRTOS, µC/OS, etc)
  • etc

Và dưới con mắt của lập trình viên, hệ điều hành là:

  • Công cụ, cung cấp services để lập trình
  • Quản lý multitasking được biết đến như task, thread, etc
  • Quản lý process như bắt đầu và kết thúc một procress, chọn process để thực hiện ( scheduling). Lập trình viên có thể đồng bộ scheduling dựa vào Locks (mutex), Semaphores, Monitors và Queues
  • Quản lý bộ nhớ, input và output, file system, etc
  • etc

1.2 RTOS là gì

Tuy nhiên, không chỉ dừng lại ở mục đích sử dụng và phần cứng, thời gian phản hồi cũng đóng một vai trò quan trọng trong việc phân loại hệ điều hành. Ví dụ khi tai nạn xe hơi xảy ra, điều bạn mong muốn là air bag phải bật ra ngay lập tức để đảm bảo an toàn cho bạn chứ không phải chờ đến khi bạn đã ăn chuối no nê, ngắm gà khoả thân nó mới bật ra.
alt text

Vậy, khái niệm real-time ra đời và được định nghĩa là hệ thống đưa ra phản hồi với input trong một khoảng thời gian yêu cầu. Trong một số trường hợp mà khoảng thời gian này có thể linh động khác nhau ( hard real-time và solf real-time).

Response time: là khoảng thời gian khi hệ thống nhận input và xuất output.

Hard real-time: Một hệ thống đảm bảo tuyệt đối thời gian tối đa của một hoạt động. Trong một hệ thống hard real-time, một task không chỉ được thực thi một cách chính xác, mà còn phải đảm bảo được deadline.

Soft real-time: Một hệ thống chỉ đưa ra đảm bảo tương đối thời gian tối đa của một hoạt động. Nhưng trái với hard real-time, đôi khi trễ deadline cũng không làm ảnh hưởng đến hệ thống.

Jitter: Mỗi một task trong RTOS là một vòng loop và mỗi lần chạy task thì thời gian thực thi task đó sẽ dài ngắn khác nhau. Jitter là sự chênh lệch giữa thời gian mà task đó được phép chạy và lần chạy task đó tốn nhiều thời gian nhất. RTOS sẽ tối ưu jitter nếu được lập trình đúng, tức là mỗi lần task chạy sẽ tốn một khoảng thời gian hầu như tương đương.

alt text

Nhưng, nếu chỉ dựa vào phản hồi trong thời gian cho phép với độ trễ thấp để được gọi là RTOS là chưa đủ mà nó còn phụ thuộc vào "a totally deterministic operation mode". Ví dụ như khi bạn query lấy user info trong database, mỗi lần thời gian query sẽ khác nhau phụ thuộc vào size bộ nhớ, thời gian load của hệ thống, số lượng record trong database, số lượng user trả về, ... Điều này có nghĩa là database query không "deterministic", không phải real-time operation. Cũng chính vì lý do này mà những ngôn ngữ phổ biến như Java, C# không được dùng để code RTOS vì garbage collector có thể chạy bất cứ lúc nào và tạm hoãn những task khác không đúng lúc.

RTOS is designed to run applications with very precise timing and a high degree of reliability.

Nếu RTOS có nhiều ưu điểm vượt trội so với GPOS, vậy tại sao không chuyển hết sang RTOS? Câu trả lời là bởi vì sự phức tạp. Implement một RTOS khó hơn GPOS rất nhiều, các developer phải khéo léo trong việc schedule, set priority để tránh tình trạng priority inversion, tệ hơn là deadlock. Hơn nữa với các tác vụ hằng ngày như mở mail, duyêt web các bạn có thể chờ trong một khoảng thời gian nhất định, không yêu cầu quá khắc khe về response time nên RTOS là không cần thiết.

1.3 Sự ra đời của Embedded OS

Linux có thể là một ứng cử viên sáng giá vì đã quen thuộc với giới lập trình viên, vậy sao không dùng thẳng Linux cho hệ thống nhúng? Câu trả lời là bản thân kernel của Linux không đáp ứng được yêu cầu của RTOS. Thêm vào đó, nó đòi hỏi nhiều bộ nhớ (hàng MB RAM và MMU CPU). Không những vậy service đi kèm theo đã được tích hợp sâu vào Linux, chúng ta khó có thể tuỳ chỉnh cho phù hợp với những thiết bi có bộ nhớ hạn chế. Vì vậy mà những hệ điều hành nhúng như FreeRTOS, µC/OS ra đời, với nhiệm vụ chính là chạy trên những thiết bị nhỏ gọn, tiết kiệm điện và có một đặc điểm là cực kì dễ config.

2. Multitasking

2.1. Process states

Trước khi tìm hiểu multitask, phải nắm được định nghĩa process.

In computing, a process is an instance of a computer program that is being executed. It contains the program code and its current activity.

alt text

Một process đang không ở trong running states thì sẽ ở trong các states sau:
• Ready : sẵn sàng để thực thi
• Blocked : process chưa sẵn sàng để chạy và phải chờ dữ liêu, ví dụ như data từ một queue khác
• Suspended : process bị chuyển sang trạng thái hold và chỉ có thể được resume bởi OS call.

2.2. Multitasking là gì ?

Hãy coi bạn là hệ điều hành, hành động như đi làm, nấu cơm, dọn dẹp nhà cửa, etc là process. Vào một ngày đẹp trời, bạn quyết định viết bài trên kipalog và uống trà. Có 3 lựa chọn xảy ra:

  • Viết bài xong rồi sẽ uống trà
  • Uống trà xong rồi sẽ viết bài
  • Vừa viết bài vừa uống trà

Vậy các bạn có thể thấy hành động số 3 là hợp lý nhất, vì cả 2 nhiệm vụ được làm cùng 1 lúc, tiết kiệm thời gian. Khi bạn bí ý tưởng, câu cú để viết bài, bạn có thể nhâm nhi trà ngồi ngẫm nghĩ từ ngữ nào sử dụng cho thích hợp. Đây là lý do multitask ra đời.

Fun fact:
Usually processes spend most of their time waiting for something, for example user input or an event

So sánh

alt text
alt text

Như các bạn đã thấy execution time đã được tối ưu.

2.3. Multitasking types

Có hai loại Multitasking
• Pre-emptive: hệ thống có quyển chuyển 1 process từ trạng thái execute sang trạng thái chờ bất cứ khi nào và chuyển sang thực thi một process khác. Việc này thường được thực hiện thông qua interrupt even mặc dù process cũng có quyền yêu cầu.
• Co-operative: process tự nguyện chuyển việc thực thi sang 1 process khác bằng cách gọi 1 function đặc biệt nào đó hoặc gọi bloking OS function.

Với hai loại này, nếu không cẩn thận programmer sẽ dễ dàng kết thúc với hệ thống không đáp ứng đủ tiêu chí của RTOS.

A rule of thumb:
Let operating system handle waiting – if you need to wait the best place to wait is on a blocking OS function

2.4. Concurrency

Concurrency: Multitasking in a single core environment

alt text

Một vi xử lý đơn nhân chỉ có thể thực thi duy nhất một process tại một thời điểm bất kì và các process khác phải nằm trong trạng thái non-running ( xem lại mục 2.1). Việc chuyển đổi từ một process này sang một process khác gọi là context swtich.

• Context holds all the information that is required to put a process on hold and continue execution at a later time without affecting the computations of the process
• Context switch takes some time which limits the number of processes in a time critical system

alt text

Fun fact:
– In 2 GHz processor the instruction cycle is 0,5 ns
– The access time of typical disk can be 7 ms
– In “human terms” these are 1 second and 162 days

Ngày nay thì đa số là sử dụng vi xử lý đa nhân nên sẽ là real parallelism chứ không còn là concurrency so với vi xử lý đơn nhân nữa. Như đã đề cập ở fun fact trên, thời gian thực hiện context switch rất nhanh nên chúng ta có cảm giác là mọi thứ được thực hiện song song nhưng thực ra nó là one-by-one.

2.5. FreeRTOS schedule

Trong FreeRTOS, mỗi một task sẽ được:

  • Gán một priority
  • Mỗi task chỉ có duy nhất một trạng thái vào bất kì thời điểm
  • Chỉ duy nhất một task ở Running state vào bất kì thời điểm

Scheduler sẽ luôn chọn task đang ở Ready state và có priority cao nhất để đưa vào Running state.

alt text

Tổng kết

Các bạn phải nắm rõ được khái niệm:

  • OS, sự khác nhau giữa GPOS và RTOS
  • Process, process states, priority
  • Multitasking ( Multitasking types, concurrency)
  • Context swtich

Bài viết kế tiếp sẽ nói về semaphore, guarding resource và priority inversion.

alt text for reading

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

danhphan1307

2 bài viết.
12 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
13 1
Giới thiệu Trên diễn đàn đã có nhiều bài hướng dẫn CSS nhưng mình thấy vẫn thiếu một cách quan trọng đó là dùng flex. Vậy nên mình sẽ đưa ra vài v...
danhphan1307 viết 1 năm trước
13 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
12 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!