Đồ án Nghiên cứu và port hệ điều hành thời gian FreeRTOS lên vi điều khiển PIC

Mục lục

Lời cảm ơn . 1

Mục lục . 2

Danh mục hình vẽ và bảng biểu . 4

Mở đầu . 5

Phần I: Tổng quan về hệ điều hành thời gian thực . 6

I. Tổng quan các loại hệ điều hành . 6

1. Hệ điều hành cho Mainframe . 7

2. Hệ điều hành cho các Server . 8

3. Hệ điều hành đa vi xử lý . 8

4. Hệ điều hành cho máy tính cá nhân . 8

5. Hệ điều hành thời gian thực . 8

6. Hệ điều hành nhúng . 9

7. Hệ điều hành cho thẻ thông minh . 9

II. Tìm hiểu hệ điều hành thời gian thực . 10

1. Hệ điều hành thời gian thực (RTOS) . 10

2. Các loại hệ điều hành thời gian thực . 13

3. Tầm quan trọng hệ điều hành thời gian thực . 14

4. Các hệ điều hành thời gian thực phổ biến . 15

Phần II: Tìm hiểu chi tiết về FreeRTOS . 17

I. Tổng quan về FreeRTOS . 17

1. Khái niệm FreeRTOS . 17

2. Các đặc điểm của FreeRTOS . 18

3. Các vấn đề cơ bản trong FreeRTOS . 20

4. Cách phân phối tài nguyên của FreeRTOS . 23

5. So sánh hệ FreeRTOS với hệ điều hành thời gian thực uCOS . 27

II. Các file trong kernel của FreeRTOS . 29

1. Các file chính trong kernel . 29

2. Các file còn lại trongkernel của FreeRTOS . 34

III. Port FreeRTOS lên vi điều khiển PIC18F452 . 35

1. Một số chú ý khi port FreeRTOS lên vi điều khiển . 35

2. Các file cần để port lên vi điều khiển PIC18 sử dụng MPLAB . 38

Phần III: Mô phỏng và giao diện hỗ trợ port FreeRTOS lên PIC . 42

I. Mô phỏng port FreeRTOS lên vi điều khiển PIC . 42

1. Phân tích bài toán mô phỏng . 42

2. Triển khai bài toán và kết quả mô phỏng . 43

II. Giao diện hỗ trợ port FreeRTOS lên PIC. 44

1. Ý tưởng, mục đích và nhiệm vụ của giao diện hỗ trợ . 44

2. Trình bày cụ thể về các bước cài đặt và chạy thử . 44

Kết luận . 45

Tài liệu tham khảo . 46

Phụ lục . 47

I. Giải thích rõ các file trong FreeRTOS . 47

1. Các ký hiệu viết tắt trong các hàm và biến . 47

2. Các file chính cần có trong lõi FreeRTOS . 47

3. Các file còn lại trong kernel của FreeRTOS . 57

4. Các file cần để port FreeRTOS lên vi điều khiển . 59

II. Giải thích rõ về giao diện . 62

Các tài liệu sẽ thêm . 63

pdf64 trang | Chuyên mục: Hệ Điều Hành | Chia sẻ: dkS00TYs | Lượt xem: 2561 | Lượt tải: 5download
Tóm tắt nội dung Đồ án Nghiên cứu và port hệ điều hành thời gian FreeRTOS lên vi điều khiển PIC, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ủa file chỉ là định nghĩa các hằng số mà các hàm nên theo đó mà sử 
dụng. nếu không sử dụng thì hoàn toàn có thể bỏ file này đi nhưng chú ý rằng phải sửa 
lại hết các file dùng sẵn do người viết luôn tuân thủ chuẩn này: 
· pdTRUE = 1 
· pdFALSE = 0 
· pdPASS = 1 
· pdFAIL = 0 
· errQUEUE_EMPTY = 0 
· errQUEUE_FULL = 0 
Ngoài ra định nghĩa các lỗi: 
· errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY = -1 
· errNO_TASK_TO_RUN = -2 
· errQUEUE_BLOCKED = -4 
· errQUEUE_YIELD = -5 
b) queue.h 
Như tên gọi của file, tất cả các hàm và macro được khai báo trong file nhằm 
phục vụ cho việc sử dụng hàng đợi cho thuận tiện. Các chức năng cụ thể: 
· Tạo hàng đợi mới. 
· xQueueSendToToFront(): Gửi phần tử vào đầu hàng đợi. 
· xQueueSendToToBack(): Gửi phần tử vào sau hàng đợi. 
· xQueueGernericSend(): Gửi phần tử vào hàng đợi. 
· xQueuePeek(): Lấy phần tử ra khỏi hàng đợi mà không loại bỏ nó khỏi hàng 
đợi. Phần tử được gửi từ hàng đợi bằng cách copy ra một bộ đệm nên phải 
cung cấp cho bộ đệm dung lượng đủ. Số lượng byte được copy vào bộ đệm 
phải được khai báo từ khi tạo hàng đợi. 
· xQueueReceive(): Nhận phần tử từ hàng đợi. Phần tử được gửi từ hàng đợi 
bằng cách copy ra bộ đệm nên phải cung cấp cho bộ đệm dung lượng đủ. 
Lượng byte được copy vào bộ đệm phải được khai báo từ khi tạo hàng đợi. 
· Tương tự các hàm trên nhưng với hàng đợi trong phạm vi phục vụ ngắt có 
các hàm: xQueueSendToFrontFromISR(), xQueueSendToBackFromISR(), 
xQueueGenericSendFromISR(), xQueueReceiveFromISR(). 
· Tìm số message lưu trữ trong hàng đợi. 
· Xóa hàng đợi, giải phóng bộ nhớ phân phối cho hàng đợi. 
Đồ án tốt nghiệp 
Nghiên cứu và port hệ điều hành thời gian thực FreeRTOS lên vi điều khiển PIC 59 
c) semphr.h 
Tất cả các hàm và macro được khai báo trong file nhằm phục vụ cho việc sử 
dụng semaphore cho thuận tiện. Các chức năng cụ thể: 
· Tạo ra semaphore nhị phân, là kiểu đầu tiên được sử dụng trong đồng bộ 
giữa các tác vụ hoặc giữa tác vụ và ngắtThis type of semaphore can be used 
for pure synchronisation between tasks or between an interrupt and a task. 
Kiểu semaphore này chỉ là nhị phân nên nếu một task đang cứ sản xuất 
trong khi task khác cứ tiêu thụ thì sẽ không thỏa mãn. Do đó kiểu này không 
được sử dụng cho thuật toán ưu tiên kế thừa mà sử 
xSemaphoreCreateMutex(). 
· Lấy semaphore qua hàm xSemaphoreTake(), sử dụng xQueueReceive(). 
· Trả semaphore qua hàm xSemaphoreGive(), sử dụng xQueueGenericSend(). 
· Tương tự có semaphore phục vụ ngắt xSemaphoreGiveFromISR( ), sử dụng 
hàm xQueueGenericSendFromISR( ). 
· Tạo mutex qua xSemaphoreCreateMutex(), sử dụng xQueueCreateMutex(). 
4. Các file cần để port FreeRTOS lên vi điều khiển 
a) FreeRTOSconfig.h 
File được tạo ra với hai nhiệm vụ chính: 
· Định nghĩa các thông số, các chức năng cơ bản mà FreeRTOS hỗ trợ được 
định yêu cầu trong FreeRTOS.h. Các hàm, macro này nếu muốn khai báo có 
sử dụng thì định nghĩa là , ngược lại là 0. Để xem thêm các thông số cần 
khai báo cho phần này xem FreeRTOS.h 
· Các thông số cần định nghĩa cho từng vi điều khiển và từng project cụ thể: 
o configCPU_CLOCK_HZ: khai báo tần số làm việc của vi điều khiển 
theo đơn vị Hz. 
o configTICK_RATE_HZ: khai báo tần số tick muốn sử dụng, đơn vị Hz. 
o configMAX_PRIORITIES: giới hạn mức ưu tiên cao nhất được hỗ trợ để 
lập lịch. 
o configMINIMAL_STACK_SIZE: giới hạn độ sâu nhỏ nhất của ngăn xếp 
được dùng cho mỗi task. 
o configTOTAL_HEAP_SIZE: giới hạn tổng lượng RAM trong heap để 
cấp phát cho từng nhiệm vụ. 
o configMAX_TASK_NAME_LEN: giới hạn độ dài của tên các tác vụ, đơn 
vị tính bằng byte. 
Đồ án tốt nghiệp 
Nghiên cứu và port hệ điều hành thời gian thực FreeRTOS lên vi điều khiển PIC 60 
b) port.c 
Đây là file quan trọng nhất trong việc tạo ra các hàm định nghĩa trong 
portable.h cho việc port lên PIC. Các nhiệm vụ chính cụ thể như sau: 
· portTIMER_FOSC_SCALE = 4: khai báo để cài đặt phần cứng cho tick. 
· portINITAL_INTERRUPT_STATE = 0xc0: khởi tạo trạng thái cho phép ngắt 
cho các task được tạo mới. Giá trị này được copy vào INTCON khi chuyển 
task trong lần đầu tiên. 
· portGLOBAL_INTERRUPT_FLAG = 0x80: định nghĩa này chỉ cho các bit 
nằm trong INTCON, ngắt toàn cục. 
· portINTERRUPTS_UNCHANGED = 0x00: hằng số được sử dụng cho việc 
chuyển ngữ cảnh khi yêu cầu ngắt chuyển từ trạng thái cho phép ngắt sang 
trạng thái không thay đổi khi task vừa bị ngắt khôi phục lại. 
· portCOMPILER_MANAGED_MEMORY_SIZE = 0x13: một số vùng nhớ 
cần được lưu lại như một phần của ngữ cảnh tác vụ. Những vùng nhớ này 
được sử dụng bởi trình dịch cho việc lưu giữ trung gian, đặc biệt là khi thực 
hiện các phép tình toán học hoặc khi sử dụng dữ lệu 32 bit. Hằng số này 
định nghĩa độ lớn vùng nhớ phải lưu. 
· vSerialTxISR() và vSerialRxISR(): chương trình phục vụ ngắt cho cổng 
truyền tin nối tiếp được định nghĩa trong serial.c nhưng vẫn được gọi từ 
portable, coi như cũng là vector như tick ISR. Trong phần demo cụ thể mà 
em làm, em đã bỏ phần này đi để làm gọn lõi hệ của hệ điều hành, còn 
người sử dụng khi có thể tự cài đặt thêm nếu cần. 
· prvSetupTimerInterrupt(): cài đặt phần cứng để cho phép tick. 
· prvTickISR(): chương trình phục vụ ngắt để duy trì tick và thức hiện chuyển 
đổi ngữ cảnh tick nếu sử dụng kiểu preemptive. 
· prvLowInterrupt(): chương trình phục vụ ngắt thay thế cho vector mức ưu 
tiên thấp. Nó gọi những chương trình phục vụ ngắt thích hợp cho các ngắt 
thực tế. 
· Phần quan trọng cũng là khó nhất trong file là lưu và khôi phục ngữ cảnh 
trong mỗi lần chuyển đổi ngữ cảnh. Đó là hai macro portSAVE_CONTEXT() 
và portRESTORE_CONTEXT(). Với macro lưu ngữ cảnh, nó cất tất cả các 
thanh ghi làm nên ngữ cảnh của tác vụ vào ngăn xếp, sau đó cất đỉnh mới 
của ngăn xếp này vào TCB. Nếu lời gọi hàm này đến từ ISR thì bit cho phép 
ngắt này đã được set để ISR được gọi. Vì thế ta muốn lưu thanh ghi 
INTCON với các bit đã được set và ucForcedInterruptFlags. Điều này có 
Đồ án tốt nghiệp 
Nghiên cứu và port hệ điều hành thời gian thực FreeRTOS lên vi điều khiển PIC 61 
nghĩa là các ngắt sẽ được cho phép trở lại khi task vừa bị ngắt khôi phục. 
Nếu lời gọi từ thao tác (bằng tay) chuyển ngữ cảnh (ví dụ từ yield) thì ta sẽ 
lưu INTCON với trạng thái hiện thời của nó, và ucForcedInterruptFlags 
phải ở 0. Nó cho phép yield trong vùng bất ly. Ngoài ra, trình dịch thường 
sử dụng một số vùng ở phía dưới bộ nhớ dùng làm lưu trữ trung gian cho 
các tính toán. Điều này thực sự đúng khi kiểu dữ liệu 32bit được sử dụng. 
Các đoạn .tmpdata và MATH_DATA phải được lưu trữ như một phần của 
ngữ cảnh. Macronayf sẽ lưu trữ từ địa chỉ 0x00 đến 
portCOMPLIER_MANAGED_MEMORY_SIZE. 
o Lưu thanh ghi WREG đầu tiên, nó sẽ bị thay đổi ngay trong các thao tác 
dưới đây. 
o Lưu thanh ghi INTCON với các bit thích hợp. 
o Lưu các thanh ghi cần thiết vào ngăn xếp như: BSR, FSR2L, FSR2H,… 
o Lưu .tmpdata và MATH_DATA. 
o Lưu con trỏ ngăn xếp phần cứng trong thanh ghi trung gian trước khi tat 
hay đổi chúng. 
o Lưu đỉnh của con trỏ ngăn xếp mềm vào TCB. 
với macro portRESTORE_CONTEXT ta làm gần như ngược lại. Nhưng hết 
sức chú ý rằng các lưu trữ này đúng với hầu hết các ứng dụng nhưng không 
phải hoàn toàn. Cần phải kiểm tra lại với từng ứng dụng cụ thể. 
· *pxPortInitialiseStack(): cài đặt ngăn xếp của task mới để nó sẵn sàng hoạt 
động khi bộ lập lịch điều khiển. Các thanh ghi phải được gửi vào ngăn xếp 
theo thứ tự để port có thể tìm được chúng. 
· xPortStartScheduler(): cài đặt phần cứng sẵn sàng cho bộ lập lịch điều 
khiển. Nhìn chung là cài đặt cho ngắt tick và cài đặt timer cho tần số đúng 
của tick. Hàm này được sử dụng ở preemptive (tức là 
configUSE_PREEMTIVE được đặt bằng 1) 
· vPortEndScheduler(): hủy toàn bộ càiđặt cho phần cứng/ISR đã được thực 
hiện bởi xPortStartScheduler() vì thế phần cứng được để lại các điều kiện 
đầu tiên sau khi bộ lập lịch dừng hoạt động. Hàm này không thể xảy ra trong 
bộ lập lịch cho port PIC do không thể dừng sau 1 lần chạy. 
· vPortYield(): chuyển ngữ cảnh thủ công. Hàm này giống như chuyển đổi 
ngữ cảnh tick nhưng không tăng biến đếm tick. Nó phải đúng như chuyển 
đổi ngữ cảnh tick trong việc lưu trữ vào ngăn xếp của task như thế nào. 
Đồ án tốt nghiệp 
Nghiên cứu và port hệ điều hành thời gian thực FreeRTOS lên vi điều khiển PIC 62 
c) portmacro.h 
File này định nghĩa cho riêng phần port. Các định nghĩa này cấu hình cho 
FreeRTOS đúng với phần cứng và trình dịch. Các cài đặt này không được biến đổi. 
Các nhiệm vụ của file như sau: 
· Định nghĩa các kiểu số liệu cơ bản sử dụng trong FreeRTOS, như: char 
(portCHAR), float (portFLOAT), int (portSHORT), ... 
· Kiểm tra xem nếu sử dụng USE_16_BIT_TICKS thì đặt cho thời gian cực 
đại delay là 0xFFFF, ngược lại delay sẽ lớn hơn 0xFFFFFFFF. 
· Ngoài ra phần rất quan trọng là khai báo vị trí thanh ghi ngắt toàn cục, hàm 
cho phép và không cho phép ngắt. Ví dụ như đối với PIC18F452 cần khai 
báo vị trí thanh ghi ngắt toàn cục là 0x80, bit cho phép ngắt toàn cục hay 
không là INTCONbits.GIEH. Tiếp đó là lệnh delay của vi điều khiển 
portNOP(). 
· Vấn đề khác trong file là tạo hàm ENTER_CRITICAL() và 
EXIT_CRITICAL(). Khi bắt đầu đoạn bất ly cần cất thanh ghi ngắt vào 
ngăn xếp sau đó không cho phép ngắt toàn cục. Ngược lại, khi ra khỏi đoạn 
bất ly cần khôi phục thanh ghi ngắt từ ngăn xếp và cho phép ngắt nếu trước 
khi ngắt có cho phép. Không được thay đổi bất kỳ bit nào khác trong thanh 
ghi điều khiển ngắt. 
II. Giải thích rõ về giao diện 
Đồ án tốt nghiệp 
Nghiên cứu và port hệ điều hành thời gian thực FreeRTOS lên vi điều khiển PIC 63 
Các phần bổ sung 
Rtos ppts.ppt: File này trình bày về uCOS 
Rtproj.pdf: so sánh Free với RTLinux 
36-danlu911…pdf: so sánh Free và eCOS 
Freertos.pdf: các câu hỏi về freeRTOS 
RTOS.doc: xem lại kỹ file này có phần so sánh 
Việc còn lại 
Hoàn thành phần so sánh 
Viết lời cảm ơn, lời mở đầu, kết luận, hướng phát triển 
Chỉnh lại phần phụ lục. 
Xem lại các câu chữ 

File đính kèm:

  • pdfĐồ án Nghiên cứu và port hệ điều hành thời gian FreeRTOS lên vi điều khiển PIC.pdf