BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG BÁO CÁO BTL MÔN ĐỒ ÁN HỆ THỐNG NHÚNG Giảng viên giảng dạy Nguyễn Ngọc Minh LỜI MỞ ĐẦU Lời đầu tiên nhóm em xin cảm ơn thầy Minh đã.
Trang 1BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
-BÁO CÁO BTL MÔN: ĐỒ ÁN HỆ THỐNG NHÚNG
Giảng viên giảng dạy:Nguyễn Ngọc Minh
Trang 2LỜI MỞ ĐẦU
Lời đầu tiên nhóm em xin cảm ơn thầy Minh đã giảng dạy và giúp đỡ cả lớp trong suốt quá trình kì học vừa qua, để chúng em có thể tiếp cận gần hơn với chuyên ngành, đặc biệt là về mảng điện tử Qua những bài giảng, bài tập và bài tập lớn, chúng em đã được tiếp cận gần gửi hơn về chuyên ngành trong thực tế hiện tại.
Trong quá trình làm đồ án chắc chắn em còn mắc phải nhiều sai sót rất mong các thầy cô bỏ qua Đồng thời, với kinh nghiệm và kiến thức còn hạn chế em xin sự đóng góp từ thầy cô để đồ án của em được hoàn thiện hơn.
Chúng em xin chân thành cảm ơn ạ !!!
Trang 3MỤC LỤC
A ĐỀ TÀI VÀ TRIỂN KHAI ĐỀ TÀI 4
I Các task vụ 4
II Sơ đồ thực hiện 5
B Tìm Hiểu về Hệ điều hành Thời gian thực FREERTOS 5
I Mở đầu 5
II Rtos là gì? 5
III Hệ điều hành thời gian thực FREERTOS với hệ điều hành thông thường khác nhau ở đâu ? 5
VI Một số khái niệm về Hệ điều hành thời gian thực FreeRTOS 6
V.Cách tạo ra 1 task trong keilCV5 7
VI Tiện Ích của FREERTOS 9
VII Thực hiện tác vụ 9
VIII.Tin nhắn hàng đợi 9
IX Semaphore và Mutex 10
X TIMER 10
XI Nhóm EVENT 10
C Giới thiệu về các module dùng Trong đề tài 11
I DHT11 11
II Đồng Hồ RTC trong STM32 12
1 RTC là gì ? 12
2 Ưu nhược điểm của RTC on chip so với các IC RTC khác như DS3231, DS1307 12
3 Các thông số chính của STM32 RTC 12
4 Các chức năng cơ bản của bộ RTC: 13
5 Cấu tạo trong lòng RTC và các nguồn 13
6 Một Số thanh ghi quan trọng 14
D ĐÚC KẾT ĐỀ TÀI VÀ DEMO SẢN PHẨM 15
Trang 4A ĐỀ TÀI VÀ TRIỂN KHAI ĐỀ TÀI
I Các task vụ
Gồm 2 task Vụ :
- Task 1: Hiện thị đồng hồ thời gian ( Giờ phút giây ) Lên LCD 20x4 :
- Task 2: Hiện Thị nhiệt độ Độ ẩm lên LCD 20x4
( 2 task Sử dụng chung 1 LCD20x4)
Lập trình trên KID STM32F103 Trên Hệ Điều Hành thời gian thực FREERTOS
II Sơ đồ thực hiện
B Tìm Hiểu về Hệ điều hành Thời gian thực FREERTOS
I Mở đầu
Có rất nhiều hệ điều hành thời gian thực được phát triển như RxTiny 8051, uRTOS, TI RTOS, Sau một thời gian dài tìm hiểu và làm project nhóm mình nhận thấy sử dụng và làm quen FreeRTOS rất dễ, support có sẵn example tài liệu khá đầy đủ Vì vậy, hôm nay mình giới thiệu hệ điều hành FreeRTOS và chia sẻ kinh nghiệm để FreeRTOS hoạt động ổn định
LCD_20x4
RTC : Đồng hồ
Hẹn giờ
DHT11
STM32F103 (FREERTOS)
Trang 5FreeRTOS được tạo ra khá lâu rồi và hỗ trợ port sang STM32, AVR, PIC, TI… (TI cũng có hệ điều hành riêng xây dựng dựa trên các hàm nhân Linux nhưng về cơ bản các hàm hoạt động giống nhau) Gần đây FreeRTOS được Amazon mua lại Licence và phát triển thêm tính năng và giữ nguyên Kernel
do FreeRTOS dần phổ biến và ổn định hơn
II Rtos là gì?
RTOS là viết tắt của cụm từ Real-time operating system hay hệ điều hành
thời gian thực thường được nhúng trong các dòng vi điều khiển dùng để điều khiển thiết bị một cách nhanh chóng và đa nhiệm (multi tasking) Để hiểu rõ ràng nó là gì trước hết hãy làm rõ khái niệm về hệ điều hành đã
Hệ điều hành (tiếng Anh: Operating System – viết tắt: OS) là một phần
mềm dùng để điều hành, quản lý toàn bộ tất cả thành phần (bao gồm cả phần cứng và phần mềm) của thiết bị điện tử
Nói đơn giản, hệ điều hành giống như hội đồng quản trị vậy Họ có quyền quyết định ai làm gì và thời gian như thế nào Các nhân viên cũng như các ứng dụng, nhận lệnh của cấp trên và thực thi các công việc theo đúng chức năng của mình.
III Hệ điều hành thời gian thực FREERTOS với hệ điều hành thông thường khác nhau ở đâu ?
Hệ điều hành thông thường (non-realtime): như Window, linux, android, ios… chính là thứ mà chúng ta sử dụng hằng ngày Khi mở một phần mềm trên đó, có thể bạn phải chờ nó tải rất lâu, việc chờ đợi này cũng không ảnh hưởng gì cả Bởi vì đa số phần mềm đó tương tác với con người chứ ít tương tác với các phần mềm hoặc thiết bị khác
Hệ điều hành thời gian thực (realtime): sinh ra cho các tác vụ cần sự phản hồi nhanh của hệ thống, thường được nhúng trong các loại vi điều khiển và không có giao diện (GUI) tương tác với người dùng Chúng cần phản hồi nhanh bởi vì đa số các tác vụ tương tác với thiết bị, máy móc khác chứ không phải con người Các tài nguyên bên trong rất hữu hạn nên chỉ một sự chậm trễ cũng có thể làm hệ thống làm việc hoàn toàn sai lệch
Bạn cứ thử tưởng tượng một hệ điều hành đang chạy các tác vụ điều khiển tên lửa mà độ trễ chỉ 2s Với tốc độ của tên lửa cũng có thể bắn lệch từ Hà Nội thành TP Hồ Chí Minh rồi
Trang 6Thực tế hệ điều hành thời gian thực còn chia thành 2 loại:
Soft-realtime: Sử dụng cho các ứng dụng cruise control (điều khiển hành trình) trong ô tô và các ứng dụng viễn thông
Hard-realtime: Sử dụng trong các ứng dụng điều khiển máy bay, động cơ điện
VI Một số khái niệm về Hệ điều hành thời gian thực FreeRTOS
Trước khi bắt đầu làm việc với FreeRTOS ngoài việc nắm rõ các hàm sử dụng nó, chúng ta cũng nên nắm rõ một số cài đặt cơ bản nhưng cực kì quan trọng
HeapSize: là size của data trên RAM cần để lưu trữ khi bạn khai báo biến
hay mảng trong chương trình chính hoặc chương trình con
StackSize: là size của data lưu trữ giá trị back up hiện tại của thanh ghi bao
gồm cả con trở stack pointer(PC) khi chương chình gọi một chương trình con khác và sẽ trả lại bộ nhớ đó khi thực hiện xong chương trình con
Nếu StackSize không đủ nó sẽ ghi data cả vào phần của HeapSize gây ra
stackoverflow và xảy ra lỗi Hardfult tạo ra ngắt nhảy vào Hardfult Handler Lúc này chương trình sẽ bị treo cho đến khi khởi động lại
Cài đặt trong project
Vì project nhóm khá lớn (dùng mảng lớn lưu dữ liệu) vì vậy mình đặt Heap_Size = 0x4000 = 16Kb nên bạn cài đặt dùng hết số RAM này trong FreeRTOS Và được trình dịch compile tính toán sử dụng trong khi biên dịch và được hệ điều hành sử dụng trong runtime Bạn Heap_Size và Stack_Size trong file FreeRTOSConfig.h
Đối với Stask_Size: là stack size được dùng trong mỗi Task thường mình để
mặc định 128byte hoặc lớn hơn tùy vào số chương trình con gọi liên tiếp trong mỗi task. Theo kinh nghiệm của mình mỗi Task sẽ tốn khoảng 800byte Heap +128 byte stack RAM sử dụng
FreeRTOS chia thành các Task xử lý riêng biệt sử dụng ngắt SystemStick Timer làm xung clock Như vậy cứ mỗi khi xảy ra ngắt SystemStick hệ điều hành sẽ tính toán chuyển task dựa trên mức cài đặt ưu tiên hoặc công việc thực hiện tiếp theo như vậy sẽ không dùng SystemStick để làm delay như bình thường được
Trang 7Cài đặt xung clock cho hệ điều hành
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
#define configTICK_RATE_HZ ( ( TickType_t ) 100000 ) //100Khz
ConfigCPU_CLOCK_HZ : cài đặt xung clock của CPU chip cấp cho hệ điều hành, mình dùng STM32F103-> xung max 72Mhz
configTICK_RATE_HZ: Tần số chuyển task hay tần số ngắt SystemStick, ở đây mình đặt 100Khz
-> CPU còn 72000000/100000 = 720 xung để xử lý công việc Theo mình mức này là mức cao nhất hệ điều hành có thể chạy được Nếu không có yêu cầu đặc biệt bạn nên để giá trị configTICK_RATE_HZ = 1000
Lưu ý: Đối với STM32, khi sử dụng ngắt bạn phải config NVIC group 4 như vậy SubPriority = 0 và PreemPriority = 4bit vì bản chất của PreemPriority là
xử lý chương trình ngắt chồng ngắt tức trong khi công việc trong ngắt hiện tại chưa xong(ví dụ chờ delay) chip có thể thực hiện công việc trong ngắt khác mức ưu tiên cao hơn, cho phép hệ điều hành chuyển task xử lý công việc quan trọng hơn
#define configUSE_PREEMPTION 1
Các phần cài đặt sau sử dụng trong hệ điều hành Mục đích chủ yếu giảm bộ nhớ build code, nếu code sử dụng hàm có liên quan bạn đặt giá trị 1 nếu không sử dụng bạn để giá trị 0
#define INCLUDE_vTaskPrioritySet 1 //Sử dụng Task Priority
#define INCLUDE_uxTaskPriorityGet 1 //Sử dụng hàm get Task Priority
#define INCLUDE_vTaskDelete 1 //Sử dụng hàm Delete task ví dụ: vTaskDelete(xStartTaskHandle);
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1 //Sử dụng hàm vTaskSuspend
#define INCLUDE_vTaskDelayUntil 0
Trang 8#define INCLUDE_vTaskDelay 1 //Sử dụng hàm vTaskDelay
V.Cách tạo ra 1 task trong keilCV5
Trong ví dụ này nhóm mình tạo 4 task led nháy với tần số khác nhau (tần số xung nhịp của hệ điều hành 1Khz cài đặt tại file FreeRTOSConfig.h)
Ban đầu mình sử dụng 4 task mỗi task điều khiển một led như sau
Tiếp theo trong hàm main,bạn tạo task bằng hàm xTaskCreate và chạy task
đã tạo sử dụng vTaskStartScheduler();
xTaskCreate(vTaskLed1,( const char * ) “Task LED 1”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT
xTaskCreate(vTaskLed2,( const char * ) “Task LED 2”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT
xTaskCreate(vTaskLed3,( const char * ) “Task LED 3”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT
xTaskCreate(vTaskLed4,( const char * ) “Task LED 4”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT Y,( xTaskHandle * ) NULL);
Trang 9Hàm xTaskCreate sẽ gồm các para input:
vTaskLed1: Chương trình mình muốn tạo task mới
( const char * ) “Task LED 1”: Tên task bạn đặt số kí tự max được định
configMAX_TASK_NAME_LEN ( 16 )
configMINIMAL_STACK_SIZE: giá trị stack size bạn sử dụng với task đó
ở đây stack size bằng 128byte Với mỗi byte stack size FreeRTOS sẽ lấy 4byte của RAM để back up giá trị của một trong các thanh ghi R0-R15 32bit
sẽ tốn 128*4 = 512byte RAM Khi sử dụng nhiều Task khác nhau nếu gọi chương trình còn nhiều bạn sẽ cần nhiều stack_size hơn Vì vậy cần tính toán sơ bộ và cài đặt lại stack size trong file startup
mainFLASH_TASK_PRIORITY: Mức ưu tiên của hệ điều hành max là 255 được định nghĩa trong file FreeRTOSConfig.h #define configKERNEL_INTERRUPT_PRIORITY 255)
( xTaskHandle * ) NULL: Có tác dụng trong việc tạm dừng, xóa task Trong các bài tiếp theo mình sẽ dùng đến biến đầu vào này
Lưu ý: Nếu bạn lấy file startup từ code ví dụ của FreeRTOS build sẽ chạy Nhưng nếu bạn lấy file startup trực tiếp từ thư viện CMSIS StdPeriph_Driver , ta cần phải chỉnh sửa lại một chút
Vấn đề ở chỗ trong file port.c của FreeRTOS dùng 3 ngắt phục vụ cho việc tính toán chuyển task sẽ khác tên 3 ngắt định nghĩa trong bảng vector ngắt file startup
VI Tiện Ích của FREERTOS
Điều gì làm cho một RTOS đáng mong đợi? Nó cung cấp cái gì? Hãy xem xét một số danh mục dịch vụ chính được tìm thấy trong FreeRTOS:
Đa nhiệm và lập lịch trình
Hàng đợi tin nhắn (Message queues)
Semaphoresvà mutex
Timer
Trang 10 Nhóm sự kiện (Event groups)
VII Thực hiện tác vụ
Với FreeRTOS (một RTOS), các hàm logic được đặt vào các tác vụ riêng biệt chạy độc lập Một tác vụ có thể chịu trách nhiệm đọc và tính toán nhiệt
độ hiện tại Một tác vụ khác có thể chịu trách nhiệm thể hiện nhiệt độ được tính toán cuối cùng đó Trong thực tế, nó sẽ trở thành một hai chương trình chạy song song cùng một lúc
Đối với các ứng dụng đơn giản, phí tổn của việc lên lịch tác vụ có thể là quá cao Tuy nhiên, khi độ phức tạp tăng lên, lợi ích của việc phân chia vấn đề thành các tác vụ trở nên rõ rệt hơn nhiều
FreeRTOS rất linh hoạt Nó cung cấp hai loại lập lịch trình tác vụ:
Ưu tiên đa tác vụ
Hợp nhất đa tác vụ (coroutines)
Với tính năng đa tác vụ ưu tiên, một tác vụ sẽ chạy cho đến khi nó hết thời gian, hoặc bị chặn, hoặc cần kiểm soát rõ ràng Bộ lập lịch trình tác vụ sẽ sắp xếp tác vụ chạy tiếp sau, có tính đến các ưu tiên Đây là loại tác vụ đa nhiệm sẽ được sử dụng trong các dự án của cuốn sách này
Một dạng đa nhiệm khác là coroutines Sự khác biệt là tác vụ hiện tại chạy cho đến khi nó từ bỏ quyền kiểm soát Không có phân chia thời gian hoặc thời gian chờ Nếu không có hàm gọi nào chặn (như một mutex), thì một coroutine phải gọi một hàm yield để chuyển quyền kiểm soát với một tác vụ khác Bộ lập lịch trình tác vụ sau đó sẽ quyết định tác vụ nào sẽ chuyển quyền kiểm soát sang bước tiếp theo Hình thức lập chương trình này là cần phải có cho các ứng dụng yêu cầu an toàn cao sẽ kiểm soát chặt chẽ thời gian CPU
VIII.Tin nhắn hàng đợi
Ngay sau khi bạn áp dụng đa tác vụ, bạn thừa hưởng một vấn đề về giao tiếp Sử dụng ví dụ đọc nhiệt độ, tác vụ đọc nhiệt độ an toàn truyền giá trị đến tác vụ phát nhiệt độ như thế nào? Nếu nhiệt độ được lưu trữ là bốn byte, làm thế nào để bạn truyền giá trị đó mà không bị gián đoạn? Tính đa nhiệm
ưu tiên có nghĩa là việc sao chép bốn byte dữ liệu đến một vị trí khác có thể
bị gián đoạn một phần
Trang 11Một cách khá thô để giải quyết vấn đề này là ngăn chặn gián đoạn trong khi sao chép nhiệt độ của bạn đến một vị trí được sử dụng bởi tác vụ phát sóng Nhưng cách tiếp cận này có thể không thể chấp nhận được nếu bạn thường xuyên bị gián đoạn Vấn đề trở nên tồi tệ hơn khi các đối tượng được sao chép có kích thước tăng
Hàng đợi tin nhắn trong FreeRTOS cung cấp một cách an toàn để truyền thông tin hoàn chỉnh Hàng đợi tin nhắn đảm bảo rằng chỉ nhận được tin nhắn đầy đủ Ngoài ra, nó giới hạn độ dài của hàng đợi sao cho tác vụ gửi không thể sử dụng hết bộ nhớ Bằng cách sử dụng độ dài hàng đợi được xác định trước, tác vụ thêm thông báo sẽ bị chặn cho đến khi không gian có sẵn Khi một tác vụ bị chặn, công cụ lập lịch trình tác vụ sẽ tự động chuyển sang một tác vụ khác đã sẵn sàng thực thi, thao tác này có thể xóa các tin nhắn khỏi cùng một hàng đợi đó Độ dài cố định cho hàng đợi tin nhắn một dạng điều khiển dòng
IX Semaphore và Mutex
Trong khi thực hiện một hàng đợi, có một thao tác mutex tại đó Quá trình thêm tin nhắn có thể yêu cầu một số hướng dẫn để hoàn thành Tuy nhiên, trong một hệ thống đa tác vụ ưu tiên, có thể một tin nhắn được thêm một nửa trước khi bị gián đoạn để thực hiện một tác vụ khác
Trong FreeRTOS, hàng đợi được thiết kế để có các tin nhắn được thêm vào theo cách nguyên tử Để thực hiện điều này, một số loại thiết bị mutex được
sử dụng đằng sau chương trình Mutex là một thiết bị tất cả hoặc không có
gì Bạn có khóa hay không
Tương tự như mutex, có semaphore Trong một số tình huống mà bạn muốn giới hạn một số yêu cầu nhất định, ví dụ, một semaphore có thể quản lý nó theo cách nguyên tử Ví dụ, nó có thể cho phép một giá trị tối đa là ba Sau
đó, tối đa ba yêu cầu “nhận” sẽ thành công Các yêu cầu “nhận” bổ sung sẽ chặn cho đến khi một hoặc nhiều yêu cầu “cung cấp” đã được thực hiện để trả lại khoảng trống
X TIMER
Timer quan trọng đối với nhiều ứng dụng, bao gồm cả chương trình nhấp nháy Khi bạn có nhiều tác vụ tốn thời gian CPU, một delay không chỉ không đáng tin cậy, mà nó còn lấy đi các tác vụ khác của thời gian CPU, cái
có thể được sử dụng hiệu quả hơn
Trang 12Trong hệ thống RTOS, thường có một ngắt “systick” giúp quản lý thời gian Cái ngắt systick này không chỉ theo dõi số lượng hiện tại của “ticks” được phát hành cho đến nay, mà còn được sử dụng bởi các bộ lập lịch trình tác vụ
để hoán đổi các tác vụ
Trong FreeRTOS, bạn có thể chọn delay việc thực hiện bằng một số tick được chỉ định Điều này hoạt động bằng cách đánh dấu “thời gian đánh dấu” hiện tại và phát triển cho một tác vụ khác cho đến khi thời gian đánh dấu bắt buộc đã đến Bằng cách này, độ chính xác của delay chỉ giới hạn trong khoảng thời gian được chọn được định cấu hình Nó cũng cho phép các tác
vụ khác thực hiện công việc thực sự cho đến khi đúng thời điểm đến
FreeRTOS cũng có tiện ích timer “ảo” (software timer) có thể được tạo ra Chỉ khi bộ đếm thời gian hết hạn là hàm callback được thực hiện Cách tiếp cận này là bộ nhớ tiết kiệm bởi vì tất cả các bộ định thời gian sẽ sử dụng cùng một ngăn xếp
XI Nhóm EVENT
Một vấn đề thường xảy ra là một tác vụ có thể cần phải theo dõi nhiều hàng đợi cùng một lúc Ví dụ, một tác vụ có thể cần phải chặn cho đến khi một tin nhắn đến từ một trong hai hàng đợi khác nhau FreeRTOS cung cấp cho việc tạo ra “bộ hàng đợi.” Điều này cho phép một tác vụ chặn cho đến khi một tin nhắn từ bất kỳ hàng đợi trong tập hợp có một tin nhắn
Điều gì về các event do người dùng xác định? Các nhóm event có thể được tạo để cho phép các bit nhị phân đại diện cho một event Khi được thiết lập, API FreeRTOS cho phép một tác vụ đợi cho đến khi một sự kiện kết hợp cụ thể xảy ra Các sự kiện có thể được kích hoạt từ code tác vụ thông thường hoặc từ bên trong một ISR (interrupt service routine: dịch vụ ngắt)
C Giới thiệu về các module dùng Trong đề tài
I DHT11