Bước 1: Vào Tool → RTDX→Configuration Control như hình dưới
Bước 2 : Vào mụ Configure khi đó ta thấy cửa sổ RTDX Control như hình dưới:
Hình 2.15 Thay đổi các thông số RTDX
Có thể chọn các thông số Buffer Size và Number of Buffer cho phù hợp với hệ thống. Do trong chương trình luận văn viết dữ liệu tới một tệp dữ liệu lên “host” nên dùng kiểu
Continuous Mode như hình trên
Sau đó Chọn Apply → OK
Bước 3: Mở RTDX bằng cách chọn vào như hình dưới
Hình 2.16 Cài đặt và khởi động RTDX
Để thay đổi các cài đặt phải chắc chắn rằng RTDX đã được vô hiệu hóa. Chọn trên cửa sổ và chọn Property Page. Ở đây bạn có thể lựa chọn kích thước của bộ đệm.
2.5.2.3 C ấu tr C làm việ với RTD
Các bước cần thiết để tạo vị trí trong ứng dụng trên bo mạch cho việc nhận và gửi dữ liệu từ PC:
Tham chiếu tới file header rtdx.h.
Công bố kênh vào và ra toàn cục (input, output) cho việc truyền và nhận dữ liệu. Các kênh là các cấu trúc dữ liệu được công bố trong các lệnh sau. Kênh có thể chọn tên là
input và có thể có tên khác.
RTDX_CreateInputChannel( name ); RTDX_CreateOutputChannel( name );
Khởi chạy ứng dụng trên bo mạch. Có một cặp được khởi chạy trên bo mạch. Nếu sử dụng công cụ DSP/BIOS configuration tool thì cả hai sẽ tự động xảy ra. Mặt khác
mục chọn thứ hai sẽ chi xảy ra sau khi hàm main() này thoát.
- Một sự kiện được chạy ở ứng dụng trên bo mạch định kì để gọi chức năng RTDX_poll để giữ dòng dữ liệu giữ PC và bo mạch. Nếu công cụ cấu hình dùng để thiết lập nó lên cho bạn. Ngắt cứng HWI HWI_RESERVED1 được sử dụng để gọi chức năng RTDX_poll trên chu kì cơ sở.
- Trên C6x RTDX sử dụng ngắt. Do đó NMI và các ngắt toàn cục phải được cho phép.
Cho phép kênh đọc và ghi dữ liệu sử dụng các hàm sau:
RTDX_enableInput(&name) RTDX_enableOutput(&name)
Đọc và viết kênh RTDX sử dụng một trong các hàm sau:
RTDX_read(&name, &data, sizeof(data)) RTDX_readNB(&name, &data, sizeof(data)) RTDX_write(&name, &data, sizeof(data))
RTDX_read() [7]
Cú pháp:
int RTDX_read( RTDX_inputChannel *ichan, void *buffer, int bsize );
Các tham số:
ichan: kênh đầu vào dữ liệu
buffer: con trỏ tới bộ đệm sẽ nhận dữ liệu
bsize: kích thước của bộ đệm trong mỗi đơn vị địa chỉ
Giá trị trả về:
> 0 Số đơn vị địa chỉ dữ liệu đã được gửi đến bộ đệm. 0 (zero) Lỗi. Không thể gửi yêu cầu đọc vì bộ đệm target đã đầy
Khi RTDX_read được dùng, ứng dụng trên target thông báo cho thư viện RTDX host rằng nó đã sẵn sàng nhận dữ liệu và chờ trong vòng lặp cho đến khi việc đọc hoàn thành.
Sử dụng khi đọc dữ liệu dạng khối.
RTDX_readNB():
Khi RTDX_readNB được dùng, ứng dụng trên target thông báo cho thư
viện RTDX host rằng nó đã sẵn sàng nhận dữ liệu nhưng không chờ.
Sử dụng cùng với RTDX_channelBusy và RTDX_sizeofInput để kiểm
tra kênh truyền thực tế đang được dùng hay là không.
Sử dụng khi đọc các dữ liệu không ở dạng khối.
RTDX_write(): Ghi dữ liệu lên kênh truyền
Vô hiệu hóa kênh sau khi dùng.
RTDX_disableInput RTDX_disableOutput
Chu trình này sẽ được thể hiện trong đoạn code sau trong đó ngắt mềm SWI sẽ được thiết lập để truyền dữ liệu tới PC. Trong ví dụ này các số tự nhiên sẽ được gửi tới PC một lần. Thừa nhận rằng công cụ cấu hình được sử dụng để thiết lập DSP/Bios và do đó target không cần phải khởi chạy.
Hàm gửi dữ liệu tới PC
/* create a global output channel */ RTDX_CreateOutputChannel( ochan );
void funSWI() {
int data = 10; /* data to send to host */ int status;
/* enable the output channel */ RTDX_enableOutput( &ochan );
/* send the data to the host */
status = RTDX_write( &ochan, &data, sizeof(data) );
/* check the status of the write operation */ if ( status == 0 ) {
puts("ERROR: RTDX_write failed!\n" ); exit(-1 );
}
RTDX_disableOutput( &ochan ); }
Hình 2.17 Hàm gửi dữ liệu tới PC 2.6 Chương trình ứng dụng trên PC (Host Application)
Dữ liệu truyền thông giữa PC và bo mạch thông qua giao diện JTAG và chúng được lưu trong bộ đệm tương ứng của PC và bo mạch. Việc ghi hay nhận dữ liệu này là nhờ chức năng của CCS gọi các hàm trong thư viện chuẩn RTDXINTLIB trong bộ cài của CCS. Do đó để thao tác với dữ liệu với bo mạch có thể dùng một số ngôn ngữ như Matlab, Visual Basic, .Net… Luận văn sử dụng ngôn ngữ Visual Basic.
Sau đây là một số điểm cần chú ý khi sử dụng Visual Basic trong việc giao tiếp với bo mạch.
Định nghĩa và tham chiếu trả lại cho RTDX. Một số hàm trả lại cho chúng ta các thông tin trạng thái của RTDX như ở đoạn code sau có thể được sử dụng:
Các trạng thái của RTDX
Const Success = &H0 ' Method call is valid Const Failure = &H80004005 ' Method call failed
Const ENoDataAvailable = &H8003001E ' No data was available. ' HoIver, more data may be available in the future
Const EEndOfLogFile = &H80030002 ' No data was available. ' The end of the log file has been reached
Hình 2.18 Các trạng thái của RTDX
Khai báo biến rtdx thuộc kiểu Object. Tạo đối tượng RTDX mang các thuộc tính của rtdx
Dim rtdx As Object
Set rtdx = CreateObject("RTDX")
Thiết lập kênh mà đối tượng RTDX sẽ kết nối đến. Cần nhớ rằng các kênh này phải
trùng tên với các kênh đã được tạo ở target.
status = t x.Open("t n k nh", "Kiểu") status = rtdx.Open("ochan", "R")
status = rtdx.Open("ichan", "W")
Trong đó “Kiểu” là “R” nếu đây là kênh đọc dữ liệu từ target, và là “W” nếu muốn ghi dữ liệu xuống bo mạch. Hàm này trả về không nếu kết nối thành công.
Sau khi đã cấu hình xong các kênh chỉ cần gọi các các hàm của đối tượng này tuỳ theo kiểu dữ liệu muốn đọc hay ghi. Dưới đây liệu kê một số hàm hay dùng : Đọc và ghi dữ liệu từ kênh:
o ReadSAI1, ReadSAI2, ReadSAI4, ReadSAF4, ReadSAF8, ReadSAI2V, ReadSAI4V,
Read – Đọc thông điệp và điền kết quả trong VB SAFEARRAY
o ReadI1(), ReadI2(), ReadI4(), ReadF4(), ReadF8() - Đọc số nguyên hoặc dữ liệu floating-point từ kênh dữ liệu
o Write() – Viết dữ liệu từ SAFEARRAY tới host.
o WriteI1(), WriteI2(), WriteI4(), WriteF4(), WriteF8() - Viết dữ liệu tới bo mạch Các hàm này có chức năng như nhau trên cả PC và bo mạch.
Chú ý sau khi thao tác dữ liệu xong để tiết kiệm tài nguyên nên giải phóng các đối tượng RTDX này
'Xóa kênh đọc và ghi dữ liệu từ đối tượng RTDX đã được mở. status = rtdx.Close()
' Giải phóng tham chiếu đến đối tượng RTDX Set rtdx = Nothing
Sau khi thao tác dữ liệu xong thì tuỳ ứng dụng mà việc sẽ xử lí các dữ liệu này để được kết quả mong muốn.
Đoạn mã sau là ứng dụng nhận dữ liệu là một số nguyên một lần. Trong vòng lặp kênh được đọc và trạng thái được trả lại để kiểm tra để quyết định kết quả của việc đọc. Hàm nhận dữ liệu
Const Success = &H0 ' Method call is valid Const Failure = &H80004005 ' Method call failed Const ENoDataAvailable = &H8003001E ' No data was available.
' HoIver, more data may be ' available in the future. Const EEndOfLogFile = &H80030002 ' No data was available
' The end of the log file has ' been reached.
Sub main()
Dim rtdx As Object 'COM object Dim data As Long
Dim status As Long
'If an error occurs then go to the following function On Error GoTo Error_Handler
'Create the COM object
'Open the COM object
status = rtdx.Open("ochan", "R")
'Check the status of the open function If status <> Success Then
Debug.Print "Opening of channel ochan failed" GoTo Error_Handler
End If
Do
'Read an integer from the RTDX input channel status = rtdx.ReadI4(data)
'Check the status of the read Select Case (status)
Case Success
Debug.Print "Value " & data & " was received from the target" Case ENoDataAvailable
Case EEndOfLogFile
Debug.Print "End of log file has been detected" Case Failure
Debug.Print "ReadI4 returned failure" Exit Do
Case Else
Debug.Print "Unknown return code" Exit Do
End Select
Loop Until status = EEndOfLogFile
'close the input channel status = rtdx.Close()
'Release the reference to the RTDX COM object Set rtdx = Nothing
Exit Sub
Error_Handler:
Debug.Print "Error in COM method call" Set rtdx = Nothing
End Sub
2.7 Hệ thống điều phối vào ra Ping – Pong 2.7.1 Mô hình vào ra kiểu polling 2.7.1 Mô hình vào ra kiểu polling
Trước hết xét mô hình đơn giản nhất là polling. Trong mô hình này CPU phải tự mình thực hiện chức năng vào ra bằng cách “hỏi đáp”. CPU sẽ kiểm tra dữ liệu từ cổng I/O đã sẵn sàng chưa (trong trường hợp nó muốn đọc), nếu đã sẵn sàng, nó sẽ đọc dữ liệu từ cổng I/O đó rồi ghi vào bộ nhớ.
Hình 2.20 Mô hình vào ra kiểu polling
Về mặt phần cứng, CPU ở đây là bộ xử lý chuyên dụng DSP, cổng IO ở đây là
McBSPs. Đây là cổng được sử dụng với AIC23. Trong đó McBSP1 là cổng vào ra điều
khiển các thông số hoạt động của AIC23, còn McBSP2 là cổng dữ liệu.
Hình 2.21 Sơ đồ AIC23 và McBSP2 Bộ vi xử lý (CPU) Cổng IO Bộ nhớ 1 2 3 1 Trạng thái dữ liệu 2 Đọc dữ liệu từ cổng IO
3 Ghi dữ liệu vào bộ nhớ
Về mặt phần mềm, đó là việc sử dụng các hàm trong mô đun BSL đi kèm với DSK 6416.
Hàm trong module BSL
// Generate a 1KHz sine wave for 5 seconds for (msec = 0; msec <5000; msec++) {
for (sample = 0; sample< SINE_TABLE_SIZE; sample++) {
while (!DSK6416_AIC23_write(hCodec, sinetable[sample])); while (!DSK6416_AIC23_write(hCodec, sinetable[sample])); }
}
Hình 2.22 Hàm trong module BSL
Đây là mô hình vào ra đơn giản nhất song lại không đáp ứng được yêu cầu về thời gian thực của ứng dụng do tiêu tốn thời gian của CPU. Một mô hình vào ra có thể đáp ứng được yêu cầu thời gian thực là EDMA.
2.6.2 Mô hình vào ra EDMA
Đây là mô hình vào ra đặc thù của DSK 6416. Đó là sự kết hợp của cả phần cứng lẫn phần mềm. Về mặt phần cứng đó là bộ điều khiển EDMA. Về mặt phần mềm đó là việc điều phối giữa ngắt cứng EDMA và ngắt mềm xử lý.
Hình 2.23 Mô hình vào ra EDMA
Các tính năng chuyên dụng của bộ điều khiển EDMA là: - Đa kênh
- Truyền mã hoàn chỉnh (TCC)
- Liên kết truyền
Bộ điều khiển EDMA có thể điều khiển được nhiều kênh DMA cùng một lúc. Các thông số đặc trưng của một kênh EDMA như: Địa chỉ nguồn, địa chỉ đích, kích thước bộ đệm. Ví dụ của địa chỉ nguồn là địa chỉ của cổng McBSP2, địa chỉ đích là một con trỏ đến bộ đệm (một mảng) nào đó. Kích thước của bộ đệm là số lượng byte được vận chuyển.
Bus dữ liệu Bộ vi xử lý (CPU) Cổng IO Bộ nhớ 1 Bộ điều khiền EDMA 2 3 1 Khởi động EDMA 2 EDMA đọc dữ liệu từ IO
Hình 2.24 Tính năng đa kênh của EDMA
Khi có sự kiện một kênh EDMA hoàn thành vận chuyển dữ liệu, bộ điều khiển EDMA sẽ phát sinh một ngắt duy nhất gửi về cho CPU. Vậy làm cách nào để CPU có thể phân biệt được ngắt đó là do kênh EDMA nào hoàn thành. Đó chính là thông qua truyền mã hoàn chỉnh (TCC). Mỗi kênh EDMA khi được cấu hình sẽ được gán cho một con số được gọi là TCC. Khi có ngắt xảy ra, CPU đọc con số TCC gửi về bởi bộ điều khiển EDMA, thông qua đó nó biết được kênh nào đã hoàn thành việc vận chuyển dữ liệu.
Hình 2.25 TTC với các kênh EDMA khác nhau
Công việc điều phối giữa các tiến trình (ngắt cứng và ngắt mềm) được hỗ trợ bởi DSP/BIOS, một hệ điều hành được tích hợp với môi trường phát triển Code Composer Studio. Kênh 1(TCC1 ) Kênh 2 (TCC 2) Kênh 3 (TCC 3) CPU TCC? Đích đến - 1 (Memory) Nguồn 1 (IO port) Kênh - 1 Đích đến - 2 (Memory) Nguồn 2 (IO port) Kênh - 2 Đích đến - 3 (Memory) Nguồn 3 (IO port) Kênh - 3
2.6.3 Kỹ thuật điều phối vào ra Ping – Pong
Đây là kỹ thuật vào ra điển hình sử dụng EDMA. Đây là kỹ thuật kết hợp giữa tính năng liên kết truyền của EDMA và kỹ thuật điều phối các tiến trình (ngắt cứng và ngắt mềm).
Trong kỹ thuật này, dữ liệu được vận chuyển qua lại từ bộ mã hóa và giải mã thông qua McBSP2, một cổng nối tiếp hai chiều. Bộ điều khiển EDMA được cấu hình để lấy mỗi mẫu dữ liệu 16 bít có dấu trên McBSP2 và lưu trữ trong một bộ đệm ở trong bộ nhớ tới khi nó có thể được xử lý. Một khi nó được xử lý, nó được gửi lại ra McBSP2 đến AIC23 và phát đi. Một kênh EDMA được sử dụng để truyền dữ liệu đến AIC23 trong khi một kênh khác được sử dụng để nhận dữ liệu từ AIC23.
Kỹ thuật này sử dụng EDMA để giải phóng DSP khỏi nhiệm vụ vận chuyển dữ liệu. Khi ở mức cao mạch điều khiển EDMA lấy trực tiếp dữ liệu audio đến từ McBSP2 và đặt vào một bộ đệm dữ liệu. Nó cũng lấy dữ liệu từ một bộ đệm trong bộ nhớ và gửi nó ra McBSP2 để tạo ra tín hiệu âm thanh ra. Có nhiều kênh EDMA riêng biệt được sử dụng để phát và nhận dữ liệu liệu âm thanh.
Vì AIC23 là một bộ mã hóa và giải mã stereo nên tín hiệu đầu vào chứa cả kênh âm thanh phải và trái. Dữ liệu được nhận theo từng khung gồm 2 phần tử: một mẫu 16 bít từ kênh trái và một mẫu 16 bít tiếp sau từ kênh phải. Các khung được nhận với tốc độ là 48KHz, tốc độ lấy mẫu mặc định của DSK.
2.6.3.1 Vận hu ển ữ liệu kiểu Ping – Pong
Khi ở mức cao thì mạch điều khiển EDMA đọc tín hiệu từ McBSP và lưu nó vào bộ nhớ đệm. Dữ liệu nhận được được lưu trong hai bộ đệm logic cạnh nhau là Ping và Pong.
Nếu chỉ có một bộ đệm được dùng thì thời gian xử lý dữ liệu trên bộ đệm của DSP chỉ trong khoảng thời gian từ khi bộ đệm đầy cho đến khi mẫu tín hiệu tiếp theo được nhận.
Khi cả hai bộ đệm được dùng thì ban đầu dữ liệu đến sẽ được lưu trong bộ đệm Ping. Khi nó đầy thì dữ liệu tới sẽ được gửi tới bộ đệm Pong, trong khi đó DSP sẽ xử lí dữ liệu trong bộ đệm Ping mà không sợ nó bị ghi đè lên. Khi mà Pong đầy thì Ping Pong sẽ được cấu hình ngược lại. DSP sẽ có nhiều thời gian hơn để xử lí luồng dữ liệu nhận được và điều này sẽ giúp cho hệ thống gần với thời gian thực hơn và giúp tăng đáng kể tốc độ dòng tín hiệu đến.
Như vậy nếu tính cả phía truyền thì có tất cả là 4 bộ đệm Ping-Pong: receive PING, receive PONG, transmit PING and transmit PONG.
Int16 gBufferXmtPing[BUFFSIZE]; //Transmit Ping buffer Int16 gBufferXmtPong[BUFFSIZE]; //Transmit Pong buffer Int16 gBufferRcvPing[BUFFSIZE]; // Receive Ping buffer Int16 gBufferRcvPong[BUFFSIZE]; //Receive Pong buffer
Giới hạn của chuyển đổi DAC, ví dụ như bộ AIC23 của DSK6416 chỉ chấp nhận tốc độ dữ liệu max là 48000 mẫu trong một giây. Từ đó có thể thấy rằng tốc độ chuyển đổi DAC của bộ mã hóa và giải mã trên bo mạch là khá chậm, phải nghĩ đến hình thức truyền thông khác. Ví dụ này có ích ở chỗ cho biết cách cài đặt tham số cho một thiết bị như thế nào.
2.6.3.2 Kết nối ấu hình Ping – Pong
Một tính năng vận chuyển dữ liệu đặc biệt được gọi là mốc nối các cấu hình EDMA. Khi bộ điều khiển EDMA hoàn thành với phía PING và cần chuyển sang phía
PONG, thì các con trỏ nguồn và đích cũng cần thay đổi để trỏ tới bộ đệm mới. Khi kỹ thuật này được sử dụng thì địa chỉ mới có thể được lưu trữ trong một cấu trúc cấu hình móc nối và sẽ tự động nạp vào bộ điều khiển EDMA khi công việc (cấu hình) hiện thời hoàn thành. Việc tái cấu hình cũng có thể được thực hiện bởi DSP bằng chương trình phục vụ ngắt mềm nhưng sử dụng móc nối các cấu hình tránh khỏi yêu cầu phải điều phối