Thông báo

Collapse
No announcement yet.

[Help] Tính toán lượng RAM cần dùng

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Để biết một cách tương đối chương trình của mình cần bao nhiêu RAM. Tốt nhất nên vẽ ra lưu đồ thuật toán, định hình từng phần một dự định khoảng bao nhiêu biến, biến nào là toàn cục, biến nào là cục bộ (biến tạm thời). rồi cộng lại xem tổng hết khoảng bao nhiêu biến.(Phần này cần phải làm trước khi bắt đầu thiết kế phần cứng) Chú ý biến kiểu char là 1byte, kiểu int = 2byte, kiểu long = 4 byte, float = 4byte.
    - Biến toàn cục là biến sẽ tồn tại trong suốt cả chương trình. Tại bất kỳ đâu bạn có thể gọi nó.
    - Biến cục bộ là biến chỉ tồn tại trong một hàm hay function và cũng chỉ có tác dụng trong fuction hay hàm này thôi. Khi hàm được gọi sẽ cấp phát một vùng ram cho biến này. Khi thoát khỏi hàm hoặc fuction nó sẽ giải phóng phần ram này. các hàm khác ngoài hàm này không sử dụng được các biến cục bộ của hàm kia.

    Ram ngoài được dùng khi Ram nội không còn đủ dùng nữa. Lúc đó phải khai báo biến theo kiểu ram ngoài. Tất nhiên phải dùng thêm ram ngoài gắn vào chip. Ví dụ: unsigned int couter=0 @0x000A; lúc này biến counter được lưu trên RAM ngoài tại địa chỉ 0x000A. Còn cách khai báo ram ngoài thì trình Winzard của codevision có rồi đó ( chú ý một số chip AVR không hỗ trợ ram ngoài).
    Last edited by minhhieu; 30-08-2009, 16:42.
    n
    ĐT: 0986 492 489

    Tham khảo:

    Comment


    • #17
      Nếu như bác minhhieu nói thì với 4KB RAM nội của em ât64 cũng khá thỏa mái , 4KB có thể khai báo đc khá nhiều , cái chính em ko hiểu lắm về cơ chế xử lý dữ liệu , ngoài các biến khai báo , stack VĐK còn sử dụng RAM vào việc gì ko ? Và nếu xử dụng thì có ảnh hưởng nhiều đến lưu lượng RAM ko ?

      Comment


      • #18
        Nguyên văn bởi dt_love Xem bài viết
        hình như 2 dòng đó chưa thể hiện đầy đủ thông tin về lượng ram sử dụng trong ctrinh đâu bạn ah

        Tôi không quen xài winavr nên không nói tới, chứ thực ra trình dịch nào cũng tổng kết cho các bác lượng ram được dùng hết. C30 của microchip còn nêu chi tiết hơn đến % RAM cần dùng, số lượng RAM tối đa có thể cần...

        Riêng về codevision, RAM phân bố thành ba vùng data stack, global variable và hardware stack. Các biến đơn lẻ được cho vào data stack còn các mảng lớn sẽ cho vào global variable. Bác thử tạo một mảng 500 phần tử thử xem có đúng global vaỉable là 500 không. Tạo luôn 1000 phần tử thì máy báo lỗi (atmega8)
        Vậy cho nên không thể xài hết RAM như mong muốn (RAM 1k nhưng không thể tạo mảng 1024 phần tử)
        Last edited by Katecka; 30-08-2009, 17:37.
        Đã bỏ nghề về quê chăn gà...

        Comment


        • #19
          Nguyên văn bởi Katecka Xem bài viết
          Riêng về codevision, RAM phân bố thành ba vùng data stack, global variable và hardware stack.
          cái này thì bác nói đúng, tuy nhiên trong hình bác mới chỉ khoanh có một vùng thôi, thiếu 2 vùng còn lại.
          Các biến đơn lẻ được cho vào data stack còn các mảng lớn sẽ cho vào global variable.
          cái này thì bác hoàn toàn sai.

          data stack: vùng ram động, dùng cho các chương trình con. tất cả các biến cục bộ đều sử dụng vùng ram này, vào đầu ctrinh con nó chiếm dụng ram và kết thúc ctrinh con thì nó giải phóng và trả vùng ram đó lại để sử dụng cho các ctr con khác. dung lượng vùng này được khai báo bằng cách vào project-->configure...
          nếu ctr con dùng quá nhiều ram, ram trong này ko đủ thì khi build sẽ hiện lên khung cảnh báo.

          global vaỉable: vùng ram tĩnh, tất cả các biến toàn cục đều được khai báo trong vùng này,từ biến nhỏ lẻ đến các mảng lớn đều như nhau, miễn nó là biến toàn cục, hoặc là biến tĩnh cục bộ trong ctr con (ko biết gọi nó vậy có đúng tên ko, mà biến này dc kbao dạng static).

          còn những kiểu biến chưa sử dụng đến thì.. ko biết nó lưu ở đâu.

          hardware stack: vùng ram dùng cho phần cứng, cho các lệnh push pop.. và các data mà phần cứng xài đến ko nhớ hết

          thực tế thì global variable và hardware stack cùng sử dụng một vùng ram. global dùng bắt đầu từ đầu vùng, tăng lên và hardware sử dụng từ cuối vùng ram trở về.
          Bác thử tạo một mảng 500 phần tử thử xem có đúng global vaỉable là 500 không. Tạo luôn 1000 phần tử thì máy báo lỗi (atmega8)
          Vậy cho nên không thể xài hết RAM như mong muốn (RAM 1k nhưng không thể tạo mảng 1024 phần tử)
          ram 1k thì ko thể xài hết 1k, vì bạn còn phải chừa ram để lưu lại dữ liệu khi nó nhảy vào ctr con nữa chứ (hardware stack)...

          có thiếu sót j thì mấy đại ca chỉ giáo, bổ sung thêm.

          Comment


          • #20
            Nguyên văn bởi dt_love Xem bài viết
            cái này thì bác nói đúng, tuy nhiên trong hình bác mới chỉ khoanh có một vùng thôi, thiếu 2 vùng còn lại.

            cái này thì bác hoàn toàn sai.

            data stack: vùng ram động, dùng cho các chương trình con. tất cả các biến cục bộ đều sử dụng vùng ram này, vào đầu ctrinh con nó chiếm dụng ram và kết thúc ctrinh con thì nó giải phóng và trả vùng ram đó lại để sử dụng cho các ctr con khác. dung lượng vùng này được khai báo bằng cách vào project-->configure...
            nếu ctr con dùng quá nhiều ram, ram trong này ko đủ thì khi build sẽ hiện lên khung cảnh báo.

            global vaỉable: vùng ram tĩnh, tất cả các biến toàn cục đều được khai báo trong vùng này,từ biến nhỏ lẻ đến các mảng lớn đều như nhau, miễn nó là biến toàn cục, hoặc là biến tĩnh cục bộ trong ctr con (ko biết gọi nó vậy có đúng tên ko, mà biến này dc kbao dạng static).

            còn những kiểu biến chưa sử dụng đến thì.. ko biết nó lưu ở đâu.

            hardware stack: vùng ram dùng cho phần cứng, cho các lệnh push pop.. và các data mà phần cứng xài đến ko nhớ hết

            thực tế thì global variable và hardware stack cùng sử dụng một vùng ram. global dùng bắt đầu từ đầu vùng, tăng lên và hardware sử dụng từ cuối vùng ram trở về.

            ram 1k thì ko thể xài hết 1k, vì bạn còn phải chừa ram để lưu lại dữ liệu khi nó nhảy vào ctr con nữa chứ (hardware stack)...

            có thiếu sót j thì mấy đại ca chỉ giáo, bổ sung thêm.
            Sorry nhầm,
            các biến đơn lẻ nếu đủ chỗ thì được lưu thẳng vào các thanh ghi, sau khi dịch xong vào mục Code Information sẽ thấy biến nào được lưu ở đâu. Trước giờ tôi cứ gộp chung cả đám vùng nhớ bên dưới vô cái data stack

            Túm lại là với bộ nhớ chừng đó, chương trình đó, dịch xong thấy không báo lỗi còn dư ram cho hardware stack là được. Chuyện khác tính sau
            Đã bỏ nghề về quê chăn gà...

            Comment


            • #21
              Nguyên văn bởi minhhieu Xem bài viết
              Để biết một cách tương đối chương trình của mình cần bao nhiêu RAM. Tốt nhất nên vẽ ra lưu đồ thuật toán, định hình từng phần một dự định khoảng bao nhiêu biến, biến nào là toàn cục, biến nào là cục bộ (biến tạm thời). rồi cộng lại xem tổng hết khoảng bao nhiêu biến.(Phần này cần phải làm trước khi bắt đầu thiết kế phần cứng) Chú ý biến kiểu char là 1byte, kiểu int = 2byte, kiểu long = 4 byte, float = 4byte.
              - Biến toàn cục là biến sẽ tồn tại trong suốt cả chương trình. Tại bất kỳ đâu bạn có thể gọi nó.
              - Biến cục bộ là biến chỉ tồn tại trong một hàm hay function và cũng chỉ có tác dụng trong fuction hay hàm này thôi. Khi hàm được gọi sẽ cấp phát một vùng ram cho biến này. Khi thoát khỏi hàm hoặc fuction nó sẽ giải phóng phần ram này. các hàm khác ngoài hàm này không sử dụng được các biến cục bộ của hàm kia.

              Ram ngoài được dùng khi Ram nội không còn đủ dùng nữa. Lúc đó phải khai báo biến theo kiểu ram ngoài. Tất nhiên phải dùng thêm ram ngoài gắn vào chip. Ví dụ: unsigned int couter=0 @0x000A; lúc này biến counter được lưu trên RAM ngoài tại địa chỉ 0x000A. Còn cách khai báo ram ngoài thì trình Winzard của codevision có rồi đó ( chú ý một số chip AVR không hỗ trợ ram ngoài).
              bữa nay bác minhhieu làm j mà gõ nhầm rồi..
              khi khai báo biến vào ram tại địa chỉ A thì hình như là CV ko cho gán trị số trc đâu:
              int counter=0 @0x000A;
              nếu khai báo vậy thì mấy thằng CV mà trước jo mình xài thì nó toàn báo lỗi. ko biết bản CV của bạn mh thế nào hỉ.
              mà phải khai báo thế này:

              int counter @0x000A;

              mà khi sử dụng ram ngoài cũng ko nhất thiết phải định địa chỉ cho biến vậy đâu. bạn chỉ việc khai báo trong Winzard là có sử dụng ram ngoài, lúc đó chỉ việc sử dụng thôi. khi nào đến địa chỉ mà ram nội ko tồn tại thì.. phần cứng tự động chuyển ra ram ngoại. chi tiết thì đọc trong datasheet của mega64.

              ko biết vài dòng góp ý với bác minhhieu có j sai sót ko hỉ...

              Comment


              • #22
                Nguyên văn bởi dt_love Xem bài viết
                bữa nay bác minhhieu làm j mà gõ nhầm rồi..
                khi khai báo biến vào ram tại địa chỉ A thì hình như là CV ko cho gán trị số trc đâu:
                int counter=0 @0x000A;
                nếu khai báo vậy thì mấy thằng CV mà trước jo mình xài thì nó toàn báo lỗi. ko biết bản CV của bạn mh thế nào hỉ.
                mà phải khai báo thế này:

                int counter @0x000A;

                mà khi sử dụng ram ngoài cũng ko nhất thiết phải định địa chỉ cho biến vậy đâu. bạn chỉ việc khai báo trong Winzard là có sử dụng ram ngoài, lúc đó chỉ việc sử dụng thôi. khi nào đến địa chỉ mà ram nội ko tồn tại thì.. phần cứng tự động chuyển ra ram ngoại. chi tiết thì đọc trong datasheet của mega64.

                ko biết vài dòng góp ý với bác minhhieu có j sai sót ko hỉ...
                Cảm ơn bạn dt_love đã góp ý kiến. đúng vậy, mình không để ý chỗ khai báo ram int counter=0 @0x000A; phải viết lại là int count @0x000A; lúc này biến count được lưu tại địa chỉ 0x000A và 0x000B; còn việc có cần phải khai báo thêm @0x0000..... thì không cần thiết. Mình viết ra ở đây để các bạn mới làm quen hình dung ra được nó lưu ở đâu thôi. Phần khai báo ram ngoài có thể tham khảo thêm trong phần Help của codevision.
                n
                ĐT: 0986 492 489

                Tham khảo:

                Comment


                • #23
                  Mấy cái Data stack, Global Variables, Hardware Stack và cả Heap nữa thì các bạn cứ mở Help trong CVAVR ra là có hết mà!
                  Thật ra, AVR nó không phân biệt RAM trong RAM ngoài như 8051 đâu, dùng hết IRAM thì sang XRAM thôi. Một điều đáng lưu ý là SP ban đầu được đặt ở đáy của vùng Hard Stack (nếu có XRAM, vùng này sẽ thường nằm ở XRAM); do đó nếu viết mã không kĩ thì có thể SP sẽ hết đường trở về.
                  !e

                  Comment


                  • #24
                    với 4KB RAM mà viết chương trình nhỏ nhỏ thì làm sao hết được trời. bác nói toẹt ra cho mọi người biết bác định thiết kế cái gì rồi mọi người góp ý luôn.
                    mình làm mạch phát nhạc dùng MMC mà RAM chỉ có 1KB vẫn tốt màh. RAM nhiều nhưng nếu công việc CPU gánh nhiều quá thì có đảm bảo chạy realtime được không chứ.

                    Comment


                    • #25
                      Kiến thức các bác chia sẻ thật thú vị , hi vọng sẽ đc học hỏi nhiều , xin cám ơn

                      Comment

                      Về tác giả

                      Collapse

                      dnk0904 Tìm hiểu thêm về dnk0904

                      Bài viết mới nhất

                      Collapse

                      Đang tải...
                      X