PIC Vietnam

Go Back   PIC Vietnam > Robotics > Matlab-Simulink & Labview & 20-Sim

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Matlab-Simulink & Labview & 20-Sim Các công cụ mô phỏng đa ngành...

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 09-01-2007, 05:57 PM   #3
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
LabVIEW sử dụng bộ nhớ như thế nào? (P.1)

LabVIEW là một ngôn ngữ lập trình nên nhiều cách dùng tương tự với lối lập trình cổ điển có thể làm ảnh hưởng đến các VI của bạn. Việc quản lý bộ nhớ trong LabVIEW đặc biệt khác biệt vì LabVIEW quản lý việc cấp phát và tái cấp phát bộ nhớ một cách rõ rệt, không thể nhầm lẫn được.

Theo lối lập trình cổ điển C, C++ hoặc Pascal…, việc cấp phát (allocation) và tái cấp phát (deallocation) là những nguyên nhân của nhiều vấn đề và việc thực hiện không đạt hiệu quả đáng kể. Ví dụ trong C, phải cấp phát chia bộ nhớ một cách rõ ràng (với hàm malloc). Bởi vì LabVIEW là một ngôn ngữ lập trình nên nhiều cách dùng tương tự với lối lập trình cổ điển có thể làm ảnh hưởng đến các VI của bạn. Việc quản lý bộ nhớ trong LabVIEW đặc biệt khác biệt vì LabVIEW quản lý việc cấp phát và tái cấp phát bộ nhớ một cách rõ rệt, không thể nhầm lẫn được.

LabVIEW quan tâm đến hầu hết các chi tiết bộ nhớ này. Việc cấp phát bộ nhớ vãn xảy ra và nó không chỉ hiện trên sơ đồ khối của LabVIEW. Đó là lý do tại sao chúng ta đề cập đến các vấn đề về bộ nhớ của LabVIEW.

Bửoi vì LabVIEW quản lý việc cấp phát bộ nhớ và tái cấp phát sau khi lập trình nên bạn không cần phải điều khiển nhiều trên phần quản lý bộ nhớ. Nếu bạn có 1 chwong trình ứng dụng LabVIEW hoặc VI hoạt động ngoài vùng nhớ, bạn không biết nơi nào để bắt đầu sửa lỗi. Mục đích của bài viết này cho bạn viết LabVIEW quản lý bộ nhớ như thế nào và cho bạn biết những vấn đề bạn có thể điều khiển và tối ưu những vấn đề bạn không thể điều khiển. Hơn nữa cần phải hiểu là làm thế nào để tối thiểu hóa việc sử dụng bộ nhớ có thể giúp tăng tốc độ thực hiện VI, bởi vì sự phân chia ổ nhớ và sao chép dữ liệu có thể làm mất một thời gian đáng kể.

Bộ nhớ ảo

- Dùng đĩa cứng như RAM

- Có thể giúp đỡ để chạy các ứng dụng lớn hơn

- Được quản lý hoàn toàn tự động cho Windows 95/98/NT, HP-UX

- Người dùng phải định hình cho Win 3x, Macintosh…

Nếu dung lượng máy tính không đủ lớn, có thể bạn muốn quan tâm đến việc dùng bộ nhớ ảo cho các ứng dụng của bạn. Bộ nhớ ảo là một khả năng tiềm tàng cho hệ thống hoạt động của bạn bởi cách dùng không igan trống của đĩa có hiệu quả cho việc cất giữ của RAM. Nếu bạn cấp phát 1 vùng nhớ ảo lớn thì các ứng dụng hiểu được bộ nhớ ảo như bộ nhớ có hiệu quả cho việc lựa trữ thông thường.

LabVIEW không có sự khác biệt giữa RAM và bộ nhớ ảo. Thực tế thì hệ thống hoạt động che giấu bộ nhớ gọi là ảo. Tuy nhiên, việc truy nhập dữ liệu được cất trong bộ nhớ ảo chậm hơn việc truy nhập dữ liệu được cất trong RAM. Với bộ nhớ ảo, đôi khi bạn có thể thấy nó thực hiện chậm chạp hơn, khi bộ nhớ được trao đổi tới và từ ổ cứng bằng hệ điều hành. Bộ nhớ ảo có thể giúp chạy các ứng dụng lớn hơn, nhưng không thích hợp cho các ứng dụng mà có thời gian tới hạn bắt buộc.

Trong bộ nhớ, các cấu trúc dữ liệu của LabVIEW bao gồm: front panel (mặt máy), block diagram (sơ đồ khối), code (mã máy) và data space (không gian dữ liệu). Vì vậy, chúng ta sẽ lần lượt thảo luận đến các thành phần này ảnh hưởng đến bộ nhớ như thế nào.

Khi 1 VI được nạp vào trong bộ nhớ thì:

- Dữ liệu luôn luôn được nạp

- Mã máy được nạp (đối với các máy 68K, PPC, Win 95/NT/98, SPARC, HP-UX).

- Mặt máy và sơ đồ khối được nạp nếu cần thiết.


Có nghĩa là LabVIEW chỉ nạp các thành phần cấu trúc vào bộ nhớ mà nó cần và các phần khác thì được nạp sau đó khi cần thiết. Ví dụ 1 subVI điển hình chỉ có mã và dữ liệu của nó được nạp khi VI chính được nạp. Còn nếu bạn mở và hiển thị mặt máy của subVI này từ block diagram của chương trình chính thì mặt máy của subVI sẽ được nạp vào trong bộ nhớ. Và nếu bạn tiếp tục mở block diagram của subVI thì sơ đồ khối của subVI sẽ được nạp vào trong bộ nhớ.

Như vậy, tức là bạn có thể tiết kiệm bộ nhớ bằng cách chuyển một số thành phần trong VI của bạn thành chương trình con (chọn các thành phần mà bạn muốn tạo thành chương trình con trong block diagram rồi chọn Edit/Create subVI). Nếu bạn thiết kế 1 VI lớn mà không có 1 subVI nào thì tất cả front panel, code và data đều nằm trong bộ nhớ. Còn nếu VI đó được chia thành các subVI thì code của VI chính sẽ nhỏ hơn, chỉ có code và data của các subVI nằm trong bộ nhớ.

Cách dùng bộ nhớ của front panel

Front panel là mặt gia diện của người sử dụng để lập trình bằng LabVIEW. Control và Indicator sao chép dữ liệu của chính chúng để thực hiện dữ liệu trên mặt máy không bị ảnh hưởng đến việc tính toán trên block diagram. Dữ liệu năm trong front panel hay là dữ liệu năm trong control và indicator được gọi là dữ liệu điều khiển (operate data) bởi vì thông tin ở đây được cập nhật khi bạn điều khiền VI. Dữ liệu trong diagram được gọi là dữ liệu thi hành (execute data) bởi vì nó được định nghĩa hoặc cập nhật khi VI thi hành hoặc khi VI chạy. Vì vậy, dữ liệu điều khiển nằm trong bộ nhớ khi:

- Front panel mở

- VI không được ghi sau khi được tạo hoặc được soạn thảo

- Diagram dùng các thuộc tính (attribute node). Nhiều thuộc tính như màu, điều khiển sự định dạng kiểu số trên các cấu trúc dữ liệu tồn tại trong bộ nhớ front panel và vì vậy mặt máy được giữ trong bộ nhớ.

- Cho phép in dữ liệu của mặt máy. Việc in cần panel trong bộ nhớ vì vậy việcin dữ liệu làm cho panel luôn luôn được nạp.

- Sử dụng các biến cục bộ. Trường hợp này front panel không ở trong bộ nhớ nhưng LabVIEW vẫn sao chép dữ liệu thi hành tới dữ liệu điều khiển bất cứ khi nào có dữ liệu gửi đến 1 terminal của front panel.

Cách dùng bộ nhớ của block diagram

Block diagram là mã nguồn của 1 VI và là một trong những thành phần chiếm nhiều dung lượng bộ nhớ. Block diagram sẽ nằm trong bộ nhớ khi:

- Diagram mở

- VI được sao chép tới các hệ điều hành khác

- VI bị thay đổi nhưng không được ghi. Bởi vì LabVIEW cần biên dịch lại block diagram thành mã máy trước khi diagram được đưa ra khỏi bộ nhớ.

Khi các control được đọc, dữ liệu điều khiển được đưa vào hệ thống thi hành và dữ liệu thi hành được gửi tới và nạp vào indicator của panel.

Nói tóm lại, vì diagram là một trong những thành phần chiếm 1 lượng lớn bộ nhớ của 1 VI nên việc ghi và đóng diagram sẽ làm tăng không gian nhớ.

Code (Mã)

Code của LabVIEW là mã máy. Khi nạp 1 VI vào trong bộ nhớ, mã của VI chính và tất cả mã của các subVI sẽ luôn luôn thường trú trong bộ nhớ. Mã biên dịch (code) luôn là thành phần chiếm ít bộ nhớ nhất trong số 4 thành phần chính đã nêu ở trên của LabVIEW. Đó là cách nạp thông thường mã của 1 VI vào trong bộ nhớ. Hơn nữa, LabVIEW còn có thể điều khiển những gì code nhận để nạp hoặc khi nào nạp. LabVIEW cũng có khả năng nạp tự động 1 VI vào trong bộ nhớ được gọi là VI Server (vấn đề này không được thảo luận ở đây, các bạn có thể tìm đọc tài liệu “LabVIEW Advanced I” để hiểu thêm).

(còn tiếp)
LabVIEW sử dụng bộ nhớ như thế nào? (P.2)

Như chúng ta đã biết, LabVIEW thi hành mã theo kiểu lập trình luồng dữ liệu. Theo cách lập trình luồng dữ liệu, các biến không thường xuyên bị sử dụng.


Không gian dữ liệu của LabVIEW

Như chúng ta đã biết, LabVIEW thi hành mã theo kiểu lập trình luồng dữ liệu. Theo cách lập trình luồng dữ liệu, các biến không thường xuyên bị sử dụng. Mô hình luồng dữ liệu mô tử các nút (điểm) như là các đầu vào dữ liệu chi phối và các đầu ra dữ liệu. Việc thi hành đúng kiểu lập trình này sẽ sinh ra các ứng dụng định vị một bộ đếm dữ liệu mới cho mỗi 1 kiểu nối dây trong lưu đồ LabVIEW. Việc này sử dụng một lượng lớn bộ nhớ và có thể thực hiện một cách không linh hoạt bởi vì mỗi một hàm sẽ phát ra dữ liệu và đưa qua một đầu ra. LabVIEW hoàn hiện vấn đề này bằng việc thử xác định rõ khi bộ nhớ dùng lại và bằng việc nhìn vào các đầu ra mà dữ liệu đi qua để xác định rõ nơi cần thiết làm các bản sao cho mỗi terminal riêng biệt.




Ở hình trên, diagram sẽ sử dụng 2 khối nhớ dữ liệu, một khối nhớ cho đầu vào và một khối cho đầu ra.

LabVIEW dùng số bộ đệm cho dữ liệu nhỏ nhất bằng việc dùng lại các bộ đệm trước đó. Giả sử mảng đầu vào và mảng đầu ra chứa cùng số phần tử và cùng kiểu dữ liệu như hình vẽ dưới đây:




Mảng ở đây là mảng các giá trị phát ra sau khi lập 1000 lần. Mảng đó được đưa vào 3 hàm Index Array được biểu diễn trong bộ nhớ như 1 bộ đệm dữ liệu. Nếu LabVIEW dùng lại bộ đệm của đầu vào cho mảng đầu ra chứ không tạo ra một bộ đệm mới thì bộ nhớ được tiết kiệm hơn. Vì vậy, sự hoạt động cũng nhanh hơn.

Có 2 loại hoạt động khác nhau mà 1 hàm của LabVIEW có thể làm với một bộ đệm của mảng đầu vào, đó là: Có thể thay đổi dữ liệu trong mảng hoặc chỉ đọc mảng dữ liệu. Các hàm mà chỉ đọc dữ liệu thì không cần phải ghi lại dữ liệu. Hàm Array Index không biến đổi dữ liệu tỏng mảng, vì vậy 3 hàm Index Array ở trên chia sẻ cùng bộ đệm đầu vào. Vì vậy, chỉ có 1 bản ghi của mảng tồn tại trong bộ nhớ. Và vì đầu ra có kiểu dữ liệu là I32 (số nguyên 32 bit, dùng 4 byte/ 1 giá trị) cho nên bộ đệm sẽ dùng 4 KB bộ nhớ. Chúng ta cần chú ý tới một số đặc điểm sau:

- Tùy thuộc vào kiểu dữ liệu cụ thể mà LabVIEW sẽ sử dụng không gian nhớ khác nhau. Ví dụ kiểu DBL (số thực dấu phẩy động 64 bit chiếm 8 byte trong bộ nhớ…)

- Với dữ liệu là mảng số của các kiểu dữ liệu (mảng I8, mảng I6,…) thì dữ liệu sẽ được chứa trong các khối nhớ (block) liên tiếp nhau. Tức là các phần tử trong mảng được chứa trong các ô nhớ kề nhau trong khối nhớ. Với mảng một chiều, LabVIEW chứa số phần tử của mảng dưới dạng số nguyên 32 bit (I32), tức là mất 4 byte để chứa số phần tử của mảng. Vì vậy mảng lớn nhất có thể tạo ra được sẽ chứa 2331- 1 phần tử, tức là mất 2 byte để chứa 1 phần tử của mảng.

Số phần tử
Phần từ thứ 0
Phần tử thứ 1

Phần tử thứ i
Phần tử thứ N-1

4 byte
2 byte
2 byte
2 byte2
Byte
2 byte


- Còn với mảng 2 chiều trở lên thì số ô nhớ là tổng số ô nhớ của mỗi mảng 1 chiều.

- Với các string (chuối ký tự) thì số ô nhớ sử dụng cũng giống như đối với các mảng các số nguyên không dấu. Trong đó độ dài (length) kí tự chiếm 4 byte, còn các kí tự đầu tiên của chuỗi được hiểu như là các số nguyên có dấu. Vì vậy chuỗi dài nhất có thể tạo được sẽ chứa 2331- 1 kí tự. Có thể sử dụng chuối kí tự để chứa hầu như bất kỳ loại dữ liệu nào. Kiểu dữ liệu dạng chuối kí tự có thể chứa dữ liệu dạng text thông thường cũng như là dữ liệu dạng nhị phân. Vì vậy string rất hay được sử dụng trong các chuẩn truyền tín nối tiếp, GPIB, VXI, TCP hay là các chuẩn I/O.

- Với mảng các chuối kí tự thì phức tạp hơn so với mảng số vì mỗi phần tử trong mảng chuối kí tự lại có thể chứa 1 số các kí tự khác nhau. Vì vậy, LabVIEW chứa mảng chuỗi trong bộ nhớ ở dạng tự do. Tức là, dữ liệu được chứa riêng biệt, không liên tiếp nhau.

Bây giờ chúng ta trở lại với vấn đề sử dụng bộ đệm ở phần trên. Việc dùng lại bộ đệm không phải lúc nào cũng có thể xảy ra như trường hợp trên. Trong trường hợp 1 hàm sửa đổi 1 bộ đệm của mảng đầu vào và mảng đầu vào này không được dùng lại trong sơ đồ khối thì hàm này có thể dùng lại bộ đệm của đầu vào cho dữ liệu đầu ra.

Tuy nhiên nếu nhiều hàm sửa đổi dữ liệu đang tới thì chỉ có 1 hàm có thể dùng lại bộ đệm của dữ liệu gốc, còn các hàm khác phải dùng bộ đệm mới. Block diagram sau minh họa điều đó:




Hình này, 1 nguồn phát ra dữ liệu được đưa qua 3 hàm Replace Array Subset. Trường hợp này LabVIEW tạo ra các bộ đệm mới cho các hàm để chứa dữ liệu. Cũng có trường hợp dữ liệu thi hành và sự thực hiện phải theo thứ tự. Diagram sau minh họa vấn đề này:




Với trường hợp này, LabVIEW sẽ thực hiện việc đưa dữ liệu qua hàm Index Array trước, sau đó mới đưa dữ liệu qua hàm Replace Array Subset. Bởi vì LabVIEW quyết định thứ tự thực hiện các hàm mà không có dữ liệu phụ thuộc trước và LabVIEW ưu tiên việc thực hiện các hàm mà sử dụng bộ nhớ nhỏ nhất (bạn có thể tạo một diagram như trên trong LabVIEW rồi chọn chức năng Hilight Execution và ấn nút Run để kiểm tra).

Trường hợp có nhiều hơn 2 mảng dữ liệu được phát riêng biệt, LabVIEW sẽ đưa các dữ liệu đầu vào vào bộ đệm một cách thứ tự từ trên xuống (tức là đưa dữ liệu mà được tính toàn đơn giản nhất vào trước rồi mới đến các dữ liệu phải tính toán phức tạp hơn vào sau). Diagram sau sẽ minh hoạt điều đó:




Diagram này, có 2 nguồn phát số ngẫu nhiên sau khi thực hiện 2 vòng For sẽ phát ra hai mảng dữ liệu và sẽ thực hiện phép tính cộng trước rồi mới thực hiện phép tính nhân. Nguồn dữ liệu sẽ được đưa tới đầu vào thứ 1 của phép tính nhân trước, rồi mới đến dữ liệu ở , tức là sẽ được đưa vào bộ đệm trước rồi mới đến . Vì vậy, ở đây chỉ cần 2 bộ đệm để nhớ dữ liệu. Theo cách này, phải dùng tới 24KB bộ nhớ cho dữ liệu. Nhưng với cùng 1 kết quả được đưa ra, cách lập trình như sau thì phải cần 3 bộ đệm để nhớ dữ liệu:




Bởi vì theo cách này sau khi thực hiện phép công cần phải dùng 1 bộ đệm nữa để ghi lại kết quả rồi mới thực hiện phép tính nhân. Và vì vậy phải dùng tới 32KB bộ nhớ cho dữ liệu. Nhưng kiểu lập trình như diagram sau chỉ dùng có 16KB không gian nhớ cho dữ liệu:




Bởi vì theo cách này bộ nhớ đệm chứa dữ liệu sau phép tính cộng chính là bộ đệm của mảng dữ liệu phát ra sau vòng lặp. Và vì vậy cách này chỉ sử dụng 1 bộ đệm cho việc tính toán dữ liệu.

Các ví dụ trên đây, chúng ta chỉ đề cập đến việc tạo mảng dữ liệu đối với vòng lặp For. Còn đối với vòng lặp While thì hoàn toàn tương tự. Cách tạo và xử lý mảng bằng các vòng lặp trong LabVIEW sẽ làm cho việc sử dụng bộ nhớ của chương trình hiệu quả hơn, vì vậy số bộ nhớ sử dụng là nhỏ nhất. Với cách tạo mảng này, số không gian bộ nhớ mà mảng dữ liệu cần là = N* x byte. Trong đó N là tổng số vòng lặp, x là số byte của kiểu dữ liệu của N. Ví dụ như các diagram trên, N = 1000, dùng kiểu dữ liệu là I32 nên x = 4 byte và vì vậy mảng dữ liệu sau vòng lặp xuất ra chiếm 4000 byte ≈4KB không gian bộ nhớ.

Như vậy chúng ta đã biết được một số phần cơ bản nhất về cách LabVIEW dùng bộ nhớ đối với các thành phần chính như thế nào. Ngoài ra còn có các hàm và các chức năng khác trong block diagram ảnh hưởng đến bộ nhớ như: biến toàn cục, biến cục bộ ảnh hưởng đến bộ nhớ; thanh ghi dịch của dòng While ảnh hưởng đến bộ nhớ, cấu trúc case ảnh hưởng đến bộ nhớ, cluster ảnh hưởng đến bộ nhớ. Nhưng trong phạm vi nội dung của bài viết có hạn nên tôi không đề cập đến vấn đề này.

Các bạn yêu thích tìm hiểu thêm có thể tham khảo các tài liệu sau:

LabVIEW Basic II – Course Manual của National Instrument
LabVIEW Advanced I, của hãng National Instrument

Bài viết của tác giả: Vương Vũ Hiệp

Trung tâm MICA - C10 - ĐH BK Hà Nội
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Tài liệu về Labview moutainBK Matlab-Simulink & Labview & 20-Sim 12 29-09-2007 11:24 AM
LabView và SQL Vinh3i Matlab-Simulink & Labview & 20-Sim 0 08-01-2007 03:34 PM
Vài định hướng phát triển cho cộng đồng điện tử Việt Nam gadaubac Trao đổi ngoài luồng 1 10-11-2006 11:48 AM
Cung cấp sensor chuyên nghiệp techpro Quảng cáo và bán sản phẩm 2 10-09-2006 01:59 PM
Cung cấp sensor chuyên nghiệp techpro Quảng cáo và bán sản phẩm 0 08-09-2006 07:51 PM


Múi giờ GMT. Hiện tại là 12:17 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam