Tải bản đầy đủ (.pdf) (25 trang)

BÁO cáo LAB môn lập trình hệ thống nhúng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (962.42 KB, 25 trang )

BÁO CÁO LAB
Môn: Lập trình hệ thống nhúng

Sinh viên thực hiện:
1. Trương Thị Thu Diệu – 09DT1
2. Nguyễn Thị Thái Ngọc – 09DT1

THÁNG 1, 2014
DA NANG UNIVERSITY OF TECHNOLOGY


Chương 1: PHÂN

TÍCH ĐỀ TÀI LAB

1.1 Mô tả tổng quát:
Đề tài của bài lab là xây dựng hệ thống thu thập dữ liệu từ các cảm biến bên ngoài
môi trường, xử lý và thực hiện hiển thị hay cảnh báo khi dữ liệu thu được vượt ra khỏi
vùng quy định. Đồng thời gửi dữ liệu qua máy tính và thiết lập mạng kết nối để điều
khiển, hiển thị khi cần thiết. Cả hệ thống sẽ được xây dựng trên hệ điều hành thời gian
thực FreeRTOS đơn giản.
Hệ thống này sẽ được đặt tại bất kì đâu ngoài môi trường để kiểm tra những yếu tố
cần thiết như nồng độ muối, ngồn độ CO2, tốc độ dòng chảy và nhiệt độ.
1.2 Thiết bị và phần mềm cần dùng:
- KIT EKI LM3S8962
- Phần mềm IAR IDE cho ARM
- Phần mềm hercules
1.3 Các vấn đề cần giải quyết:
- Mô tả cái nhìn tổng quan về hệ thống bằng phần mềm UML.
- Thực hiện giao tiếp với phần cứng các module trong EKI LM3S8962: nhiệt độ,
keypad, OLED hiển thị menu và ADC,…


- Xây dựng hệ thống trên hệ điều hành FreeRTOS với các tác vụ quản lý task ứng
với từng chức năng cụ thể như hiển thị, tính toán, cảnh báo,… các thông số.
- Xây dựng giải thuật HTTP cho webserver.
- Lập trình một trang web có khả năng truy vấn dữ liệu liên tục, đồng thời cũng cập
nhật các thông tin từ dữ liệu đó lên.
- Viết phần mềm giao diện người dùng bằng LabView 2010….
1.4 Hướng giải quyết vấn đề:
- Về giải thuật HTTP cho web server: đề tài áp dụng một TCP/IP stack (một bộ giao
thức TCP/IP viết trên nền C) là lwIP. Stack này hỗ trợ rất mạnh các giao thức
TCP, UDP và các giao thức trên nền của TCP và UDP trong đó có HTTP.
- Các phần cứng tham khảo các sơ đồ mạch từ thiết kế đề nghị của nhà sản xuất vi
điều khiển Texas Instrument cũng như các code sources.
- Tìm hiểu cụ thể về các thao tác với hệ điều hành FreeRTOS để xây dựng các task
ứng với từng chức năng cụ thể.
- Giao diện phần mềm viết trên PC với LabView 2010, các tài liệu tham khảo được
lấy từ trang web chính hãng,...
1.5 Phạm vi đề tài:
Thực hiện hệ thống với các thiết bị:
-

Module cảm biến nhiệt độ được tích hợp sẵn trên KIT EKI LM3S8962.


-

Module ADC để xử lý số liệu analog lấy được từ các cảm biến.
Module giao tiếp người dùng có màn hình OLED trên KIT EKI LM3S8962 để
hiển thị.
Module Keypad cho sự lựa chọn.
Thiết bị nhúng web server. Tất cả các phần trên nếu sử dụng vi xử lý đều dùng

ARM Cortex M3 LM3S8962 của hãng Texas Instrument.
Thực hiện lập trình một trang web đơn giản.
Thực hiện phần mềm lập trình trên LabView 2010 của hãng National Instrument
giao tiếp với thiết bị giao tiếp người dùng trong một mode của menu.


Chương 2: Cơ

sở lý thuyết

Chương này sẽ giới thiệu các lý thuyết liên quan, trình bày các phương pháp
nghiên cứu và thực hành cụ thể. Đồng thời phân tích, đánh giá, làm rõ và lý giải cho sự
các lựa chọn đó.
2.1 Vi xử lý ARM Cortex M3 LM3S8962 – Texas Instruments:
2.1.1 Giới thiệu về dòng vi xử lý ARM Cortex:
Dòng ARM Cortex là một bộ xử lí thế hệ mới đưa ra một kiến trúc chuẩn cho nhu
cầu đa dạng về công nghệ. Không giống nhu các chip ARM khác, dòng Cortex là một lõi
xử lí hoàn thiện, đưa ra một chuẩn CPU và kiến trúc hệ thống chung.
Cortex-M3 đưa ra một lõi vi điều khiển chuẩn nhằm cung cấp phần tổng quát,
quan trọng nhất của một vi điều khiển bao gồm:
-

Hệ thống ngắt (interrupt system)
SysTick timer (đuợc thiết kế cho hệ điều hành thời gian thực)
Hệ thống kiểm lỗi (debug system)
Memory map.
Không gian địa chỉ 4Gbyte của Cortex-M3 đuợc chia thành các vùng cho:
Mã chương trình
SRAM
Ngoại vi và ngoại vi hệ thống.


Cortex-M3 đuợc thiết kế dựa theo kiến trúc Harvard (bộ nhớ chuong trình và bộ
nhớ dữ liệu tách biệt với nhau), và có nhiều bus cho phép thực hiện các thao tác song
song với nhau, do đó làm tăng hiệu suất của chip.
Dòng Cortex duợc thiết kế hỗ trợ tập lệnh ARM Thumb-2, tập lệnh này duợc pha
trộn giữa tập lệnh 16 và 32bit. Tập lệnh Thumb-2 duợc thiết kế dặc biệt dành cho trình
biên dịch C/C++, các ứng dụng dựa trên nền Cortex hoàn toàn có thể duợc viết bằng
ngôn ngữ C mà không cần dến chương trình khởi dộng viết bằng assembler.


Kiến trúc vi xử lý dùng lõi ARM Cortex M3
 Một số ưu điểm của ARM Cortex:
 Hiệu suất cao: hỗ trợ kiến trúc tập lệnh Thumb-2, nên hiệu quả hơn 35% so với
bộ xử lý ARM7TDMI-S thực thi với tập lệnh ARM.
 Dễ sử dụng, phát triển ứng dụng nhanh chóng, hiệu quả: Bộ vi xử lý có mô hình
lập trình dựa trên ngăn xếp đã được đơn giản hoá để tương thích với kiến trúc
ARM. Ngoài ra tập lệnh ARM được thiết kế đặc biệt dành cho trình biên dịch
C/C++ nên ứng dụng được viết không cần thông qua bất cứ chương trình
assembler nào (chương trình startup).
 Hoạt động và sử dụng năng lượng hiệu quả hơn:

So sánh giữa dòng ARM7 cũ và lõi Cortex M3 mới
 Đơn vị bảo vệ bộ nhớ (MPU): MPU là một thành phần tùy chọn của bộ vi xử lý
Cortex-M3, có thể nâng cao độ tin cậy của hệ thống nhúng bằng cách bảo vệ các
dữ liệu quan trọng được hệ điều hành sử dụng khỏi các ứng dụng khác, tách biệt


độc lập các tác vụ đang thực thi bằng cách không cho phép truy cập vào dữ liệu
của nhau, vô hiệu hoá quyền truy cập vào một số vùng nhớ, cho phép các vùng
nhớ được định nghĩa là chỉ đọc (read only) và phát hiện các truy cập bộ nhớ có

thể phá vỡ hệ thống.
 Hỗ trợ lập trình Gỡ lỗi (Debug) và theo vết (Trace): Debug hệ thống dựa trên bộ
vi xử lý Cortex-M3 được thực hiện thông qua DAP (Debug Access Port), SWD
(Serial Wire Debug) sử dụng 2 đường tín hiệu hoặc SWJ-D (Serial Wire JTAG
Debug) sử dụng giao thức JTAG.
2.1.2 Vi xử lý Stellaris ARM Cortext M3 LM3S8962 – Texas Instrument
Các dòng vi điều khiển Stellaris – ARM ® ™ Cortex-M3 đầu tiên - mang lại
những ứng dụng vi điều khiển nhúng hiệu suất cao 32-bit nhưng với chi phí tương đương
với các vi điều khiển kế thừa 8 bit và 16bit.
Một số tính năng của dòng vi xử lý LM3S:
-

32-bit RISC

-

SystemTick Timer 24bit.

-

Tốc độ tối đa 50 MHz.

-

Tích hợp Bộ điều khiển vector ngắt lồng nhau (NVIC): 36 ngắt với tám cấp độ
ưu tiên.

-

Hỗ trợ mode Hibernation: điều khiển công suất sử dụng bộ điều chỉnh bên ngoài

riêng biệt, đồng hồ thời gian thực (RTC) 32bit.

-

Đầy đủ tính năng giải pháp gỡ rối.

-



Hỗ trợ tất cả các tính năng cơ bản của vi xử lý, cũng như các module truyền thông cơ
bản: SSI, I2C, UART. Dòng LM3S8xxx còn được TI trang bị module giao tiếp CAN và
Ethernet.
 Controller Area Network (CAN)
 CAN giao thức phiên bản 2.0 A/B
 Tốc độ bit lên đến 1 Mbps
 32 bản tin với nhận dạng mask cá nhân


 Ngắt mask
 Vô hiệu hoá chế độ tự động gửi lại cho ứng dụng Time-Triggered CAN (TTCAN)
 Lập trình kiểm tra ngược cho chế độ tự kiểm tra
 Cho phép lập trình FIFO lưu trữ của nhiều đối tượng nhắn tin
 Kèm theo một giao diện CAN bên ngoài thông qua các tín hiệu CAN Tx và CAN
Rx
 10/100 Mbps Ethernet Controller
 Phù hợp với các đặc điểm kỹ thuật IEEE 802,3-2002
 Nhiều chế độ hoạt động
Song công và bán song công 100 Mbps
Song công và bán song công 10 Mbps

Chế độ tiết kiệm điện và giảm công suất xuống
 Cấu hình cao
Lập trình địa chỉ MAC
Lựa chọn hoạt động LED
Hỗ trợ chế độ pha tạp
Điều khiển loại bỏ lỗi CRC
Người dùng cấu hình ngắt
 IEEE 1588 Giao thức Thời gian chính xác - cung cấp thời gian chính xác cao cho
các gói cá nhân


Sơ đồ khối vi xử lý LM3S8962

Sơ đồ khối vi xử lý LM3S8962


2.2 Module cảm biến nhiệt độ và ADC tích hợp trên KIT EKI LM3S8962:
Module ADC trong Stellaris có các đặc điểm sau:
-

4 kênh ngõ vào
Có cả cấu hình cho ngõ vào analog khác nhau và ngõ vào analog đơn.
Có cảm biến nhiệt độ nội trong chip
Tốc độ lấy mẫu có thể đạt đến 500.000 mẫu/ 1s.
Có 4 cách lấy mẫu: ss0 đến ss3.

-

Bộ chuyển đổi sử dụng nguồn điện áp 3V.


Sơ đồ khối ADC:


Sơ đồ lấy mẫu ADC:

Vậy sử dụng cảm biến nhiệt độ nội trong KIT EKI LM3S8962.
Giá trị ngõ ra analog sẽ được đưa qua module ADC được tích hợp sẵn trong
module để hiển thị giá trị ra trên OLED của KIT.
Sau khi qua ADC thì nhiệt độ ở độ C được tính: ulTemp_ValueC = ((1475 * 1023)
- (2250 * giá trị đo được ở ADC0)) / 10230;
Và độ F: ulTemp_ValueF = ((ulTemp_ValueC * 9) + 160) / 5;
 Nhiệt độ này sẽ được hiển thị ra OLED để thông báo cho người dùng.
2.3 Tìm hiểu về hệ điều hành FreeRTOS:
2.3.1Định nghĩa hệ điều hành thời gian thực RTOS:
Là hệ thống có:
-

Lịch trình thực thi theo thời gian.
Quản lý tài nguyên hệ thống.
Cung cấp những nền tảng cơ bản để phát triển các ứng dụng trên nó.


2.3.2 Các thành phần trong RTOS:

-

Các đối tượng trong RTOS
Bộ lịch trình (Scheduler): Là một tập các thuật toán để xác định tác vụ ( Task) nào
được thực thi.
Đối tượng (Object):Là những cấu trúc đặc biệt (Kernel) giúp người lập trình tạo ra

các ứng dụng.
Dịch vụ (Service):Là những điều khiển mà Kernel ( lõi) thực thi trong đối tượng (
object): chia thời gian ( Timing), Ngắt( interrupt), Đáp ứng ( handling) và quản lý
tài nguyên hệ thống ( resource management).

2.3.3 Các đối tượng (Objects) trong RTOS:
-

Tasks: Là các luồng ( thread) thực thi cùng tồn tại và độc lập nhau có thể “ cạnh
tranh” nhau để dành quyền thực thi.
Semaphores:Là đối tượng bắt sự kiện để đồng bộ giữa các tasks, có thể tăng hoặc
giảm.
Message Queues:Là một kiểu cấu trúc dữ liệu được dùng để đồng bộ hóa hoặc trao
đổi thông tin giữa các Tasks.
Real-time embedded applications:Là sự kết nối giữa các đối tượng của Kernel để
giải quyết vấn đề thời gian thực như sự đồng thời, sự đồng bộ,và trao đổi dữ liệu

2.3.4 Giải thuật cho lịch trình theo chế độ ưu tiên:


Giải thuật lịch trình theo độ ưu tiên.
Hầ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).
2.3.5 Quản lý task trong RTOS:
 Định nghĩa task:


Sơ đồ cấu trúc của một Task cơ bản
Task là một luồng thực thi độc lập mà có thể cạnh tranh chiếm quyền thực thi .
Một ứng dụng được chia ra làm nhiều Tasks đồng thời ( Concurrent Task) để tối ưu khả
năng đáp ứng vào ra trong luật thời gian.
Một Task được định nghĩa thuần túy là một tập các tham số và cấu trúc dữ liệu.
Các thành phần của một Task:Khi được tạo ra, Task sẽ có tên, ID duy nhất, độ ưu
tiên, một block điều khiển Task ( TCB), Stack, và Các thủ tục thực thi Task.
 Các trạng thái của một task

Hình Error! No text of specified style in document.-1: Các
trạng thái của một Task.


Tại bất kì một thời điểm, mỗi task tồn tại một trong số những trạng thái nhỏ bao
gồm: Sẵn sàng ( Ready), Đang thực thi ( Running), hoặc Khóa ( Blocked). Khi một hệ
thống nhúng thời gian thực chạy, mỗi task thay đổi từ trạng thái này đến trạng thái khác
theo quy luật logic của một mấy trang thái hữu hạn đơn giản ( Finite state machine

(FSM)).
2.3.6 Giới thiệu về FreeRTOS:
FreeRTOS được nghiên cứu bởi Richard Barry với tên ban đầu là FRTOS07. Mục
đích của FreeRTOS là portable( khả năng linh động) , open source ( mã nguồn mở) , mini
kernel (là một hệ điều hành thời gian thực nhỏ) mà có thể được thao tác trong chế độ ưu
tiên (Pre-emptive) cũng như phối hợp (Cooperative).
FreeRTOS hiện tại hỗ trợ lên đến 27 kiến trúc vi điều khiển khác nhau khác nhau :
-

Altera Nios II
ARM7, ARM9, Cortex M3
AVR, PIC, 8051
SH, H8S, PowerPC, x86

Đề tài sử dụng FreeRTOS vì sự đơn giản, dễ ứng dụng, tính phổ biến do là mã
nguồn mở.
2.3.7 Các hàm quản lý task trong FreeRTOS:
 Tạo và xóa Task:
 xTaskCreate
portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode,
const portCHAR * const pcName,
unsigned portSHORT usStackDepth,
void *pvParameters,
unsigned portBASE_TYPE uxPriority,
xTaskHandle *pvCreatedTask
);
 Mô tả: Tạo một Task và thêm vào danh sách các task sẵn sàng để thực thi.
 Tham số:
pvTaskCode:


Pointer to đến hàm hiện thưc cho Task


pcName:

Tên mô tả cho Task đó ( chỉ dùng cho mục đích debug hệ
thống). Chiều dài tối đa của tên được định nghĩa bằng
configMAX_TASK_NAME_LEN.

usStackDepth:

Là kích thước của Stack đặc trưng cho số lượng biến mà
Task có thể quản lý được.

pvParameters:

Pointer được sử dụng như là tham số của việc tạo Task.

uxPriority:

Độ ưu tiên của Task

pvCreatedTask:

Pointer trỏ đến Task được tạo.

 Trị trả về: pdPASS nếu như Task được tạo thành công.
 vTaskDelete
void vTaskDelete( xTaskHandle pxTask );

 Mô tả: Xóa một Task từ RTOS realtime management
 Tham số:pxTask poiter đến Task cần xóa
 Trị trả về: Không trị
 Điều khiển Task:
 vTaskDelay
void vTaskDelay( portTickType xTicksToDelay );
 Mô tả: Delay ( block) Task một khoảng thời gian kể từ lần cuối hàm được gọi ( số
ticks mà Task đó bị block)
 Tham số:
xTicksToDelay: Số Ticks Task bị block
 Trị trả về: Không trị.
 vTaskDelayUntil
void vTaskDelayUntil(portTickType

*pxPreviousWakeTime,

portTickType xTimeIncrement );
 Mô tả: Block Task trong một chu kì xác định .
 Tham số:
pxPreviousWakeTime Pointer đến biến lưu giá trị lần cuối cùng Task được
unclocked . Biến này phải được khởi tạo giá trị với giá trị hiện tại cho lần dùng đầu
tiên.


xTimeIncrement : Là chu kì thời gian . Task sẽ đươck uncloked sau mỗi thời
(*pxPreviousWakeTime + xTimeIncrement). Gọi hàm naỳ với mục đích thực thi một
Task theo một chu kì nhất định.
 Trị trả về: Không trị.
 uxTaskPriorityGet
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );

 Mô tả:Đọc giá trị độ ưu tiên của Task
 Tham số: pxTask : biến Handle của Task cần đọc
 Trị trả về:

Độ ưu tiên của Task cần gọi.

 vTaskPrioritySet
void vTaskPrioritySet(xTaskHandle pxTask, unsigned portBASE_TYPE
uxNewPriority );
 Mô tả: Cài đặt độ ưu tiên cho một Task.
 Tham số:
pxTask : Handle của Task sẽ được set độ ưu tiên. Nếu là NULL thì sẽ set độ ưu tiên
của Task đang được gọi ( Task hiện tại).
uxNewPriority : Độ ưu tiên mới cho Task.
 Trị trả vể:
Không trị.
 vTaskSuspend
void vTaskSuspend( xTaskHandle pxTaskToSuspend );
 Mô tả: Suspend ( xem thêm chương 1) bất kì Task nào mà không quan tâm đến độ ưu
tiên của Task đó.
 Tham số:
pxTaskToSuspend : Handle của Task sẽ bị suspend
 Trị trả về: Không trị.
 vTaskResume
void vTaskResume( xTaskHandle pxTaskToResume );
 Mô tả: Resume một Task, sẽ được dùng cùng với xTaskSuspend
 Tham số:
pxTaskToResume : Task được Resume:
 Trị trả về: Không trị
 xTaskResumeFromISR



portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume );
 Mô tả:Resume một Task từ ISR
 Tham số:
pxTaskToResume: Handle Task được Resume
 Trị tra về: pdTRUE nếu như trị việc resuming có tác dụng lên context switch,
ngược lại là pdFALSE.
 Các tiện ích khác cho Tasks
xTaskGetCurrentTaskHandle()
xTaskGetStackHighWaterMark()
xTaskGetTickCount()
xTaskGetTickCountFromISR()
xTaskGetSchedulerState()
xTaskGetNumberOfTasks()
vTaskList()
vTaskStartTrace()
ulTaskEndTrace()
vTaskGetRunTimeStats()
vTaskSetApplicationTag()
xTaskCallApplicationTaskHook()
uxTaskGetStackHighWaterMark()
 Tham khảo thông tin về FreeRTOS:
Ngoài những hàm cơ bản đã nêu ra ở trên, người sử dụng có thể tìm các thông tin
cụ thể được hỗ trợ tại trang web chính thức của FreeRTOS là: freertos.org. Các hàm kể
trên đều có đường link đến thẻ API Reference trên trang chủ của FreeRTOS.


Chương 3: THỰC


HÀNH LAB

3.1 Mô tả chung:
Mô hình này sẽ xây dựng các chuẩn của 1 hệ thống hiển thị và phân tích trạng thái
môi trường. Nó sẽ sử dụng kiến trúc ngôn ngữ bậc cao để module hóa các task để chúng
thực hiện và chạy mãi mãi.
Tín hiệu ngõ vào của hệ thống như nồng độ muối, CO2, tốc độ dòng chảy sẽ lấy từ
các giá trị random còn ngõ vào nhiệt độ sẽ lấy từ module cảm biến nhiệt độ nội
trong chip. Xem như tất cả dữ liệu này được thu thập từ 1 số vùng địa lý cụ thể có
thể là trên mặt đất hoặc dưới đại dương. Sau khi thu thập, giá trị tín hiệu ngõ vào
sẽ được xử lý như tính toán để so sánh và đưa ra các cảnh báo phù hợp nêu dữ liệu
vượt ra khỏi vùng an toàn.
- Sử dụng board ARM Cortex-M3 v7M để thực hiện hệ thống.
- Xây dựng hệ thống thông qua việc quản lý các task:
1. Remote Communication Task: nó sẽ cung cấp giao tiếp với trình duyệt web dựa
trên ứng dụng của PC. Ứng dụng này hỗ trợ cho việc truyền thông 2 chiều giữa hệ
thống điều khiển và hệ thống hiển thị ngoài môi trường.
-

Yêu cầu của task này: phải hỗ trợ việc hiển thị dữ liệu đo đạcv à tính toán trả về từ
hệ thống lên PC.
2. Command Task: task này sẽ nhận và giải thích các câu lệnh từ communication
task sau đó đưa trực tiếp đến hệ thống phụ để thực hiện yêu cầu cảu task. Đồng
thời nó cũng định dạng dữ liệu được yêu cầu để gửi bằng communication task
thông qua mạng đến hệ thống điều khiển.
3. Thermal Image Capture Task: task này sẽ vẽ ra ngõ ra analog từ hình ảnh thu
thập được từ môi trường. Hệ thống sau đó sẽ chuyển về dạng digital, thực hiện
FFT trên dữ liệu digital và gửi giá trị tần số đến hệ thống thu thập dữ liệu điều
khiển. Dữ liệu thu thập được sẽ có thể dùng để chặn các nguy cơ gây ô nhiễm.
4. Portable Generator Control Subsystem: task này sẽ cung cấp tín hiệu để điều

khiên nguồn tạo. Nếu điện áp giảm, nguồn tạo sẽ bị chuyển và sau đó hoạt động
tại tốc độ quay tăng lên để giảm điện áp pin.
5. Measure Task: task này có nhiệm vụ thu thập dữ liệu đầu vào từ các cảm biến,
trong trường hợp này ta lấy các giá trị random của nồng độ CO2, muối, tốc độ
dòng chảy và lấy giá trị từ cảm biến nhiệt độ nội trong chip.


6. Compute Task: task này tạo ra với mục đích tính giá trị chính xác của nồng độ
CO2, tốc độ dòng chảy, nồng độ muối và nhiệt độ. Vì như giả thiết ban đầu, số
liệu thu được bao giờ cũng có những sai số nhất định do thiết bị.
7. Display Task: để hiển thị giá trị của các thông số: nhiệt độ, tốc độ chảy, nồng độ
muối, CO2 cũng như các cảnh báo trên OLED.
8. Warning/Alarm Task: mục đích của task là so sánh giá trị dữ liệu thu thập được
với các giá trị chuẩn có thể có cảu môi trường sau đó đưa ra các tín hiệu cảnh báo
cần thiết.
9. Annuncaiton Task: task này có chức năng đưa ra các thông báo về tình trạng pin,

10. Scheldule Task: lập lịch cho việc thực hiện các task.
11. Keypad Task: làm việc với các phím chức năng của hệ thống
Nhìn chung lại hệ thống gồm có các khối chính: measure, compute, display,
annunciation, scheldule.
3.2 Kiến trúc phần mềm của hệ thống:
Hệ thống thu thập và hiển thị dữ liệu của môi rường sẽ được tổ chức theo 1 chuỗi
các tasks theo các chức năng được phân tích ở trên.
Các task này sẽ được thực hiện khi nguồn ở trạng thái bật. Điều cần quan tâm ở
đây là quy định các thứ tự ưu tiên cho phù hợp. Thông tin dữ liệu giữa các task của hệ
thống phải được thay đổi và chia sẻ với nhau.
3.2.1Tasks và Task Control Block (TCB):
Như đã xác định ở trên, các thành phần của hệ thống sẽ được thiết kế theo các
tasks. Mỗi task sẽ được xem như 1 cấu trúc TCB trong ngôn ngữ lập trình C:

struct MyStruct
{
void (*myTask)(void*);
c
};
Trong đó:
-

void (*myTask)(void*): con rỏ chương trình mà task thức hiện
void (*myTask)(void*): con rtor dữ liệu của task.

=> Việc tạo ra TCB trong hệ điều hành thời gian thực sẽ sử dụng hàm API xTaskCreate
( ) quy định.
Như vậy với yêu cầu của hệ thống chúng ta có tất cả 11 tasks.


3.2.2 Trao đổi dữ liệu giữa các task và Control Data:
-

Tất cả hệ thống đều chia sẽ các thông số của mình dưới dạng biến toàn cục.

Dựa trên việc phân tích các chức năng của task và các dữ liệu giá trị ngõ vào ta có
thể dễ dàng nhận ra các kiểu biến sẽ có trong các các task như sau:
Measure task:
Type unsigned int
 temperatureRawBuf[8]
buffer
 flowRateRawBuf[8]
 carbonLevelRawBuf[8]
buffer

 salinityLevelRawBuf[8]
buffer
Display task:

Declare as a 8 measurement temperature
Declare as a 8 measurement flow rate buffer
Declare as a 8 measurement carbon level
Declare as a 8 measurement salinity level

Type unsigned int
 temperatureRawBuf[8]
buffer
 flowRateRawBuf[8]
 carbonLevelRawBuf[8]
buffer
 salinityLevelRawBuf[8]
buffer
Display task:

Declare as a 8 measurement temperature
Declare as a 8 measurement flow rate buffer
Declare as a 8 measurement carbon level
Declare as a 8 measurement salinity level

Type (To be supplied by engineering)
 Keypad status and data
initial values
 Local Comms status and data
initial values
Alarm task:

Type unsigned char
 tempOutOfRange
 flrtOutOfRange
 carbonLevelOutofRange
 salinityLevelOutofRange
Type Bool1

initial value 0
initial value 0
initial value 0
initial value 0








tempHigh
initial value FALSE
flrtHigh
initial value FALSE
carbonLevelHigh
initial value FALSE
salinityLevelHigh
initial value FALSE
Polar bear proximity detection
initial value FALSE


Status task:
Type unsigned short
 batteryState

initial value 200

Với cấu trúc của dữ liệu:
Global
int data;
struct DataStruct
{
int* taskDataPtr;

typedef struct DataStruct TaskData;
TaskData myTaskData;
myTaskData.taskDataPtr = &data;

};

Với int* taskDataPtr là con trỏ biến của task.
Từ đó, thấy các con trỏ dữ liệu cần của các task là:
MeasureData – Holds pointers to the shared variables:
temperatureBuf
flowRateBuf
carbonLevelBuf
salinityLevelBuf

ComputeData – Holds pointers to the shared variables:
temperatureBuf
flowRateBuf

carbonLevelBuf
salinityLevelBuf
tempCorrected
flowRateCorrected


carbonLevelCorrected
salinityLevelCorrected

DisplayData – Holds pointers to the shared variables:
tempCorrected
flowRateCorrected
carbonLevelCorrected
salinityLevelCorrected
batteryState

WarningAlarmData – Holds pointers to the shared variables:
temperatureBuf
flowRateBuf
carbonLevelBuf
salinityLevelBuf
batteryState

Status – Holds pointers to the shared variables:
batteryState

KeypadConsoleData – Holds pointers to the variables:
Keypad status and data
(To be supplied by engineering)
(To be updated as necessary)


LocalComsData – Holds pointers to the variables:


Local Comms status and data
(To be supplied by engineering)
(To be updated as necessary)

3.2.3 Xây dựng các hàm:
Hàm Measure:
Với kiểu void* và kiểu trả về void.
Hàm này dùng để đo nhiệt độ, tốc độ chảy, nồng độ muối, CO2, trạng thái pin,…
Trong đó:
- Đo nhiệt độ dùng cảm biến nhiệt độ nội của chip và tiến hành ADC.
- Các giá trị còn lại lấy bằng cách tạo random:
 Tốc độ dòng chảy: đặt biến đếm ban đầu = 0, cứ mỗi lần đếm chẵn thì tăng 3, đếm
lẻ thì giảm 1, giá trị sẽ được quy định trong 1 vùng từ 0 đến 100.
 Nồng độ cacbon: đặt biến đếm ban đầu = 0, cứ mỗi lần đếm chẵn thì tăng 5, đếm
lẻ thì giảm 2, giá trị sẽ được quy định trong 1 vùng từ 40 đến 400.
 Nồng độ muối: đặt biến đếm ban đầu = 0, cứ mỗi lần đếm chẵn thì tăng 2, đếm lẻ
thì giảm 1, giá trị sẽ được quy định trong 1 vùng từ 20 đến 45.
- Hàm Compute:
Với kiểu void* và kiểu trả về void.
Hàm này dùng để tính các giá trị chính xác của ngõ vào theoc ác công thức cụ thể:




-


Nhiệt độ: tempCorrected = 5 + 0.8tempRaw
Tốc độ dòng chảy: flowRateCorrected = 9 +2.0flowRateRaw
Nồng độ cacbon: carbonLevelCorrected = 7 + 1.2 carbonLevelRaw
Nồng độ muối: salinityLevelCorrected = 6 + 0.7 salinityLevelRaw
Hàm hiển thị lên OLED:
Với kiểu void* và kiểu trả về void.

Hàm này sẽ dùng hàm chuyển đổi kiểu int sang char để hiển thị giá trị của các ngõ
vào 1 cách chính xác bằng hàm hiển thị lên OLED trong thư viện của ARM.
- Hàm cảnh báo:
 Nhiệt độ: Khi nhiệt độ > hoặc < thì OLED sẽ hiển thị thông báo, đồng thời các
LED sẽ nháy.


 Tốc độ dòng chảy: Khi tốc độ dòng chảy > hoặc < thì OLED sẽ hiển thị thông báo,
đồng thời các LED sẽ nháy.
 Nồng độ muối: Khi nồng độ muối > hoặc < thì OLED sẽ hiển thị thông báo, đồng
thời các LED sẽ nháy.
 Nồng độ cacbon: Khi nồng độ cacbon > hoặc < thì OLED sẽ hiển thị thông báo,
đồng thời các LED sẽ nháy.
- Hàm keypad: nhận mức cao của keypad để điều khiển việc chọn các task.
- Hàm LocalComs:
Hàm này dùng để gửi dữ liệu về các ngõ vào lên PC và nhận tín hiệu điều khiển
thông qua giao tiếp UART.
Lưu ý set đúng tốc độ baud để có thể giao tiếp.
-

Hàm websever:

Hàm này dùng để gửi dữ liệu lên 1 trang web và nhận tín hiệu điều khiển từ web

gửi về cho việc chạy các task khác như hiển thị, tính toán, …
3.2.4 Lập lịch cho hệ thống:
Mỗi task được tạo ra trong hệ điều hành FreeRTOS sẽ được lập lịch với thứ tự ưu
tiên khác nhau. Ứng với thứ tự ưu tiên đó hệ thống sẽ chạy theo trình tự các công việc:
1.
2.
3.
4.
5.
6.

Xác định lựa chọn thông qua keypad
Đo đạc giá trị thực
Tính toán giá trị chính xác
Hiển thị giá trị chính xác lên OLED
Xác định tình trạng pin
So sánh và đưa ra các cảnh báo
Nếu các task có thứ tự ưu tiên giống nhau thì sẽ được thực hiện theo thứ tự tạo ra

task.
Lưu ý trong các hàm của task phải chạy mãi mãi (for{;;})

4. Code: file gửi kèm
5. Đánh giá hệ thống:
Hệ thống chạy ổn định, các module được coi như mỗi task, khi ghép vào tốt. Tuy nhiên vì
dùng IAR giới hạn code nên các chỉ ghép được 1 vài task khi ứng dụng hiển thị giá trị
trên web.
6.Các hướng mở rộng:



-

Kết nối với các sensor bên ngoài để thu thập và xử lý dữ liệu một cách chính xác.
Mở rộng ứng dụng cho nhiều sensor, không chỉ có nồng độ muối, nồng độ CO2,
nhiệt độ, tốc độ dòng chảy và tình trạng pin.


×