1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Các chuyên gia Keil C51 cho tui hỏi chút.

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi eHard, 18/06/2004.

  1. 0 người đang xem box này (Thành viên: 0, Khách: 0)
  1. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Các chuyên gia Keil C51 cho tui hỏi chút.

    Hi,
    Lâu nay tui thường dùng ASM để lập trình cho VĐK 89C51. Mấy hôm nay tui thử dùng Keil C để lập trình, nói chung tất cả đều êm đẹp nếu như tui không xem cái mã HEX của nó dịch ra. Về kích thước thì tui không ngán vì tui có thể xây dựng lại các hàm bằng ngôn ngữ C một cách đơn giản nhất để khỏi include các thư viện sẵn có nhằm làm giảm kích thước mã và có thể dùng cách viết tựa ASM để tối ưu kích thước mã. Nhưng tui bó tay ở chổ hệ thống của tui không có Ram ngoài mà mã dịch ra có rất nhiều lệnh MOVX (dịch ngược từ mã hex) để truy cập Ram ngoài. Thậm chí tui thiết lập device là 89C4051 nó vẫn còn lệnh MOVX. Các bác đã quen làm với Keil C có thể chỉ cho tui cách khắc phục vấn đề trên được không? Xin cảm ơn trước.
  2. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Có thể bản Keil hoặc bản dịch ngược file không tốt lắm. Chỉ cần viết 1 chương trình hello wỏld đơn giản cũng không cần phải thiết lập gì.
    Chọn device là 89c5x của Atmel, trong phần option của target chọn On-chip code.
    Mình sử dụng Keil cũng khá nhiều và chưa bao giờ dùng chương trình dịch ngược, và Keil cũng tương đối tin cậy. Chưa gặp trường hợp trên bao giờ.
  3. newbiebk

    newbiebk Thành viên mới

    Tham gia ngày:
    05/05/2004
    Bài viết:
    36
    Đã được thích:
    0
    Xin lỗi các anh vì hỏi một câu không ăn nhằm với chủ đề này , tại bởi vì em bí quá hỏi ai cũng chẳng được, nhân tiện có mấy bác eHard và opentdoors cho em hỏi mấy mấy anh xài Kiel bản full hay demo vậy, nếu anh nào có bản crack có thể share cho em được không? (Email : coder_bk@yahoo.com) . Một câu nữa là, em đang tìm tài liệu về lập trình C cho VĐK, anh nào có tài liều về vấn đề này có thể chỉ cho em được không?. Mong các cao thủ giúp đỡ. Thank
  4. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi,
    Cám ơn các bác đã trả lời. Các thiết lập thì tui cũng làm như bác opentdoors vậy đó. Nếu như bác xem trong file *lst của thư mục biên dịch thì sẽ không thấy rõ điều này mặc dù nó vẫn dịch ra mã ASM. Tuy nhiên, nếu để ý các dòng lệnh LCALL khi dùng chương trình dịch ngược thì đều có lệnh MOVX chẳng hạn MOVX A,@DPTR đây chính là lệnh truy xuất ram ngoài. Còn trình dịch ngược thì không thể nào sai được bởi vì đây là trình mô phỏng cho họ 8051.
    Nếu viết chương trình Hello thì đơn giản quá và không thấy được điều trên. Bác thử viết một đoạn chương trình để so sánh 2 chuỗi thử xem. Khi biên dịch chắc chắn sẽ có khá nhiều lệnh MOVX. Nếu vậy thì không thể sử dụng cho hệ thống không có ram ngoài rồi.
    Bác nói rằng nó chạy khá tốt thế thì cái hệ thống của bác có Ram ngoài không? Nếu có ram ngoài thì nó chạy tốt là phải rồi.
    To newbiebk: Bác vào trang web của Tula để lấy bản có crack.
  5. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Xin lỗi chứ họ 8051 mình sử dụng bằng Keil C lẫn asm của Rigel từ cách đây 3 năm rồi. Mình viết rất nhiều cho con 2051, 8951 (không có RAM ngoài), hiện nay các con đấy vẫn chạy bình thường.
    Còn lý do tại sao lại xuất hiện movx thì mình chả bao giờ gặp.
    Còn hệ thống của mình á? Mình chỉ có duy nhất 1 hệ thống là mạch evb với 32K Ram tại địa chỉ từ 8000->FFFF, và 1 chương trình monitor gần giống với Paulmon do mình tự viết thôi.
    Việc gì mà phải viết so sánh 2 chuỗi, mình sử dụng strcmp hoặc strncmp trong thư viện string.h của Keil C, chạy trên mạch EVB từ địa chỉ 8000 ấy( very good)
  6. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Nói chung , phần cứng có hay không có RAM ngoài của 8051/31 là chuẩn de-factor rồi, do đó quan trong là các phần mềm điều khiển ghi đọc tại các cổng của nó.
    Bản thân Keil C cũng dựa trên 1 mã asm, bạn có thể đọc các file *.a51 trong thư mục c51lib. Mình ít khi dùng các cửa sổ config của win mà dựa trên các mã asm đó.
    Cậu cần chú ý cái này nữa, trong Keil C nếu có biến nào đó được khai báo thuộc lớp xdata thì nghĩa là biến đó nằm trên RAM ngoài, còn lớp idata là thuộc RAM nội, về định nghĩa target cậu phải chú ý đến các thông số của target.
    Cậu là dân Đà nẵng phải không? Đi đâu cũng không đổi (hay tinh tướng)
    Cậu phải chú ý thêm cái này, để test 1 chương trình, cậu cần phải nạp và chạy thử. Và nếu cậu là dân pro trong lĩnh vực này, cậu phải xây dựng cho mình các chương trình debug phần cứng, xa hơn thì cậu làm 1 cái mạch evalution (C51EVB) như của kswitchit, cái đó giúp cậu bớt băn khoăn những vấn đề đại loại như thế này.
    Được opentdoors sửa chữa / chuyển vào 00:15 ngày 19/06/2004
  7. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Không phải là tinh tướng đâu, chẳng qua tui muốn chắc cú thôi.
    Bởi vì nhìn thấy cái mã như thế nên tui chưa nạp để chạy thử, nó có lệnh di chuyển dữ liệu vào/ra ram ngoài mà phần cứng của mình không có thì làm sao mà chạy đúng được nên tui mới không thử nạp.
    Lệnh so sánh chuỗi thì tất nhiên là dùng hàm sẵn có đó rồi và khi dùng cái thư viện đó, kích thước mới khổng lồ lên và mới phát hiện ra cái lệnh MOVX trong mã asm của nó.
    Được rồi, tui sẽ viết một chương trình chạy thử để xem sao, kết quả thế nào tui sẽ thông báo sau.
    Rất cám ơn sự quan tâm chỉ giáo của bác.
  8. TuLa

    TuLa Thành viên quen thuộc

    Tham gia ngày:
    24/10/2002
    Bài viết:
    413
    Đã được thích:
    0
    Vấn đề của bác có thể là do "đặt tuỳ chọn chế độ bộ nhớ cho Target".
    Theo tớ nghĩ thì bạn đã đặt chế độ bộ nhớ là Compact hoặc Large trong khi bạn không dùng RAM ngoài. Bạn hãy đặt lại Option này: Project -> Options For Target ''Tên_Target_Của_Bạn'' -> Memory model: Small: variables in DATA
    Sau khi đặt lại Option này, bạn Compile lại Target thì sẽ thấy ngay kô còn các lệnh MOVX trong file ASM tương ứng nữa.
    Để kiểm nghiệm điều trên, bạn có thể mở một Project nào đó trong các chương trình Sample của Keil,
    Ví dụ mở Project "C:KeilC51EXAMPLECSAMPLECSAMPLE.UV2", sau đó compile và mở phần mã ASM tương ứng sau khi biên dịch ra (VD file CSAMPLE1.LST) sẽ thấy không có một lệnh MOVX nào (vì nó đang ở chế độ SMALL), sau đó chuyển OPTION chế độ bộ nhớ sang COMPACT hoặc LARGE và Compile lại thì ta sẽ thấy trong mã lệnh ASM được tạo ra tương ứng có rất nhiều lệnh MOVX.
    OK ?
  9. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi,
    Cám ơn bác Tula đã trả lời, tuy nhiên nếu nhìn trong cái file list do trình biên dịch tạo ra thì cũng không thấy được lệnh MOVX trong mã ASM của nó nhưng với file ASM đó mà kích thước file HEX lên đến 2Kb thì thật là khác thường, mà bác phải lấy cái file HEX của nó dịch ngược ra thì mới thấy được nó có khá nhiều lệnh MOVX. Đây là cái mà tui thấy cũng rất vô lý. Bác coi lại chổ này nghe.
    Các Option biên dịch cho Target thì lui tới cũng chỉ có thế thôi.
    Thân ái.
  10. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    File .hex là file ascii chứ không phải là file binary nên kích thước của nó không phải là kích thước chương trình. Để nạp vào Flash, các mã trong file hex phải dịch sang mã nhị phân.
    Tốt nhất là bạn post chương trình của bạn lên. Mình không hiểu sao lại có lỗi này.

Chia sẻ trang này