PDA

View Full Version : bác fall cho em hỏi tý về CCSC tại sao lại "Out of ROM" sớm thế?


MoH
08-07-2006, 05:22 PM
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
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)


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.

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?