Đồ á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
ủ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:
- Đồ á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