Giải thích về thời gian thực và ứng dụng của thời gian thực trong thực tế.Giới thiệu sơ bộ các thành phần chính thường gặp trong hệ điều hành RTOSCơ chế đồng bộ hay gặp trong RTOSWhat is RealTime and its application in real world?Introduce on RealTime Operating System – RTOS RTOS Kernel RTOS Tasks and Processes RTOS Scheduler RTOS NonPreemptive Kernel and Preemptive KernelBasic Synchronization in RTOS Semaphore Event Message Mailboxes Message QueueResearching the proscons on most popular RTOS in the market (VxWorks, ThreadX, FreeRTOS, Freescale MQX, uItron)
Trang 1LECTURE 10: INTRODUCE TO
BASIC REAL-TIME APPLICATIONS
AND RTOS.
Trang 4RTOS là gì?
RTOS là viết tắt của Real-Time Operating System.
Thuật ngữ Operating System dùng để mô tả sự kết hợp của
phần mềm để quản lý tài nguyên phần cứng của hệ thống.
Phần mềm có thể bao gồm 1 tập tin mô-đun hệ thống, một giao
diện và các thành phần khác.
Thông thường Kernel được hiểu như là 1 tập con của tập hợp
này.
Freescale MQX Overview
Trang 5o MQX RTOS được phát hành bởi Freescale Semiconductor Nó được nhắm
tới nhiều vi điều khiển như Freescale ColdFire, Kinetis Arm® CorTex M4 và Freescale Power Architecture.
o Freescale MQX RTOS được dựa trên MQX phiên bản 2.5 nó được phát
hành bởi công ty ARC International Freescale MQX RTOS phát hành bao gồm kernel thời gian thực, thành phần lõi hệ thống, tích hợp TCP/IP
network stack-RTCS, file hệ thống (MFS), USB host và ngăn xếp thiết bị.
Freescale MQX Overview
Trang 72 MQX RTOS BSPs
• Code từ /mqx/source/bsp/<board> được xây dựng với file điều khiển
I/O từ /mqx/source/bsp/io Tạo thành thư viện bsp.
• Khi liên quan đến ứng dụng người dùng, cho phép the board và hệ
thống hoạt động được khởi động và sử dụng dịch vụ điều khiển I/O.
• Hỗ trợ nhiều kiểu điều khiển I/O: I2C, SPI, Flex CAN, RTC, Serial, ADC,
DAC, Flash, ENET,….
Freescale MQX Overview
Trang 105 MQX USB host
File USB HDK từ thư mục /usb/host/source được xây
dựng thành thư viện.
Khi sử dụng thư viện USB HDK cho phép ứng dụng giao tiếp với các
thiết bị USB khác được kết nối trên USB bus.
Freescale MQX Overview
Trang 127 MQX Shell
Mã shell va dòng lệnh xử lý được hoàn toàn như là những thư viện tách biệt gọi là shell
Freescale MQX Overview
Trang 138 Thay đổi file nguồn của MQX
• Ta cần thêm vào
<install_dir>/mqx/source/bsp
<install_dir>/mqx/source/io
Freescale MQX Overview
Trang 14Freescale MQX Overview
Trang 15Freescale MQX Overview
Trang 16Thay đổi cấu hình tùy chọn
Để đảm bảo các kênh nối tiếp (trường hợp này là ttyc) thì ta kích hoạt trong tập tin:
#define BSPCFG_ENABLE_TTYB 1
Để thiết lập các kênh mặc định I/O cho giao diện nối tiếp UART (ánh xạ tới ttyc: thiết bị trong MQX RTOS), sử dụng:
#define BSP_DEFAULT_IO_CHANNEL "ttyb:"
Cấu hình tùy chọn được cài đặt trong
<mqx_installation>/config/<board>/user.config.h
Freescale MQX Overview
Trang 18MQX Basics: Tasks
II CÁC TÁC VỤ (TASK).
2.1 KHÁI NIỆM VỀ TASK .
- Một hệ thống thời gian thực được gọi là “điều khiển sự kiện”
kiện như thế nào? một giải pháp đưa ra có tên Đa nhiệm.
- Giải pháp này đã được chứng minh là một mô hình chuẩn cho các hệ
thống điều khiển sự kiện và hệ thống sử dụng ngắt Ý tưởng cơ bản của
giải pháp này là chúng ta có thể phân chia một vấn đề lớn thành các nhánh nhỏ và đơn giản hơn để giải quyết Mỗi một vấn đề con (sub-problem)
trở thành một tác vụ - task.Mỗi một tác vụ chỉ làm một việc đơn giản
Trang 19KHÁI NIỆM VỀ TASK .
- Cũng giống như các chương trình khác, một tác vụ bao gồm mã lệnh
để thực hiện các chức năng tác vụ phải thực hiện (do người lập trình đã thiết kế) Mã lệnh được chứa trong một hàm tương tự như hàm main() trong ngôn ngữ lập trình C Điều làm nên sự khác biệt của tác vụ chính
là ngữ cảnh (context) chứa trong ngăn xếp (stack) của nó.
Hình ảnh một task.
Trang 20KHÁI NIỆM VỀ TASK .
- Chú ý rằng, đôi khi (nhiều khi khá hữu dụng) ta có thể tạo ra nhiều tác
vụ từ một hàm chung Như đã nói, điều làm cho một tác vụ có thể tách
biệt và khác biệt với các tác vụ khác chính là ngăn xếp của nó
Cấu trúc thông thường của một task.
Trang 21-Mỗi tác vụ trong RTOS luôn luôn ở một trong ba trạng thái chính:
1 Running: Với ý nghĩa bộ xử lý đang thực hiện tác vụ Với một bộ xử
lý thì chúng ta chỉ chạy một tác vụ tại một thời điểm nhất định.
2 Ready : Với ý nghĩa một số tác vụ khác sẵn sàng chạy nếu bộ xử lý rỗi.
3 Blocked : Với ý nghĩa tác vụ không sẵn sàng chạy kể cả khi bộ xử lý
trong trạng thái nghỉ - Idle Tác vụ ở trong trạng thái này vì chúng đợi
một sự kiện bên ngoài tác động để kích hoạt nó trở lại trạng thái sẵn sàng.
CÁC TRẠNG THÁI CỦA TASK.
Trang 22CÁC TRẠNG THÁI CỦA TASK.
Mô hình trạng thái của các tác vụ.
Trang 24 User tasks should run at priority 8 or higher
Used by scheduler to determine which task to run next
Each task is assigned a priority :
Higher number means lower priority
0 is highest priority
Trang 25Common Scheduling Configurations:
Scheduler
FIFO (also called priority-based preemptive)
The active task is the highest-priority task that has been ready the longest
Round Robin
The active task is the highest-priority task that has been ready the
longest without consuming its time slice
Trang 26Priority Basead FIFO Scheduling
high
FIFO list of
Trang 27Priority Based FIFO Scheduling
high
FIFO list of
Trang 28Priority Based FIFO Scheduling
high
FIFO list of
Trang 29Round-Robin Scheduling
time 50ms 100ms 150ms
Trang 30MQX Tasks
If _task_create_blocked is used the task is
not ready until _task_ready() is called
_task_block
_task_ready
Tasks can be automatically created when MQX Starts;
also, any task can create another task by calling
_task_create() or
_task_create_blocked()
The function _task_create() puts the child task in
the ready state and the scheduler puts the higher
priority task to run
Trang 31Creating a Task
• When creating a task you have to:
Make the task prototype and index definition
Add the task in the Task Template List
Using the init_task example:
#define INIT_TASK 5 extern void init_task(uint_32);
TASK_TEMPLATE_STRUCT MQX_template_list[] = {
{ TASK_INDEX, TASK, STACK, TASK_PRIORITY, TASK_NAME, TASK_ATTRIBUTES,
CREATION_PARAMETER, TIME_SLICE}
}
TASK_TEMPLATE_STRUCT MQX_template_list[] = {
{INIT_TASK, init_task, 1500, 9, "init",
MQX_AUTO_START_TASK, 0, 0}, }
Trang 32Creating a Task
• When creating a task you have to:
Make the task definition
During execution time, create the task using
(if it is not an autostart task)
void init_task(void) {
/* Put the Task Code here */
}
task_create()
Trang 33{ WORLD_ID, world_task, 0x3000, 9, "world_task",
MQX_AUTO_START_TASK, 0L, 0},
{ HELLO_ID, hello_task, 0x1000, 8, “hello_task",
MQX_TIME_SLICE_TASK, 0L, 100},
{ LED_ID, led_task, 0x2000, 10, “LED Task",
MQX_AUTO_START_TASK | MQX_TIME_SLICE_TASK, 0L, 50},
Trang 34void init_task(void) {
void Task_B(void) {
.
_task_abort(TASK_B);
}
void Task_A(void) {
{TASK_A, Task_A, 1500, 10,
“Task A", 0, 0, 0},
{TASK_B, Task_B, 1500, 9,
“Task B", 0, 0, 0},
Trang 35Hầu hết các Real – time Kernel sử dụng giải thuật lịch trình thay thế theo độ ưu tiên ( preemptive priority- based
scheduling) làm mặc định.
Các task sẽ được thực thi tại bất kì một thời điểm là task có độ ưu tiên cao nhất so với các task khác đang ở trạng thái
sẵn sàng.
Real –Time Kernel hỗ trợ 256 cấp độ ưu tiên, với 0 là độ ưu tiên cao nhất và 255 là độ ưu tiên thấp nhất Một số Kernel
thì ngược lại với 255 là độ ưu tiên cao nhất và 0 là độ ưu tiên thâp nhất.
Với bộ chuyển đổi theo đọ ưu tiên, mỗi task phải có một độ ưu tiên, và task có độ ưu tiên cao nhất chạy đầu tiên Nếu
một Task có độ ưu tiên cao hơn task đang chạy trở nên sẵn sàng để chạy thì kernel sẽ ngay lập tức lưu lại trạng thái Task hiện tại và chuyển sang Task có độ ưu tiên cao hơn.
Mặc dù việc phân chia độ ưu tiên của Task được thực hiện khi task đó được tạo nhưng độ ưu tiên của Task là có thể
thay đổi một cách linh động sử dụng Lời gọi do kernel cung cấp ( Kernel – provided calls) Khả năng này
dùng để thay đổi một cách linh động cho phép một ứng dụng nhúng có độ linh hoạt để ứng xử với sự kiện bên ngoài
khi chúng xuất hiện, tạo ra một hệ thống thời gian thực và đáp ứng tốt Lưu ý là việc sử dụng không đúng khả năng
thay đổi độ ưu tiên này có thể dẫn đến đảo độ ưu tiên ( priority inversion), vùng chết ( deadlock), và có thể dẫn đến
treo hệ thống ( system failure).
Trang 36Hình 1.8 : Lịch trình theo Round- Robin
Mỗi Task sẽ cùng chia sẻ thời gian thực thi của CPU Round- Robin thuần túy không thỏa mãn yêu cầu của hệ thống
thời gian thực bởi vì một hệ thống thời gian thực các task phải làm việc theo mức độ quan trong khác nhau.
Ví dụ : ( Hình 8)
Thay vì thay thế theo độ ưu tiên, các task round –robin được phân chia thời giant thực thi theo các khoảng thời gian ( time slice).
Vơi time slicing , mỗi task sẽ được thực thi trong một khoảng thời gian nhất định, và theo vong trong Một bộ đếm
thời gian sẽ giám sát thời gian của mỗi Task, tăng lên theo mỗi xung clock Khi thời gian thực thi một task đã hết, bộ
đếm sẽ bị xóa, và task này sẽ được đặt ở cuổi cùng của chu kì ( end of circle)
Nếu như một task round-robin bị thay thế bởi mọt task có độ ưu tiên cao hơn, thì bộ đếm thời gian sẽ lưu lại và phục hồi khi task bị thay thế dành quyền thực thi lại.
Trang 38Tại sao phải đồng bộ hóa?
MQX Basics: Task Synchronization
Trang 39Đồng bộ hóa
• Một cách tổng quát, một Task phải đồng bộ hoạt động của nó với Task
khác để việc thực thi đa luồng( multi- thread) được đảm bảo Hoạt
động đồng bộ đảm bảo rằng thứ tự thực thi các Task được sử dụng.
Trang 40• Là đối tượng bắt sự kiện để đồng bộ giữa các tasks, có thể tăng hoặc giảm.
Trang 41Binary semaphore
Mutex semaphore
Trang 42Giám sát việc đồng bộ hóa
Tín hiệu đồng bộ
Trang 43Đồng bộ hóa trong chia sẽ đa tài nguyên hệ thống Đồng bộ hóa trong chia sẻ tài nguyên hệ thống
Trang 44Ready Suspended
Ready
Running
Running Running
Running Running
release resource
occupy resource
Trang 45Debugging MQX Applications
Debugging MQX Applications
- MQX RTOS and all other MQX components are statically linked to application code
- Plain CodeWarrior debugger can be used for basic tasks
- Without additional support from TAD, it is a challenge to
What is TAD (Task Aware Debugger)?
- Debugger Plug-in helping it to understand task state, descriptors and stack
- CodeWarrior IDE Plug-in able to display its content in a easy-to-understand way (selected variables, structure members etc)
Trang 46Debugging MQX Applications
CodeWarrior Development Studio How does TAD appear in CodeWarrior Development Studio ?
Trang 47TAD Installation and Activation
Download
Step 1
Step 3
Step 2
Trang 48Debugging MQX Applications
Installing TAD
Activating MQX TAD in Project
Trang 49Other TAD Featuers
Check for Errors
Trang 51TAD Screens
Task Summary
Stack Usage
Trang 52TAD Development
Available Today
◦ Classic CodeWarrior Debugger only with Professional Edition
CodeWarrior Studio for ColdFire V2-V4
CodeWarrior Studio for PowerPC (not public, EAI uses it to support PPC customers)
Prototype Avaialble
◦ EAI developed the TAD for IAR Debugger
◦ IAR toolset not yet supported by Freescale MQX (question of priorities)
Current Development (targeting 2010)
◦ Support Eclipse CodeWarrior 10
◦ Java & CORBA wrappers to make use of existing TAD code
◦ Resource and prioritization issues (MQX/CW10 support in general)
Trang 54MQXUG User Guide
1.1 MQXUG User Guide
1.1.1 MQXUG User Guide
Trang 55BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
Trang 56BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
1.3 MQXUSBHOSTAPIRM USB Host API
Refrence Manual
1.3.2 USB Host API Overview
1.3.3 Host API Functions
1.3.4 Device Framework Functions
1.3.5 Data Type Descriptions
Trang 57BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
1.4 MQXUSBDEVAPI USB Devide API Reference
1.4.2 Overview
1.4.3 USB Device Layer API
1.4.4 USB Device Layer API
1.4.5 USB Descriptor API function listings
1.4.6 USB Descriptor API function listings
1.4.7 Reference Data Types
http://cache.nxp.com/files/32bit/doc/ref_manual/
MQX_USB_Device_Reference_Manual.pdf?fpsp=1&WT_TYPE=Reference
%20Manuals&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=D
Freescale MQX Docummentation
Trang 59BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
1.5.2 Developing Applications
Compiling Freescale MQX™ USB Host Stack
Host Applications
Freescale MQX Docummentation
Trang 60Freescale MQX Docummentation
1.6 Freescale MQX™ I/O Drivers – User Guide
Trang 61BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
MCF5225X & Freescale MQX introduction
Further Reading and Training(Cont)
Trang 62BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
MCF5225X & Freescale MQX introduction
Further Reading and Training(Cont)
Trang 63BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
MCF5225X & Freescale MQX introduction
Further Reading and Training(Cont)
Trang 64BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
Further Reading and Training(Cont)
Introducing a modular system, Serial-to-Ethernet V1 ColdFire® MCU and Complimentary MQX™
RTOS
Trang 65BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
Further Reading and Training(Cont)
Introducing a modular system, Serial-to-Ethernet V1 ColdFire® MCU and Complimentary MQX™
RTOS
Trang 66BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
Further Reading and Training(Cont)
Introducing a modular system, Serial-to-Ethernet V1 ColdFire® MCU and Complimentary MQX™
RTOS
Trang 67Further Reading and Training(Cont)
Introducing a modular system, Serial-to-Ethernet V1 ColdFire® MCU and Complimentary MQX™
RTOS
Trang 68BẢO VỆ VÀ KHÔI PHỤC ĐƯỜNG
Further Reading and Training(Cont)
Introducing a modular system, Serial-to-Ethernet V1 ColdFire® MCU and Complimentary MQX™
RTOS
Trang 69Thanks You!