Thông báo

Collapse
No announcement yet.

giải thích về vòng lặp for

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

  • #16
    Nguyên văn bởi Acxen_lupine Xem bài viết
    Các bài trả lời của mình trong mục này không chỉ để giúp bạn L.N.M, mình thấy các bạn (cả bạn dinhnam123) cũng chưa hiểu rõ về các ngôn ngữ lập trình.
    Ngôn ngữ C (là ngôn ngữ bậc cao - ngôn ngữ lập trình có cấu trúc) 1 lệnh của nó không tương đương với 1 lệnh máy thường là nhiều hơn, ít nhất là bằng.
    Khác với ngôn ngữ ASEMBLY (lập trình bậc thấp) mỗi lệnh chương trình ASM tương đương với 1 lệnh máy. Mỗi lệnh máy thực hiện hết bao lâu tùy thuộc vào VXL và tần số thạch anh
    Ngoài ra vòng lặp for(...;...;...) không phải là một lệnh mà là một cấu trúc khi dịch ra lệnh máy nó là một đoạn lệnh chứ không phải một lệnh.
    Còn dùng Timer để định thời hay đo đếm thì là nghề của mình rồi...
    hay đó bạn, nếu bạn hiểu compiler dùng C thì nó cũng chuyển sang lệnh dùng asm mà thôi.
    thực ra nếu không làm gì? trong asm là NOP;
    nếu bạn thực sự hiểu bản chất của C và liên kết với asm thì bạn sẽ hiểu.
    Click image for larger version

Name:	c asm.gif
Views:	1
Size:	5.2 KB
ID:	1372533
    |

    Comment


    • #17
      Nguyên văn bởi dinhnam123 Xem bài viết
      hay đó bạn, nếu bạn hiểu compiler dùng C thì nó cũng chuyển sang lệnh dùng asm mà thôi.
      thực ra nếu không làm gì? trong asm là NOP;
      nếu bạn thực sự hiểu bản chất của C và liên kết với asm thì bạn sẽ hiểu.
      [ATTACH=CONFIG]58971[/ATTACH]
      Bản chất của C cơ á??? Mình chịu thôi... Nhưng có vài vấn đề mình nghĩ bạn cần nghiêm túc xem lại:
      - Không làm gì trong ASM đúng là NOP, CPU chỉ ngồi chơi khi gặp lệnh này (Hình như nó ngồi chơi trong 1 hay 2 chu kỳ máy gì đó... lâu quá mình quên rồi). Nhưng lệnh không làm gì không có lệnh gì là hai khái niệm hoàn toàn khác nhau.
      - Bạn đã xem một Compiler dịch 1 đoạn C ra ASM và lệnh máy chưa?... Hãy xem mấy hình đính kèm nhé (Đấy là hình chụp sau khi Keil dịch đấy)
      - Cái hình bạn vẽ đủ các khối nhưng có vẻ mấy đường nối chưa đúng lắm đâu...
      Attached Files
      Hôm nay trời nắng chang chang.
      Mèo con đi học chẳng mang thứ gì.
      Chỉ mang một cái bút chì.
      Và mang một mẩu bánh mì con con.

      Comment


      • #18
        Nguyên văn bởi Acxen_lupine Xem bài viết
        Bản chất của C cơ á??? Mình chịu thôi... Nhưng có vài vấn đề mình nghĩ bạn cần nghiêm túc xem lại:
        - Không làm gì trong ASM đúng là NOP, CPU chỉ ngồi chơi khi gặp lệnh này (Hình như nó ngồi chơi trong 1 hay 2 chu kỳ máy gì đó... lâu quá mình quên rồi). Nhưng lệnh không làm gì không có lệnh gì là hai khái niệm hoàn toàn khác nhau.
        - Bạn đã xem một Compiler dịch 1 đoạn C ra ASM và lệnh máy chưa?... Hãy xem mấy hình đính kèm nhé (Đấy là hình chụp sau khi Keil dịch đấy)
        - Cái hình bạn vẽ đủ các khối nhưng có vẻ mấy đường nối chưa đúng lắm đâu...
        Tóm lại là nếu bây giờ không dùng RTOS, bạn thử làm 1 việc là nhấp nháy led trong lúc delay cho mjh xem vơi!
        không bản cãi về mấy cái ảnh kia và ai cũng biết là int, long khi chuyển sang asm là như thế , bạn thử xem 2 đoạn code 1 đoạn dung long ms; 1 đoạn dung int ms. rồi tạo trễ 100ms, bạn thử chỉ xem nao? xem có cách tính toan nào khác k? . về 1 vấn đề tạo trễ như thế này tất cả chỉ là tương đối thôi. còn nếu chính xác và sai số vài chu kỳ máy thì là vấn đề khác.
        tôi nghĩ chúng ta không nên tranh cãi 1 vấn đề đơn giản này nữa! vì nó không có gì để bàn luận thêm ngoài mụch đích của chủ thớt!
        |

        Comment


        • #19
          Nguyên văn bởi dinhnam123 Xem bài viết
          Tóm lại là nếu bây giờ không dùng RTOS, bạn thử làm 1 việc là nhấp nháy led trong lúc delay cho mjh xem vơi!
          không bản cãi về mấy cái ảnh kia và ai cũng biết là int, long khi chuyển sang asm là như thế , bạn thử xem 2 đoạn code 1 đoạn dung long ms; 1 đoạn dung int ms. rồi tạo trễ 100ms, bạn thử chỉ xem nao? xem có cách tính toan nào khác k? . về 1 vấn đề tạo trễ như thế này tất cả chỉ là tương đối thôi. còn nếu chính xác và sai số vài chu kỳ máy thì là vấn đề khác.
          tôi nghĩ chúng ta không nên tranh cãi 1 vấn đề đơn giản này nữa! vì nó không có gì để bàn luận thêm ngoài mụch đích của chủ thớt!
          Hiển nhiên tôi đã thử bằng máy hiện sóng hẳn hoi mới dám phát biểu.
          Ở mấy cái ảnh tôi post, vấn đề không phải sai khác vài us (giữa biến kiểu này hay kiểu khác) vì nó được nhân lên 120 lần đấy... Sẽ khác nhau nhiều lắm..
          Vấn đề ở chỗ tôi thấy các bạn sai khi nghĩ for(j=0;j<120;j++){} tương đương 120us... Nó tương đương 500us nếu j là 1 byte, và tương đương 1000 us nếu j là 2 byte <tấc nhiên trong điều kiện Trình dich là Keil, MCU là họ 8051, và thạch anh là 12MHz>
          Chủ thớt chắc không quan tâm được đâu... Hy vọng có thể giúp bạn phần nhỏ nào đó
          Last edited by Acxen_lupine; 13-01-2013, 17:58. Lý do: Gõ nhầm: 120us - 1us
          Hôm nay trời nắng chang chang.
          Mèo con đi học chẳng mang thứ gì.
          Chỉ mang một cái bút chì.
          Và mang một mẩu bánh mì con con.

          Comment


          • #20
            Nguyên văn bởi Acxen_lupine Xem bài viết
            Hiển nhiên tôi đã thử bằng máy hiện sóng hẳn hoi mới dám phát biểu.
            Ở mấy cái ảnh tôi post, vấn đề không phải sai khác vài us (giữa biến kiểu này hay kiểu khác) vì nó được nhân lên 120 lần đấy... Sẽ khác nhau nhiều lắm..
            Vấn đề ở chỗ tôi thấy các bạn sai khi nghĩ for(j=0;j<120;j++){} tương đương 1us... Nó tương đương 500us nếu j là 1 byte, và tương đương 1000 us nếu j là 2 byte <tấc nhiên trong điều kiện Trình dich là Keil, MCU là họ 8051, và thạch anh là 12MHz>
            Chủ thớt chắc không quan tâm được đâu... Hy vọng có thể giúp bạn phần nhỏ nào đó
            hoan nghênh bạn! nhưng bạn nói for(j=0;j<120;j++){;} tương đương với 1us thì nó không đúng mà nó sẽ tương đương với 120usx55.
            thôi! chủ đề chúng ta dừng ở đây thôi, mỗi người một ý kiến nên bất đồng quan điểm là đúng!
            K đah k wen! chúc bạn thành công!
            Last edited by dinhnam123; 14-01-2013, 00:31.
            |

            Comment


            • #21
              nói chung thì trên đây cũng chỉ là tuơng đối thôi...vì những yêu cầu thời gian thực thì họ sẽ có xung nhịp lớp hơn để giảm sai số..
              còn 1 lệnh hết bao nhiêu lệnh máy thì còn phụ thuộc vào cấu trúc đường ống lệnh pipeline của vxl nó ntn....trong lúc thực hiện có xảy ra ngắt hay k?...vvv
              còn 1 chu kỳ thực hiện lệnh "không làm gì" như trên thì giống như lệnh noop thôi...
              cậu có thể thay thế =
              while(ms) ms--;

              Comment


              • #22
                Nguyên văn bởi tan0710 Xem bài viết
                nói chung thì trên đây cũng chỉ là tuơng đối thôi...vì những yêu cầu thời gian thực thì họ sẽ có xung nhịp lớp hơn để giảm sai số..
                còn 1 lệnh hết bao nhiêu lệnh máy thì còn phụ thuộc vào cấu trúc đường ống lệnh pipeline của vxl nó ntn....trong lúc thực hiện có xảy ra ngắt hay k?...vvv
                còn 1 chu kỳ thực hiện lệnh "không làm gì" như trên thì giống như lệnh noop thôi...
                cậu có thể thay thế =
                while(ms) ms--;
                Mình đồng ý với ý kiến của bạn, dùng delay(int ms) chỉ cho một khoảng delay mang tính tương đối mà thôi.

                Với đoạn code 2 hàm for lồng vào nhau như post đầu tiên, muốn chính xác thì dùng OscilloScope để do xem vòng trong chạy mất bao nhiêu lâu thì ta sẽ tính toán được vòng ngoài cho hợp lý (vì ở trang 2 thấy có nhiều bạn tranh luận về chuyển mã từ C sang Assembly rồi sang Machine Code, cũng chỉ cho phép mình tính toán tương đối thôi).

                Mình thích ý tưởng dùng timer với Interrupt hơn, vừa chính xác và MCU có thể làm những việc khác nữa, hơn là ngồi chờ hết 1 khoảng t/g rồi lại tiếp tục. Tuy nhiên nếu ứng dụng của bạn đơn giản, thì dùng delay(int ms) cũng ok.

                Thân.

                Comment


                • #23
                  đồng ý với 2 bạn!^^
                  |

                  Comment


                  • #24
                    Nguyên văn bởi dinhnam123 Xem bài viết
                    hoan nghênh bạn! nhưng bạn nói for(j=0;j<120;j++){;} tương đương với 1us thì nó không đúng mà nó sẽ tương đương với 120us.
                    thôi! chủ đề chúng ta dừng ở đây thôi, mỗi người một ý kiến nên bất đồng quan điểm là đúng!
                    K đah k wen! chúc bạn thành công!
                    Nó tương đương 120us thì sao không tương luôn khoảng 1000 thay vì 120 cho mỗi đơn vị ms tương đối = 1000us nhỉ??? Ai chẳng biết hàm Delay này chỉ là tương đối nhưng không thể khác nhau quá nhiều được...
                    Giải tán đi thôi...
                    Hôm nay trời nắng chang chang.
                    Mèo con đi học chẳng mang thứ gì.
                    Chỉ mang một cái bút chì.
                    Và mang một mẩu bánh mì con con.

                    Comment


                    • #25
                      Thank Các Bác đã giúp em hiểu được chút ít, Em đang tự học C và 8051, Các bác đã hiểu kĩ mà còn đang phải bàn cãi, thì chắc còn lâu em mới có thể hiểu rõ được điều đó, Cám ơn các bác nhiều!

                      Comment


                      • #26
                        Nguyên văn bởi L.T.M Xem bài viết
                        Thank Các Bác đã giúp em hiểu được chút ít, Em đang tự học C và 8051, Các bác đã hiểu kĩ mà còn đang phải bàn cãi, thì chắc còn lâu em mới có thể hiểu rõ được điều đó, Cám ơn các bác nhiều!
                        Đây thuần túy là tranh luận thôi, không có vấn đề cá nhân hay bàn cãi gì cả... "Cứu xét tâm tánh thì đừng cầu không khúc mắc, vì không khúc mắc thì sở học không thấu đáo." - Phật bảo vậy.
                        Hôm nay trời nắng chang chang.
                        Mèo con đi học chẳng mang thứ gì.
                        Chỉ mang một cái bút chì.
                        Và mang một mẩu bánh mì con con.

                        Comment


                        • #27
                          thôi k bàn luận thêm nưa nhé! chú L.T.M thành công!
                          thân!
                          |

                          Comment


                          • #28
                            Nguyên văn bởi dinhnam123 Xem bài viết
                            for(i=0;i<ms;i++)
                            for(j=0;j<120;j++)
                            {}//không làm gì cả
                            đoạn chương trình trên làm nhiệm vụ tạo trễ với thời gian trễ: t_delay=ms*120
                            nếu dùng thạch anh 12MHZ thì 1 chu kỳ lệnh là (1/12.12MHZ)=1us, nên thời gian trễ của đoạn code là: ms*120us
                            vậy nếu ta truyền số liệu ms là giá trị bao nhiêu thì ta được thời gian tương ứng với công thức trên!
                            Ko phải là ms*12us đâu bạn ak!! mà là ms*120*50 us. Vì sao?vì 1 vòng lặp for mất 50 chu kỳ máy ( dùng thạch anh 12MHz nha ).

                            Comment


                            • #29
                              Nguyên văn bởi phuphuongbk Xem bài viết
                              Ko phải là ms*12us đâu bạn ak!! mà là ms*120*50 us. Vì sao?vì 1 vòng lặp for mất 50 chu kỳ máy ( dùng thạch anh 12MHz nha ).
                              Hj bạn! đoạn kia đúng là mình quyên!
                              với đoạn code mình thử nghiệm sau:
                              #include <AT89X51.H>
                              //khai bao thu vien
                              #define bat 1
                              #define tat 0
                              unsigned int i;
                              //khai bao bien toan cuc
                              sbit led1=P1^0;
                              //tao ham delay
                              void delay(long time)
                              {
                              long n;
                              for(n=0;n<time;n++)
                              ;
                              }
                              void main()
                              {
                              while(1)// Lap vo han
                              {
                              led1=bat;
                              delay(1000);
                              led1=tat;
                              delay(1000);
                              }
                              }

                              thì đồ thị của xung đo ocilloscope như hình kèm theoClick image for larger version

Name:	Capture.PNG
Views:	1
Size:	5.2 KB
ID:	1372611
                              nó tầm khoảng 55ms.
                              mình xin đính chính .ại công thức nó là :
                              for(i=0;i<ms;i++)
                              for(j=0;j<120;j++)
                              {}//không làm gì cả
                              đoạn chương trình trên làm nhiệm vụ tạo trễ với thời gian trễ: t_delay=ms*120*55
                              nếu dùng thạch anh 12MHZ thì 1 chu kỳ lệnh là (1/12.12MHZ)=1us, nên thời gian trễ của đoạn code là: ms*120us*55
                              vậy nếu ta truyền số liệu ms là giá trị bao nhiêu thì ta được thời gian tương ứng với công thức trên!
                              sorry vì mình quên mất x55( khi đánh k xem lại) ^^
                              |

                              Comment


                              • #30
                                Nguyên văn bởi dinhnam123 Xem bài viết
                                Hj bạn! đoạn kia đúng là mình quyên!
                                với đoạn code mình thử nghiệm sau:
                                #include <AT89X51.H>
                                //khai bao thu vien
                                #define bat 1
                                #define tat 0
                                unsigned int i;
                                //khai bao bien toan cuc
                                sbit led1=P1^0;
                                //tao ham delay
                                void delay(long time)
                                {
                                long n;
                                for(n=0;n<time;n++)
                                ;
                                }
                                void main()
                                {
                                while(1)// Lap vo han
                                {
                                led1=bat;
                                delay(1000);
                                led1=tat;
                                delay(1000);
                                }
                                }

                                thì đồ thị của xung đo ocilloscope như hình kèm theo[ATTACH=CONFIG]59074[/ATTACH]
                                nó tầm khoảng 55ms.
                                mình xin đính chính .ại công thức nó là :
                                for(i=0;i<ms;i++)
                                for(j=0;j<120;j++)
                                {}//không làm gì cả
                                đoạn chương trình trên làm nhiệm vụ tạo trễ với thời gian trễ: t_delay=ms*120*55
                                nếu dùng thạch anh 12MHZ thì 1 chu kỳ lệnh là (1/12.12MHZ)=1us, nên thời gian trễ của đoạn code là: ms*120us*55
                                vậy nếu ta truyền số liệu ms là giá trị bao nhiêu thì ta được thời gian tương ứng với công thức trên!
                                sorry vì mình quên mất x55( khi đánh k xem lại) ^^
                                Vẫn chưa ổn bạn dinhnam123 ạ:
                                - Bạn đưa ra và thử nghiệm trên 1 hàm delay có cách viết khác (khác cấu trúc, khác kiểu biến).
                                - Bằng một cái hình hiện sóng không biết là bao nhiêu s/DIV... Bạn đưa ra kết luận con số 55 quá vội vàng...

                                Sau mấy năm không "nghịch cái món diễn đàn"... giờ quay lại, sao mà lại thấy các bạn làm kỹ thuật mà không có chút nào là tỉ mỉ...Thật thất vọng!!!!
                                Hôm nay trời nắng chang chang.
                                Mèo con đi học chẳng mang thứ gì.
                                Chỉ mang một cái bút chì.
                                Và mang một mẩu bánh mì con con.

                                Comment

                                Về tác giả

                                Collapse

                                L.T.M Tìm hiểu thêm về L.T.M

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

                                Collapse

                                Đang tải...
                                X