Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
187,26 KB
Nội dung
Chương I Tổng quan hệ điều hành thời gian thực .2 Câu 1: Thế thời gian thực? mô tả ngắn gọn dạng thời gian thực? Câu 2: Trình bày chức hệ điều hành thời gian thực Câu 3: So sánh hệ điều hành thời gian thực với hệ điều hành PC Câu 4: Phân loại hệ điều hành thời gian thực Mô tả ngắn gọn đặc điểm loại .3 Câu 5: Trình bày lịch sử phát triển mô tả đặc điểm hệ điều hành thời gian thực Câu 6: hệ điều hành FreeRTOS có đặc điểm gì? .3 Câu 7: Trình bày thành phần hệ điều hành thời gian thực Chương II FreeRTOS quản lý tác vụ hàng đợi .5 Câu 1: Khái niệm TCB (Task Control Block)? Câu 2: Quản lý tác vụ Câu 3: Các trạng thái tác vụ Câu 4: Các hàm API Chương III FreeRTOS: quản lý ngắt Câu 1: Quản lý ngắt Câu 2: Ngắt lồng .8 Câu 3: Các hàm API Chương IV Quản lý tài nguyên nhớ 12 Câu 1: Các hàm API cấp phát nhớ,giải phóng nhớ 12 Câu 2: Mô tả, so sánh thư viện heap_1.c,heap_2.c, heap_3.c, heap_4.c, heap_5.c .13 Câu 3: Khái niệm Semaphone, Mutex mục đích sử dụng .15 Câu 4: Phân biệt nhớ heap stack 16 Chương V xử lý cố 17 Câu 1: Trình bày số lỗi thơng dụng FreeRTOS 17 Chương VI Cách sử dụng one-shot timer auto- reaload timer 20 Câu 1: Khởi tạo one-shot and auto-reload timers hàm xCreateTimer(); 20 Chương I Tổng quan hệ điều hành thời gian thực Câu 1: Thế thời gian thực? mô tả ngắn gọn dạng thời gian thực? Khái niệm: Thời gian thực thể chỗ: hệ thống phải có phản ứng thích hợp, thời điểm với mơi trường Thời gian thực có nghĩa “ đủ nhanh” ngữ cảnh, môi trường mà hệ thống hoạt động Khái niệm hệ điều hành thời gian thực: Real Time Operating Systems phần mềm điều khiển chuyên dụng thường dùng ứng dụng điện tốn nhúng có tài ngun nhớ hạn chế yêu cầu ngặt nghèo thời gian đáp ứng tức thời, tính sẵn sàng cao khả tự kiểm sốt cách xác Các dạng thời gian thực: - Thời hạn lập lịch (scheduling deadline): thời gian thực đòi hỏi giới hạn cao thời gian trễ - Thời gian thực cứng (hard real-time): hệ thống phải tiếp nhận nắm bắt thời gian lập lịch thời điểm Sự sai sót việc tiếp nhận thời hạn dẫn đến hậu nghiêm trọng người - Thời gian thực mềm” (soft real- time): thời gian lập lịch dễ thở chút Hệ thống phản ứng lại kiện thời gian cho phép khơng có thực nghiêm trọng xảy hệ thống bị trễ Lỗi mặt thời gian đơn giản dẫn đến hậu giảm độ tin cậy đối tượng đồi với hệ thống mà khơng có hậu thê thảm khác xảy Đặc điểm: - Đơn giản Phản hồi đảm bảo Ràng buộc thời gian nghiêm ngặt Giới hạn băng thông lớn nhỏ Các thành phần xác định Hành vi đốn trước Có thể nâng cấp Câu 2: Trình bày thành phần hệ điều hành thời gian thực - Bộ lập lịch (Scheduler): Đây thành phần RTOS chính, xác định thứ tự thực tác vụ luồng thường dựa sơ đồ ưu tiên theo kiểu Round-Robin completion - Đa xử lý đối xứng (SMP – Symmetric Multiprocessing): RTOS có khả xử lý phân tách nhiều tác vụ luồng để chúng chạy nhiều lõi phép xử lý mã song song (nghĩa đa nhiệm) - Thư viện chức (Function library): Là giao diện tiêu chuẩn chứa giao diện chương trình ứng dụng (API) để gọi tường trình bên nó, giao diện kết nối mã ứng dụng kernel Mã ứng dụng thực thể yêu cầu trực tiếp đến kernel thông qua thư viện hàm để nhắc ứng dụng đưa hành vi lập trình mong muốn - Thời gian chuyển đổi ngữ cảnh/độ trễ điều chỉnh nhanh (Fast dispatch latency/context switch time: Chuyển đổi ngữ cảnh thời gian cần thiết để chuyển đổi từ luồng chạy sang luồng khác, điều liên quan đến việc lưu bối cảnh tác vụ thay bối cảnh luồng để chạy Trong RTOS thời gian chuyển đổi nên trì tính định tối thiểu - Các đối tượng lớp liệu người dùng định nghĩa (User-defined data objects and classes): RTOS dựa ngơn ngữ lập trình với cấu trúc liệu tổ chức dựa loại hoạt động chúng Người dùng định nghĩa đối tượng thơng qua ngơn ngữ lập trình định C ++ mà RTOS sử dụng để kiểm soát ứng dụng định - Quản lý nhớ (Memory Management): Cần quản lý nhớ để phân bổ nhớ cho chương trình chạy đối tượng tham chiếu nhớ Câu 3: Trình bày chức hệ điều hành thời gian thực - RTOS phải quản lý tài nguyên nhớ, xử lý I/O - Lập lịch xử lý ưu tiên - Đảm bảo ràng buộc thời gian nghiêm ngặt cung cấp hoạt động đáng tin cậy - Tính mềm dẻo để phù hợp với yêu cầu ứng dụng khác - Hỗ trợ đồng hóa giao tiếp tác vụ - Khi hệ thống phức tạp xây dựng, RTOS quản lý việc tích hợp thành phần Câu 4: So sánh hệ điều hành thời gian thực với hệ điều hành PC Hệ điều hành thời gian thực (RTOS) cho hệ thống nhúng khác so với hệ điều hành khác máy tính desktop Windows hay UNIX: - Thứ nhất: máy tính desktop hệ điều hành chiếm quyền điều khiển sau máy bật sau cho ta bắt đầu ứng dụng mình.Cịn hệ thống nhúng, ứng dụng thường xun liên kết với RTOS, lúc khởi động, ứng dụng nhận lấy quyền điều khiển sau bắt đâu RTOS - Thứ hai, nhiều RTOS không bảo vệ thân chúng cách cẩn thận hệ điều hành desktop - Thứ ba, để tiết kiệm nhớ RTOS mặc định bao gồm dịch vụ cần thiết cho ứng dụng nhúng ta - Thứ tư, hầu hết hệ điều hành máy desktop quan tâm đến hiệu trung bình hệ điều hành thời gian thực quan tâm đến giới hạn, thời gian đáp ứng Câu 4: Phân loại hệ điều hành thời gian thực Mô tả ngắn gọn đặc điểm loại - Hệ điều hành thời gian thực thương mại: HĐH nhỏ với mục đích thương mại hệ điều hành nhỏ nhanh như: QNX, PDOS, Psos, VxWorks, ERCOS, WinCE… - Hệ điều hành thời gian thực mã nguồn mở: RT-UNIX, RT-LINUX, RTMACH, RT-POSIX chúng chậm có khả dự đốn so với hệ điều hành thời gian thực thương mại chúng có nhiều chức môi trường phát triển tốt dựa tập giao tiếp chuẩn thân thiện - Các nhân cho mục đích nghiên cứu: hệ điều hành có đặc điểm: + Hỗ trợ thuật toán lập lịch thời gian thực việc phân tích thời gian + Hỗ trợ dịch vụ để đồng thời gian thực + Nhấn mạnh khả dự đốn hiệu trung bình + Hỗ trợ cho khả chịu lỗi Ví dụ: Sping, MARS,CHAOS,DARK… Câu 5: Trình bày lịch sử phát triển mơ tả đặc điểm hệ điều hành thời gian thực - Tài nguyên nhớ hạn chế - Yêu cầu ngặt nghèo thời gian đáp ứng tức thời - Tính sẵn sàng cao khả tự kiểm sốt cách xác - RTOS đóng vai trò quan trọng phát triển hệ thống nhúng thời gian thực Câu 6: Hệ điều hành FreeRTOS có đặc điểm gì? FreeRTOS hệ điều hành thời gian thực (RTOS) thiết kế đủ nhỏ để chạy vi xử lý - FreeRTOS cung cấp chức lập lịch thời gian thực lõi, truyền thông liên tác vụ, định thời đồng - FreeRTOS thiết kế phù hợp cho nhiều hệ thống nhúng nhỏ gọn triển khai chức - FreeRTOS hệ điều hành nhúng thời gian thực mã nguồn mở - Là hệ điều hành nhúng phù hợp cho nghiên cứu, học tập kỹ thuật, công nghệ việc phát triển mở rộng tiếp thành phần cho hệ điều hành Chương II FreeRTOS quản lý tác vụ hàng đợi Câu 1: Khái niệm TCB (Task Control Block)? FreeRTOS kernel quản lý task qua TCB Một TCB tồn cho task FreeRTOS bao gồm tồn thơng tin trạng thái task TCB RTOS quản lí thơng tin trạng thái làm việc Task tương ứng, giá trị tạm thời ghi mà sử dụng bị task khác block Ngồi cịn chứa số thông tin khác event gắn với task ( với OS hỗ trợ semaphore chẳng hạn) time wait task( với OS hỗ trợ hàm delay,supend) Câu 2: Quản lý tác vụ Câu 3: Các trạng thái tác vụ - Một ứng dụng bao gồm nhiều tác vụ, tác vụ tồn hai trạng thái “Running” “Not Running” - Khi tác vụ trạng thái “Running”, xử lý thực thực thi mã lệnh - Khi tác vụ trạng thái “Not Running”, tác vụ khơng hoạt động, trạng thái lưu sẵn sàng để tiếp tục thực lần trình lập lịch định nên chuyển sang trạng thái “Running” - Một tác vụ chuyển từ tt “Not Running” sang “Running” gọi “chuyển vào” “đổi vào”, ngược lại chuyển đổi a Trạng thái “Block”: - Một tác vụ chờ đợi kiện gọi trạng thái “Block”, trạng thái trạng thái “Not Running” - Các tác vụ nhập vào trạng thái “Block” để đợi hai loại kiện khác kiện thời gian kiện đồng hóa b Trạng thái “Suspend” ( đình chỉ) - Là trạng thái “Not Running” Các tác vụ trạng thái không sẵn sàng cho trình lập lịch - Cách chuyển vào trạng thái “suspend” thông qua lời gọi đến hàm API vTaskSuspend(), để chuyển thông qua lời gọi hàm API vTaskResume() hàm xTaskResumeFromISR() c Trạng thái “Ready” (sẵn sàng) - Là tt Các tác vụ tt “Not Running” trạng thái “Block” “Suspend” - Chúng chạy sẵn sàng để chạy tt “Running” Sơ đồ chuyển trạng thái sau: Câu 4: Các hàm API a Khởi tạo tác vụ: +pvTaskCode: trỏ trỏ đến hàm thực thi tác vụ + pcName: Tên mô ta tác vụ, tên không sử dụng FreeRTOS hình thức nào, hỗ trỡ cho việc debug + usStrackDepth: kích thước ngăn xếp (Stack), xác định số lượng từ (word) ngăn xếp giữ, khơng phải số byte + pvParameters: Các hàm tác vụ chấp nhận tham số trỏ kiểu void (void *) Giá trị gán cho pvParameters giá trị đưa vào tác vụ + uxPriority: Mức ưu tiên tác vụ thực thi + pxCreatedTask: Có thể sử dụng để vượt qua xử lý (handle) tác vụ khởi tạo Xử lý từ sử dụng để tham chiếu đến tác vụ lời gọi API, ví dụ, thay đổi mức ưu tiên tác vụ xóa tác vụ + Giá trị trả về: pdTRUE: Tác vụ tạo thành cơng errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: Tác vụ khơng thể tạo khơng có đủ nhớ heap khả dụng cho FreeRTOS để cấp phát đủ RAM nhằm giữ cấu trúc liệu tác vụ ngăn xếp a Xóa tác vụ vTaskDelete(xTaskHandle pxTaskToDelete) pxTaskToDelete: Trình điều khiển tác vụ bị xóa (tác vụ chủ thể) - xem tham số pxCreatedTask hàm API xTaskCreate () để biết thông tin cách xử lý tác vụ Một tác vụ xóa cách cách chuyển NULL vào vị trí tác vụ xử lý hợp lệ b Thay đổi mức độ ưu tiên tác vụ void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); + pxTask: Xử lý tác vụ có quyền ưu tiên sửa đổi + uxNewPriority: Mức độ ưu tiên c Truy vấn mức độ ưu tiên tác vụ: uxTaskPriorityGet(pxTask): Tên tác vụ muốn truy vấn Câu 5: QCB (Queue Control Block) gì? Đặc điểm hàng đợi, hàm API 5.1 QCB (Queue Control Block) 5.2 Đặc điểm hàng đợi Câu 6: Cách thức đồng tác vụ truyền thông liên tác vụ Signal EventFlagGroup Semaphores 10 Chương III FreeRTOS: Quản lý ngắt Câu 1: Quản lý ngắt Semaphore: Một semaphore nhị phân sử dụng để mở khóa tác vụ lần có ngắt cụ thể xảy ra, đồng hóa hiệu tác vụ với ngắt Điều cho phép phần lớn xử lý kiện ngắt thực tác vụ đồng hóa, với phần nhanh ngắn lại trực tiếp ISR Xử lý ngắt tàm ngưng tác vụ xử lý Cờ hiệu: Trình tự thực thi sau: - Một ngắt xảy - Chương trình phục vụ ngắt thực hiện, đưa cờ hiệu mở khóa trình xử lý tác vụ - Trình xử lý tác vụ thực thi ngắt hoàn thành Điều trình xử lý tác vụ thực lấy cờ hiệu - Trình xử lý tác vụ thực xử lý kiện trước cố gắng lấy lại cờ hiệu – nhập trạng thái Block cờ hiệu không khả dụng tức thời Hàng đợi: Các hàng đợi dùng để giao tiếp kiện truyền liệu Câu 2: Ngắt lồng Ngắt lồng chương trình ngắt gọi chương trình ngắt khác Những cổng yêu cầu hai số sau: Hằng số configKERNEL_INTERRUPT_PRIO RITY Mô tả Thiết lập mức ưu tiên ngắt sử dụng ngắt đánh dấu Nếu cổng khơng dùng configMAX_SYSCALL_INTERRUPT _PRIORITY ngắt sử dụng hàm API FreeRTOS an toàn ngắt phải thực thi mức ưu tiên configMAX_SYSCALL_INTERRUPT Thiết lập mức ưu tiên ngắt cao từ _PRIORITY hàm API FreeRTOS an toàn ngắt gọi 11 Một mơ hình lồng ngắt hồn chỉnh tạo việc thiết lập configMAX_SYSCALL_INTERRUPT_PRIORITY mức ưu tiên cao configKERNEL_INTERRUPT_PRIORITY Câu 3: Các hàm API a Hàm API vSemaphoreCreateBinary() :Được sử dụng để tạo semaphore nhị phân - Hàm: Void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore ); - Tham số xSemaphore :Cờ hiệu khởi tạo b Hàm API xSemaphoreTake() - Semaphore nhận khả dụng - xSemaphoreTake() khơng sử dụng từ chương trình phục vụ ngắt - hàm: portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait ); o xSemaphore: Semaphore lấy o xTicksToWait :lượng thời gian lớn tác vụ nên trì trạng thái block để đợi cờ hiệu chưa sẵn sàng o giá trị trả pdPASS Chỉ trả lời gọi xSemaphoreTake() thành cơng việc có Semaphore pdFALSE Semaphore không khả dụng c Hàm API xSemaphoreGiveFromISR() - Tất loại Semaphore FreeRTOS khác ngoại trừ cờ hiệu đệ quy sử dụng hàm xSemaphoreGiveFromISR() - xSemaphoreGiveFromISR() dạng đặc biệt xSemaphoreGive() đặc biệt sử dụng chương trình phục vụ ngắt - hàm portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken ); 12 - Tham số o xSemaphore:Semaphore đưa pxHigherPriorityTaskWokenCó thể Semaphore có nhiều tác vụ bị chặn chờ đợi Semaphore để trở nên sẵn sàng Việc gọi xSemaphoreGiveFromISR() làm cho Semaphore khả dụng, khiến tác vụ khỏi trạng thái Block Nếu việc gọi xSemaphoreGiveFromISR() khiến tác vụ thoat khỏi trạng thái Block tác vụ mở khóa có mức độ ưu tiên cao tác vụ thực thi (tác vụ bị ngắt), xSemaphoreGiveFromISR() thiết lập bên *pxHigherPriorityTaskWoken thành pdTRUE.Nếu xSemaphoreGiveFromISR() thiết lập giá trị thành pdTRUE chuyển đổi ngữ cảnh nên thực trước ngắt thoát Điều đảm bảo ngắt trực tiếp trả tác vụ trạng thái Ready có mức ưu tiên cao - giá trị trả về: o pdPASS :Chỉ trả lời gọi xSemaphoreGiveFromISR() thàn công o pdFAIL :Nếu cờ hiệu có sẵn, khơng thể đưa ra, xSemaphoreGiveFromISR() trả pdFAIL Các hàm API cờ đếm: d Hàm API xSemaphoreCreateCounting() - Trước cờ hiệu thực sử dụng, phải tạo Sử dụng hàm API xSemaphoreCreateCounting() để tạo cờ đếm - Hàm: xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount ); - tham số trả về: o uxMaxCount :Giá trị lớn mà cờ hiệu đếm tới Giá trị uxMaxCount có ảnh hưởng đến độ dài hàng đợi o uxInitialCount :Giá trị đếm khởi tạo cờ hiệu sau tạo - Giá trị trả : o Nếu trả giá trị NULL cờ hiệu khơng tạo khơng có đủ nhớ heap khả dụng cho FreeRTOS cấp phát cho cấu trúc liệu cờ hiệu o Nếu trả giá trị khác NULL cho biết cờ hiệu tạo thành công Giá trị trả nên lưu trữ công cụ xử lý để tạo cờ hiệu Hàm API chương trình phục vụ ngắt - Có hàm: xQueueSendToFrontFromISR(), xQueueSendToBackFromISR() xQueueReceiveFromISR() 13 phiên tương ứng xQueueSendToFront(), xQueueSendToBack() xQueueReceive() sử dụng an tồn chương trình phục vụ ngắt - Các hàng đợi dùng để giao tiếp kiện truyền liệu Nguyên mẫu hàm API xQueueSendToFrontFromISR() portBASE_TYPE xQueueSendToFrontFromISR ( xQueueHandle xQueue, void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken ); Nguyên mẫu hàm API xQueueSendToBackFromISR() portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle xQueue, void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken ); - Tham số: o xQueue: Xử lý hàng đợi mà liệu gửi đến (ghi) Xử lý hàng đợi trả từ lời gọi hàm xQueueCreate() dùng để tạo hàng đợi o pvItemToQueue: Con trỏ trỏ đến liệu chép vào hàng đợi o pxHigherPriorityTaskWoken: Một hàng đợi đơn có nhiều tác vụ bị chặn đợi liệu trở nên khả dụng Gọi xQueueSendToFrontFromISR() xQueueSendToBackFromISR() làm liệu khả dụng khiến tác vụ rời trạng thái Block Nếu việc gọi hàm API khiến tác vụ rời trạng thái Block, tác vụ khơng bị chặn có mức ưu tiên cao tác vụ thực thi (tác vụ bị ngắt), sau hàm API tự thiết lập *pxHigherPriorityTaskWoken thành pdTRUE Nếu xQueueSendToFrontFromISR() xQueueSendToBackFromISR() thiết lập giá trị thành pdTRUE, sau chuyển đổi ngữ cảnh nên thực trước ngắt bị thoát Điều đảm bảo ngắt trực tiếp trả tác vụ trạng thái Ready có mức ưu tiên cao - Giá trị trả : pdPASS: Chỉ trả liệu gửi thành công đến hàng đợi errQUEUE_FULL: Được trả liệu gửi đến hàng đợi hàng đợi đầy 14 Chương IV Quản lý tài nguyên nhớ Câu 1: Các hàm API cấp phát nhớ,giải phóng nhớ Hàm xPortGetFreeHeapSize(): Hàm API xPortGetFreeHeapSize () trả số lượng byte miễn phí heap thời gian hàm gọi Nó sử dụng để tối ưu hóa kích thước heap Ví dụ, xPortGetFreeHeapSize () trả 2000 sau tất đối tượng kernel tạo, sau giá trị configTOTAL_HEAP_SIZE giảm 2000 xPortGetFreeHeapSize () không khả dụng heap_3 sử dụng Hàm xPortGetMinimumEverFreeHeapSize() Hàm API xPortGetMinimumEverFreeHeapSize () trả số lượng tối thiểu byte chưa phân bổ tồn heap kể từ ứng dụng FreeRTOS bắt đầu thực thi Giá trị trả xPortGetMinimumEverFreeHeapSize () dấu hiệu cho thấy mức độ ứng dụng hết hết dung lượng Ví dụ: xPortGetMinimumEverFreeHeapSize () trả 200, thời điểm kể từ ứng dụng bắt đầu thực thi, xuất vịng 200byte hết dung lượng heap xPortGetMinimumEverFreeHeapSize () khả dụng sử dụng heap_4 heap_5 Hàm pvPortMalloc() pvPortMalloc () gọi trực tiếp từ mã ứng dụng Nó gọi FreeRTOS tập tin nguồn đối tượng kernel tạo Ví dụ đối tượng kernel bao gồm tác vụ, hàng đợi, semaphores nhóm kiện Giống hàm malloc () thư viện chuẩn, pvPortMalloc () trả khối RAM khối kích thước u cầu khơng tồn tại, sau trả NULL Nếu pvPortMalloc () thực thi trình ghi ứng dụng tạo đối tượng kernel lệnh gọi pvPortMalloc () trả NULL, đối tượng kernel không tạo Tất lược đồ phân bổ heap mẫu cấu hình để gọi hàm hook (hoặc gọi lại) lệnh gọi pvPortMalloc () 15 trả NULL Nếu configUSE_MALLOC_FAILED_HOOK đặt thành FreeRTOSConfig.h, ứng dụng phải cung cấp hàm hook malloc Failed Hàm pvPortFree(): Dùng để giải phóng nhớ Câu 2: Mô tả, so sánh thư viện heap_1.c,heap_2.c, heap_3.c, heap_4.c, heap_5.c a Heap_1.c Đây cách xếp đơn giản Nó khơng cho phép giải phóng nhớ chúng phân phối thích hợp cho phần lớn ứng dụng Thuật toán đơn giản chia mảng đơn vào khối có yêu cầu RAM Dung lượng tổng dãy đặt cách định nghĩa configTOTAL_HEAP_SIZE FreeRTOSconfig.h Sự phân phối này: Có thể sử dụng ứng dụng khơng xóa task hàng đợi Ln tiền định (luôn khoảng thời gian để trở block) Được sử dụng PIC, AVR 8051 khơng linh hoạt việc tạo xóa task sau vTaskStartScheduler () gọi b Heap_2.c Sự xếp coi thuật toán tốt nhất, khơng giống heap_1, cho phép khối nhớ trước giải phóng Nó khơng kết hợp khối free liền kề thành khối lớn nên dễ bị phân mảnh Ngoài tổng lượng RAM đặt cách định nghĩa configTOTAL_HEAP_SIZE FreeRTOSconfig.h Sự xếp này: Có thể dùng ứng dụng gọi lại nhiều lần vTaskCreate() / vTaskDelete()… Không nên sử dụng nhớ phân phối giải phóng với dung lượng bất kỳ, trường hợp đơn giản sau: task bị xóa có độ sâu stack khác nhau, hàng đợi bị xóa có độ dài khác Có thể xảy vấn đề phân mảnh nhớ ứng dụng tạo khối, task, hàng đợi không theo trật tự Không tiền định khơng phải khơng có khả đặc biệt · 16 Có thể sử dụng ARM7 Flashlite linh động việc tạo xóa task heap_2.c thích hợp cho ứng dụng thời gian thực tạo task cách linh động c Heap_3.c Đây chuẩn cho malloc () free (), làm cho chức thread an toàn: Yêu cầu liên kết để cài đặt heap thư viện dịch để giúp malloc () free () thực Không tiền định Sẽ gia tăng dung lượng kernel lên nhiều Sử dụng cho PC d Heap_4.c Giống heap_1 heap_2, heap_4 hoạt động cách phân chia mảng thành khối nhỏ Như trước đó, mảng khai báo tĩnh, định kích thước TOTAL_HEAP_SIZE, đó, làm cho ứng dụng xuất để tiêu thụ nhiều RAM, chí trước nhớ thực phân bổ từ mảng Heap_4 sử dụng thuật toán phù hợp để phân bổ nhớ Không giống heap_2, heap_4 kết hợp khối nhớ trống liền kề thành khối lớn hơn, giúp giảm thiểunguy bị phân mảnh nhớ Thuật toán phù hợp đảm bảo pvPortMalloc () sử dụng khối nhớ miễn phí lớn đủ để giữ số byte yêu cầu Ví dụ, xem xét kịch đó: Heap chứa ba khối nhớ trống, theo thứ tự xuất mảng, 5byte, 200byte 100byte pvPortMalloc () gọi để yêu cầu 20byte RAM Khối RAM miễn phí mà số byte yêu cầu phù hợp 200byte chặn, pvPortMalloc () chia khối 200byte thành khối 20byte khối 180byte, trước trả trỏ tới khối 20byte Khối 18byte cịn có sẵn cho gọi tương lai tới pvPortMalloc () 17 Heap_4 kết hợp (kết hợp) khối miễn phí liền kề thành khối lớn nhất, giảm thiểu nguy phân mảnh làm cho phù hợp với ứng dụng phân bổ nhiều lần miễn phí khối RAM có kích thước khác e Heap_5.c Thuật toán sử dụng heap_5 để phân bổ nhớ trống giống hệt với thuật toán sử dụng heap_4 Không giống heap_4, heap_5 không giới hạn việc phân bổ nhớ từ khai báo mảng tĩnh; heap_5 phân bổ nhớ từ nhiều không gian nhớ tách biệt Thuật toán sử dụng thuật toán kết hợp nhớ nhớ giống heap_4 cho phép vùng heap trải rộng nhiều vùng nhớ không liền kề (không liền kề) Tại thời điểm ghi, heap_5 cung cấp lược đồ cấp phát nhớ cung cấp phải khởi tạo rõ ràng trước pvPortMalloc () gọi Heap_5 khởi tạo cách sử dụng hàm vPortDefineHeapRegions () Hàm phải gọi trước lệnh gọi tới pvPortMalloc () - không tạo tác vụ, hàng đợi, semaphore, mutex, đếm thời gian phần mềm, nhóm kiện, v.v dẫn đến pvPortMalloc gọi pxHeapRegions truyền vào mảng cấu trúc HeapRegion_t - cấu trúc xác định vùng nhớ sử dụng làm heap Mảng kết thúc cấu trúc HeapRegions_t có kích thước Vùng có địa bắt đầu thấp phải xuất mảng vùng nhớ xác định mảng phải xuất theo thứ tự địa chỉ, từ địa thấp đến địa cao Câu 3: Khái niệm Semaphone, Mutex mục đích sử dụng Semaphore mục liệu chương trình sử dụng để định xem tác vụ tiến hành hay khơng hay nên tạm dừng Có hai loại semaphore: semaphore “nhị phân” (binary) “chung” (general) hay “đếm” (counting) Semaphore sử dụng đồng thời cho hai mục đích khác biệt phần mềm Nó hoạt động nhƣ thiết bị loại trừ lẫn nhaumutex (loại bỏ tranh chấp), semaphore đƣợc phân bổ cho tài nguyên đƣợc chia sẻ Nó sử dụng để đồng hóa tương tác tác vụ 18 Mutex (MUTual Exclusion - Tức loại trừ lẫn nhau) giống với semaphore dành riêng cho kiểm soát quyền truy cập vào nguồn tài nguyên chia sẻ Mục đích chế loại trừ lẫn kiểm soát quyền truy cập vào tài nguyên chia sẻ Tài nguyên bao gồm phần cứng, liệu chia sẻ phần mềm hệ thống Câu 4: Phân biệt nhớ heap stack Vùng heap FreeRTOS không dùng để chứa Task mà chứa biến cấp phát động hàm malloc() pvPortMalloc(), semaphore, Queue Khi Task tạo chiếm lấy vùng vùng heap, vùng nhớ mà Task chiếm Task tạo vùng nhớ Stack 19 Chương V xử lý cố Câu 1: Trình bày số lỗi thông dụng FreeRTOS Lỗi thêm tác vụ Triệu chứng: Thêm tác vụ đơn giản vào demo khiến cho demo bị lỗi Việc tạo tác vụ đòi hỏi nhớ phải lấy từ heap Nhiều dự án ứng dụng demo kích thước vùng heap đủ lớn cách xác để tạo tác vụ demo - sau tác vụ tạo khơng có đủ dung lượng heap lại cho tác vụ, hàng đợi semaphore thêm vào Tác vụ nhàn rỗi tự động tạo vTaskStartScheduler() gọi vTaskStartScheduler() trả lại khơng có đủ nhớ heap lại cho tác vụ nhàn rỗi vừa tạo Bao gồm vòng lặp rỗng [for (;;); ] sau gọi đến vTaskStartScheduler() làm cho lỗi dễ dàng gỡ lỗi Để thêm nhiều tác vụ hơn, tăng kích thước heap xóa số tác vụ demo có Lỗi sử dụng hàm API ứng dụng bị ngắt Triệu chứng: Sử dụng chức API ngắt khiến ứng dụng bị lỗi Không sử dụng hàm API chương trình phục vụ ngắt trừ tên hàm API kết thúc " FromISR ()" Lỗi lập lịch Triệu chứng 1: Đôi ứng dụng gặp cố chương trình phục vụ ngắt Điều cần kiểm tra ngắt không gây tràn ngăn xếp overflow Cách thức ngắt định nghĩa sử dụng khác cổng trình biên dịch - điều thứ hai cần kiểm tra cú pháp, macro quy ước gọi sử dụng chương trình phục vụ ngắt thường mơ tả xác trang tài liệu cho demo xác thể chương trình phục vụ ngắt khác demo Nếu ứng dụng chạy Cortex M3 đảm bảo mức độ ưu tiên gán cho ngắt tính đến số ưu tiên mức thấp sử dụng để biểu diễn ngắt mức ưu tiên logic cao Điều phản trực giác Đó lỗi phổ 20 biến để vơ tình gán ngắt có sử dụng hàm FreeRTOS API mức ưu tiên cao mức xác định configMAX_SYSCALL_INTERRUPT_PRIORITY Triệu chứng 2: Các lỗi trình lập lịch cố gắng để khởi động tác vụ Nếu vi điều khiển ARM7 sử dụng đảm bảo xử lý chế độ Giám sát (Supervisor) trước vTaskStartScheduler() gọi Cách dễ để đạt điều đặt xử lý vào chế độ Supervisor bên mã khởi động C trước hàm main() gọi Đây cách ứng dụng demo ARM7 cấu hình Bộ lập lịch khơng khởi động trừ xử lý chế độ Supervisor Triệu chứng 3: Các phần quan trọng (critical section) khơng lồng cách xác Khơng thay đổi bit cho phép vi điều khiển ngắt cờ ưu tiên sử dụng phương thức khác lệnh gọi đến taskENTER_CRITICAL() taskEXIT_CRITICAL() Các macro giữ số lượng chiều sâu lồng lời gọi để đảm bảo ngắt bật lại gọi lồng hồn tồn khơng bị xóa Ứng dụng lỗi trước lập lịch Triệu chứng: Ứng dụng bị treo trước trình lập lịch bắt đầu Một chương trình phục vụ ngắt có khả gây chuyển đổi trạng thái không phép thực trước lập lịch bắt đầu Điều với chương trình phục vụ ngắt cố gửi nhận từ hàng đợi semaphore Một chuyển đổi trạng thái xảy sau lập lịch bắt đầu Nhiều hàm API gọi trước lập lịch bắt đầu Tốt hạn chế sử dụng API để tạo tác vụ, hàng đợi semaphore sau vTaskStartScheduler() gọi Gọi hàm API lập lịch bị treo Triệu chứng: Gọi hàm API trình lập lịch bị tạm ngừng khiến ứng dụng bị lỗi Trình lập lịch bị tạm ngừng (suspend) cách gọi vTaskSuspendAll() tiếp tục (không trả lời) cách gọi xTaskResumeAll() 21 Không gọi hàm API trình lên lịch bị tạm ngừng Triệu chứng: Nguyên mẫu pxPortInitialiseStack() khiến cho việc biên dịch bị lỗi Mỗi cổng yêu cầu macro định nghĩa để đảm bảo tệp tiêu đề kernel xác bao gồm dựng (build) Một lỗi biên dịch nguyên mẫu pxPortInitialiseStack() gần chắn triệu chứng macro đặt không cho cổng sử dụng Các ứng dụng dự án demo cung cấp liên quan đến cổng sử dụng Bằng cách tập tin xác bao gồm tùy chọn trình biên dịch xác thiết lập 22 Chương VI Cách sử dụng one-shot timer auto- reaload timer Câu 1: Khởi tạo one-shot and auto-reload timers hàm xCreateTimer(); One-shot timers: Sau bắt đầu, chúng thực chức gọi lại lần Một one-shot timers khởi động lại cách tác động trực tiếp tự động tải lại Auto-reload timers: Sau bắt đầu, auto-reload timers tự khởi động lại hết hạn Điều dẫn đến việc thực định kỳ chức gọi lại #include #include #define mainONE_SHOT_TIMER_PERIOD pdMS_TO_TICKS( 3333 ) #define mainAUTO_RELOAD_TIMER_PERIOD pdMS_TO_TICKS(500) TimerHandle_t xAutoReloadTimer, xOneShotTimer; void prvAutoReloadTimerCallback( TimerHandle_t xTimer ) { Serial.println( "Auto-reload timer callback executing"); } void prvOneShotTimerCallback( TimerHandle_t xTimer ) { Serial.println( "One-shot timer callback executing"); } void setup() { Serial.begin(9600); // Create timer xAutoReloadTimer = xTimerCreate("AutoReload", mainAUTO_RELOAD_TIMER_PERIOD, pdTRUE, 0, prvAutoReloadTimerCallback); xOneShotTimer = xTimerCreate("OneShot", mainONE_SHOT_TIMER_PERIOD, pdFALSE, 0, prvOneShotTimerCallback); 23 BaseType_t xTimer1Started,xTimer2Started; if (xAutoReloadTimer == NULL && xOneShotTimer == NULL) { Serial.println("Timer can not be created"); } else { // Start timer xTimer1Started = xTimerStart( xAutoReloadTimer, 0); xTimer2Started = xTimerStart(xOneShotTimer, 0); if ( xTimer1Started == pdPASS && xTimer2Started == pdPASS ) { // Start the scheduler vTaskStartScheduler(); } } } void loop() { // put your main code here, to run repeatedly: } 24 ... vụ - Khi hệ thống phức tạp xây dựng, RTOS quản lý việc tích hợp thành phần Câu 4: So sánh hệ điều hành thời gian thực với hệ điều hành PC Hệ điều hành thời gian thực (RTOS) cho hệ thống nhúng khác... quan hệ điều hành thời gian thực Câu 1: Thế thời gian thực? mô tả ngắn gọn dạng thời gian thực? Khái niệm: Thời gian thực thể chỗ: hệ thống phải có phản ứng thích hợp, thời điểm với mơi trường Thời. .. Thứ tư, hầu hết hệ điều hành máy desktop quan tâm đến hiệu trung bình hệ điều hành thời gian thực quan tâm đến giới hạn, thời gian đáp ứng Câu 4: Phân loại hệ điều hành thời gian thực Mô tả ngắn