View Single Post
Old 28-12-2008, 06:05 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi binhlt View Post
Tôi đang viết một chương trình khá phức tạp trên dsPic30F3013 (24K Flash, 2k RAM) hiện nay vì mã lệnh đã khá lớn và thời gian tính toán chưa đạt được mức cho phép nên cần phải tối ưu nhiều từ đó xuất hiện vài vấn đề cần hỏi mong các bạn đã có kinh nghiệm chỉ bảo thêm:

1: Giả sử tôi có 1 chương trình rất đơn giản như sau:

const char B[]={0,1,2,3,4,5,6,7,8,9};
short k;

int main(void)
{
while (1)
{
k++;
}
}
như bạn thấy mảng B chỉ 10 byte nhưng khi kiểm tra lại tôi thấy mảng B chiếm 5 intructions tức là mất 5*3 = 15 byte. Từ đó có thể thấy rằng nếu lưu mảng vào trong bộ nhớ chương trình thì bỏ phí mất 1/3 dung lượng.
Vậy câu hỏi là có cách nào lưu trữ mảng vào bộ nhớ mà không để phí không?

2: Chương trình hiện tại tôi viết hiện đã chiếm 1998 byte RAM như vậy lượng RAM trống còn lại rất ít. Câu hỏi ở đây là lượng RAM đo bằng chương trình đó có thể tin cậy 100% không? Liệu khi chạy thực tế có thể bị tràn bộ nhớ không?

3: Trong chương trình có nhiều đoạn dùng hàm sin, cos, tan, atan, sqrt, các phép nhân, chia các số 32bit. Nếu sử dụng các hàm sin, cos, tan, atan của C thì tốc độ rất chậm, phép chia cho số 16bit thì có các hàm __builtin_ đã rất hay nhưng chia cho các số 32 bit thì phải dùng mẹo để chuyển về 16 bit nhưng thời gian không khá hơn nhiều. Để tăng tốc tôi đã phải viết khá nhiều hàm sử dụng bảng tra nhưng vẫn chưa ưng ý lắm rất mong các bạn đưa lên diễn đàn nhiều thuật toán hay để làm giảm thời gian tính toán. Như vậy cần các thuật toán nhanh (dùng nội suy kết hợp bảng tra) cho các hàm hay dùng như:
- thuật toán cho hàm sin, cos, tan, atan
- thuật toán cho hàm sqrt
Đối với dsPic còn có các hàm Q15, Q16 nhưng giá trị vào bị bó hẹp trong khoảng -1 đến 0.999 có cách nào để dùng các hàm Q15, Q16 cho các giá trị bình thường không?

4: Cuối cùng trong quá trình sử dụng tôi thấy quyển sách "Hackers Delight" có nhiều phương pháp nhằm tăng tốc rất hay xin được giới thiệu với các bạn trang chủ của nó đây http://www.hackersdelight.org/
1. Tôi cho rằng bạn có thể dùng các lệnh về bảng (TBLRDH, TBLRDL, TBLWTH, TBLWTL). Tham khảo các hàm built-in của MPLAB C Compiler for dsPIC DSCs, nếu bạn đang dùng trình biên dịch này. Tôi chưa từng có nhu cầu sử dụng cả 3 byte của 1 từ nhớ chương trình, nên chưa từng thử dùng những hàm này.

2. Tôi cho rằng trình biên dịch rất đáng tin cậy trong việc xác định dung lượng RAM đã được sử dụng.

3. Bạn đã dùng thư viện mới nhất (phiên bản mới nhất) của trình biên dịch chưa? Việc tối ưu các hàm thư viện nên dành cho nhà phát triển trình biên dịch, chứ không nên là công việc của người sử dụng. Bạn đã tham khảo www.piclist.com về những thủ thuật hiện thực các hàm siêu việt chưa?

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn