PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   bác fall cho em hỏi tý về CCSC tại sao lại "Out of ROM" sớm thế? (http://www.picvietnam.com/forum/showthread.php?t=523)

MoH 08-07-2006 05:22 PM

bác fall cho em hỏi tý về CCSC tại sao lại "Out of ROM" sớm thế?
 
Em đang dùng bản CCSC 3.227.
Chương trình em viết chỉ khoảng 1000 dòng. Và bình thường dịch nó chỉ báo là chiến 54% ROM và 48%RAM, nhưng khi em khai báo thêm vài biến int16 thì nó lại báo là "Out of ROM, a segment or the program is too large @MUL1616"?

falleaf 08-07-2006 08:45 PM

Em phải xem lại rằng, trong quá trình sử dụng, biến đó em có thao tác gì nhiều với nó không, và nếu muốn hỏi về source, thì em nên post toàn bộ source lên mạng, nếu không không ai có thể kiểm tra hoặc giúp em.

Chúc vui

MoH 11-07-2006 10:30 AM

Vì một vài lý do nên em không thể up code lên được.
Nhưng em nhận thấy 1 điều rằng, nếu chỉ có viết code mà không có lệnh printf thì không sao, nhưng nếu có lệnh printf thì đến khoảng 60% của ROM thì nó sẽ báo là Out of ROM.==> Nên rất khó debug chương trình.

falleaf 11-07-2006 12:46 PM

Nếu không tiện gửi chương trình, cách duy nhất em phải tự làm, đó là mở ASM của chương trình ra kiểm tra lại, xem chỗ nào em viết, nó dịch ra sao. Nếu nó dịch sai, cần phải đổi lại cấu trúc chương trình, em thử cài các phiên bản mới vào và dịch thử, xem nó như thế nào.

Chúc vui

MoH 05-08-2006 05:15 PM

giờ chương trình của em đã lên đến 80% ROM rồi, do không dùng nhiều lênh printf. hic hic ==> Khó debug quá!
Không biết thằng CCSC này nó dịch kiểu gì mà ROM chương trình của 877A là 14K mà lại nhanh hết kinh khủng.
So với chương trình tương đương viết cho 8051 thì của 877A chiếm nhiều tài nguyên hơn rất nhiều lần (dùng AT89C52 thì viết thoải mái trong khi ROM có 8K còn 877A với mức độ ROM là 85% thì không thể khai báo thêm 1 biến int16).

bien_van_khat 05-08-2006 11:45 PM

Trích:

Nguyên văn bởi MoH
giờ chương trình của em đã lên đến 80% ROM rồi, do không dùng nhiều lênh printf. hic hic ==> Khó debug quá!

Chỉ cần gọi 1 lần, là nó đã dịch hàm printf vô chương trình rồi, các lần sau chỉ là lệnh gọi hàm, nếu muốn tiết kiệm thì bạn đừng gọi. Hàm printf của thằng CCS khá là nhỏ cơ mà, nhỏ hơn nhiều so với KEIL C (so sánh khập khiễng)

Trích:

Không biết thằng CCSC này nó dịch kiểu gì mà ROM chương trình của 877A là 14K mà lại nhanh hết kinh khủng.
Chỉ có 8K word, tính theo byte ko có ý nghĩa vì opcode dài 14bit.
Trích:

So với chương trình tương đương viết cho 8051 thì của 877A chiếm nhiều tài nguyên hơn rất nhiều lần (dùng AT89C52 thì viết thoải mái trong khi ROM có 8K còn 877A với mức độ ROM là 85% thì không thể khai báo thêm 1 biến int16).
biến thì được đặt trong ram, ko liên quan gì đến rom, có thể chương trình của bạn xài quá nhiều mảng có kích thước lớn, nên CCS C ko cho khai báo thêm biến.

hpecom 07-08-2006 09:40 AM

Nếu bạn thực hiện các lệnh so sánh trên số thực thì dung lương chương trình tăng rất nhanh. Nếu có thể được thì nên khai báo các biến vừa sát với tầm sử dụng, như thế vừa tiết kiệm RAM vừa tiết kiệm ROM. Nên hạn chế dùng biến số thực.

MoH 07-08-2006 03:08 PM

Mình cũng rất để ý đên chuyện khai báo các biến sát với tầm sử dụng. Nhưng do yêu cầu của bài toàn cần tương đối nhiều biến. Có thể mình phải tìm 1 loại PIC mới có dung lượng lớn hơn vậy. Ai có ý kiến nên sử dụng loại PIC nào cho hợp lý không cho em tham khảo với.

bien_van_khat 08-08-2006 09:35 AM

Có lẽ bạn dùng printf để xuất lên máy tính để debug? Theo tôi, bạn có thể dùng ICD2 tiện lợi hơn nhiều, tất nhiên chi phí bỏ ra cũng ko nhỏ.

Bạn ko thể upload code của bạn, nhưng để mọi người dễ đoán, bạn có thể đưa thêm thông tin về chương trình của bạn. Ví dụ, bao nhiêu biến kiểu gì, thực hiện giải thuật gì, sử dụng những phép toán số học nào ....

Nếu bạn thực sự cần pic nhiều RAM hơn thì chỉ còn cách chuyển sang PIC18, VD 18F458, 1536 byte RAM, 16K Word. Tôi nghĩ con này đủ cho bạn xài, vì tui đã viết chương trình trong đó sử dụng thoải mái các phép nhân chia số thực dấu chấm động + 1 bảng dữ liệu trong ROM gần 1K Word với C18.

linhnc308 09-08-2006 02:44 AM

Vấn đề bạn MoH hỏi mình có thể giúp đc.
Mỗi con PIC có RAM chia làm các bank RAM khác nhau, con 877A có 4 bank, mỗi bank đều có các vị trí RAM Free để bạn khi dùng CCS thì chương trình sẽ khai báo tương ứng vào đó, khi dịch nếu bạn dùng tính năng xem phân bổ bộ nhớ RAM cho PIC thì bạn sẽ thấy các biến tương ứng với các vị trí nào trong RAM.
Có 1 điều củ chuối trong CCS là vơi PIC 16F tức dòng 14bit thì CCS nó chỉ dùng RAM trên Bank0 để khai báo, nếu hết nó sẽ báo lỗi mặc dù các bank khác chưa đụng tới.Khắc phục lỗi này bạn có thể xem help dùng #locate để định lại vi trí biến trong RAM
VD
int16 bien_16_bit;
#locate bien_16_bit = 0x110 // Vi tri RAM Bank 2
Xem thêm trong Help của CCS

txt 11-08-2006 10:19 AM

Bạn chưa đọc kỹ CCS tiếng Việt . Hãy khai báo #device = *16 , thì sẽ dùng trọn 768 byte RAM và khai báo mảng hằng số trên 256 byte ROM . Còn PIC 18 thì *=16 là mặc định nên dùng hết RAM được .Nhưng nếu thử *=8 thì chỉ dùng tối đa 256 byte RAM và khai báo mảng hằng số tối đa 256 byte ROM , nếu khai báo hơn nó sẽ báo lỗi ( có thể là out of RAM chăng ?).Khà khà !!!

MoH 17-08-2006 03:01 PM

Cam on bac linhnc308 va txt da chi bao, dung la em chua doc ky tai lieu ve CCSC, sau khi dung khai bao #device *= 16 thi RAM giam xuong rat nhieu.

txt 20-10-2006 11:31 AM

MoH:
lỗi " out of ROM , segment too large " được mô tả chi tiết trong danh mục các loại lỗi trong HELP của CCS. Đây là do viết hàm dài quá 1 trang 512 byte từ lệnh hoặc do các hàm inline gọi nhau vượt quá dung lượng trên . Không rõ là do cấu trúc phần cứng hay phần mềm?


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam