Thông báo

Collapse
No announcement yet.

Tối ưu CODE chương trình với PIC

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

  • Tối ưu CODE chương trình với PIC

    Tối ưu CODE chương trình!

    Cái này hơi banana một tí, có lẽ bài viết này chẳng giúp gì được cho các bác ! Nhưng hãy đọc một chút cho vui vẻ.
    Giả sử em có chương trình sau viết bằng CCS về cách sử dụng TIMER0

    TMR0.C
    Code:
    // VIET HAM DELAY SU DUNG TIMER0
    #include<16F88.h>
    #include<my_16F88.h>
    #fuses   NOWDT,HS,NOPUT,MCLR,NOLVP,NOPROTECT
    #use     delay(clock=4000000)
    main()
    {
    TRISB=0x00;
    PORTB=0xf;
    TRM0 =0x8f;
    OPTION_REG=0x00;
    INTCON=0x00;
    while(TMR0IF==0);
    }
    Chương trình này chạy tốt không vấn đề gì cả. Và hãy so sánh với TMR0_optimize.C
    Code:
    // VIET HAM DELAY SU DUNG TIMER0
    #include<16F88.h>
    #include<my_16F88.h>
    #fuses   NOWDT,HS,NOPUT,MCLR,NOLVP,NOPROTECT
    #use     delay(clock=4000000)
    main()
    {
    TRM0 =0x8f;
    PORTB=0x0f;
    INTCON=0x00;
    OPTION_REG=0x00;
    TRISB=0x00;
    while(TMR0IF==0);
    }
    2 chương trình này chẳng khác nhau gì mấy! Nhưng các bác để ý xem em để vị trí đặt giá trị trong chương trình là khác nhau. PIC thực hiện chương trình từ địa chỉ đầu tiên cho đến khi kết thúc.Vị trí các thanh ghi theo thứ tự địa chỉ từ thấp lên cao sẽ tiết kiệm cho chương trình mấy us.
    Vì khi xem dạng *.ASM của nó sẽ thấy PC nhảy từ bank này sang bank khác, rồi lại nhảy lại "tốn xăng quá". Và đây là KQ thu được khi chạy mô phỏng.

    C_ trình TMR0
    Instruction counter 182
    Clock Cycles Counter 1044
    Real time Duration 261

    C_trình TMR0_optimize
    Instruction counter 176
    Clock Cycles Counter 1012
    Real time Duration 253

    Nó tiết kiệm cho các bác mấy us.
    Nhưng mà ..em đã bảo các bác chỉ đọc cho vui thôi! !!!!!!
    Chứ mấy us đáng gì so với giấc ngủ 8 tiếng của chúng ta.
    Learn more...

  • #2
    Ê chào...noisepic ơi dạy tui view assem với...tui đọc bài này mà chả hiểu noisepic nói gì cả...vì tui lập trình assem kém lắm...CCS thì cũng mù tịt luôn. Mà mấy us là cái gì vậy...tui tưởng làm cho con VDK nó đỡ tốn bộ nhớ là được???
    sở thích: Ngắm gái
    Em xinh thế , em đi @

    Comment


    • #3
      Mà mấy us là cái gì vậy
      --->mấy micro giây.
      tui tưởng làm cho con VDK nó đỡ tốn bộ nhớ là được???
      Lập trình thường có hai hướng:
      - Code optimize: mục tiêu là code nhỏ gọn.
      - Speed optimize: mục tiêu là tốc độ thực hiện nhanh.
      Tùy ứng dụng mà hướng theo một trong hai đường trên, không phải chỉ có code optimize. Thường thì chỉ có thể đạt được một trong hai mục tiêu trên. Vả lại theo tại hạ, ví dụ của thiếu hiệp noisepic ở trên không hẳn là hướng code optimize, cũng khó có thể coi là speed optimize, thực ra đó là sự phân biệt về kỹ năng lập trình và hiểu sâu cấu trúc của PIC thì đúng hơn.

      Comment


      • #4
        trên PIC 18 thì vấn đề trên không còn.
        Điều tôi bận tâm nhất khi tối ưu là tối ưu tốc độ thực thi các phép toán + ,- ,x ,/ , ví dụ nếu thật toán có nhân 2 số mà kết quả ra 32 bit thì việc tối ưu để còn 16x16 có thể tiết kiệm hơn 15 micro giây trên PIC 18 và hơn thế rất nhiều trên PIC 16
        Bài tập : trên PIC 18 :tính z=m*n , trong đó m : 16 bit , n :8 bit , z : 16 bit . Cấm xài phép toán 32 bit . Dễ mà, thử xem !!

        Comment


        • #5
          Trên các họ PIC 12 và 16 muốn tối ưu cần đặt các lệnh trên 1 bank về 1 nhóm như vậy sẽ không phải chuyển BANK qua lại. Noisepic viết bên trên chẳng qua là trên C nên các bạn không thấy rõ. Trên ÁM thấy ngay mà. Còn trên C muốn tối ưu thì phải nhớ nhóm thanh ghi nào là trên BANK1,2,... và nhóm thanh ghi nào là dùng chung trong các BANK. Từ đó có thể tối ưu như trên ASM. Nhưng khi sản xuất hàng loạt thì chi phí để tăng tốc độ đôi khi rẻ hơn để tối ưu mã lệnh.
          Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

          Biến tần
          Máy giặt
          Lò vi sóng
          Bếp từ.
          Tủ lạnh.
          Điều hòa

          Comment


          • #6
            Thực ra phép nhân bên trên 16 bit x 8 bit chỉ cần phân tích thành 2 phép nhân và 1 phép cộng là xong. PIC đời 16 lại không có phép nhân. thì sẽ chuyển thành phép cộng và dịch trái là xong. Nhớ là kiểm tra toán hạng bằng 0 hay 1 trước nhé. Như vậy không phải tính. ví dụ a x b. Phân tích b thành 2^n + 2^m+ ....+ 2^0. như vậy Kết quả chỉ là tổng các phép dịch trái của a.
            Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

            Biến tần
            Máy giặt
            Lò vi sóng
            Bếp từ.
            Tủ lạnh.
            Điều hòa

            Comment


            • #7
              Luồng rất hay, mà trình của em chưa đủ ( hoặc em chưa muốn hàn lâm) , thật tiếc
              Be quan. Plz contact through email:

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X