Misc

Tối ưu hóa mã trong Vi điều khiển

Tác Giả: Laura McKinney
Ngày Sáng TạO: 4 Tháng Tư 2021
CậP NhậT Ngày Tháng: 16 Có Thể 2024
Anonim
[TẬP 251] THÂU THIÊN CHI ĐẠO: Đồng Lô Luyện Thần | MC Tiến Phong |Truyện tiên hiệp hay 2021
Băng Hình: [TẬP 251] THÂU THIÊN CHI ĐẠO: Đồng Lô Luyện Thần | MC Tiến Phong |Truyện tiên hiệp hay 2021

NộI Dung

Tác giả đã hoàn thành dự án kỹ thuật năm cuối của mình với bộ điều khiển vi mô dsPic, có được cái nhìn sâu rộng về các thiết bị này.

Mã ngôn ngữ C của vi điều khiển có thể yêu cầu tối ưu hóa trong các ứng dụng nâng cao nhất định. Tối ưu hóa mã này được thực hành để giảm hai điều quan trọng:

  1. Kích thước mã: Bộ vi điều khiển có thể lưu trữ dữ liệu và hướng dẫn hạn chế do dung lượng RAM của chúng bị giới hạn. Do đó, mã cần được tối ưu hóa để có thể sử dụng lệnh và bộ nhớ dữ liệu có sẵn một cách hiệu quả nhất.
  2. Thời gian thực thi mã: Bộ vi điều khiển là các thiết bị tuần tự thực hiện một lệnh tại một thời điểm. Mỗi lệnh hợp ngữ sử dụng một số chu kỳ đồng hồ nhất định để tự thực thi. Do đó, mã phải được tối ưu hóa để đảm bảo rằng nó thực hiện tác vụ được yêu cầu với số lượng chu kỳ đồng hồ hoặc lệnh lắp ráp ít nhất. Mã sử ​​dụng càng ít chu kỳ xung nhịp, mã chạy càng nhanh. Điều này có nghĩa là các ứng dụng có thể chạy nhanh hơn vì thời gian xử lý được giảm thiểu.

Bài viết này trình bày các mẹo và thủ thuật có thể được sử dụng để giảm kích thước và thời gian thực thi của mã bộ điều khiển vi mô.


IDE phát triển MplabX của Microchip sẽ được sử dụng để chứng minh các ví dụ khi thích hợp.

Cách đo thời gian thực thi mã theo thực nghiệm

Để có ý tưởng về thời gian mã thực sự cần để thực thi trong thời gian thực, bạn cần đo lường nó bằng thực nghiệm. Một bộ phân tích logic có thể được sử dụng một cách thuận tiện để đo thời gian thực thi mã và những người quan tâm có thể hỏi tôi về quy trình này qua email. Bên cạnh cái này:

  • Một số trình biên dịch có khả năng đếm các chu kỳ xung nhịp mà một đoạn mã sẽ sử dụng.
  • Một số trình gỡ lỗi, ví dụ ICD 3 từ vi mạch có thể đo trực tiếp thời gian thực thi thông qua đồng hồ bấm giờ.

1. Biết Công suất xử lý và Kích thước bộ nhớ của Vi điều khiển của bạn

Không phải lúc nào tần số xung nhịp (Mhz) cũng cho bức tranh chân thực về tốc độ xử lý của bộ vi điều khiển, thước đo thực tế hơn là MIPS (số lệnh lớn trên giây) hoặc số lệnh MCU có thể thực hiện trong một giây.

MCU thường dao động từ 60–70 MIPS ở loại cao cấp đến 20 MIPS AVR 8-bit. Bộ điều khiển vi mô MIPS cao có thể đắt hơn so với thiết bị cấp thấp, vì vậy ở đây bạn có sự cân bằng giữa chi phí và tốc độ xử lý.


Bộ điều khiển vi mô có bộ nhớ riêng biệt để lưu trữ dữ liệu và mã chương trình. Kích thước của cả hai có thể được tìm thấy từ biểu dữ liệu. Bạn có thể cần một MCU có kích thước bộ nhớ lớn hơn nếu mã của bạn lớn hơn đáng kể.

2. Lựa chọn các biến để tối ưu hóa kích thước mã

Bộ điều khiển vi mô có bộ nhớ dữ liệu hạn chế, thường từ 1 đến 4 Kbyte. Trong trường hợp này, nên chọn loại biến thích hợp nhất theo phạm vi ngày dự kiến ​​được lưu trữ. Bảng dưới đây tóm tắt các biến số này:

Tóm tắt các biến được sử dụng trong ngôn ngữ C.

Loại biếnKích thước tính bằng bytePhạm vi

bool

1

0 hoặc 1 chỉ

char

1


-128 đến 127

int

2

-32,768 đến 32,767

int không dấu

2

0 đến 65,535

Dài

4

-2.147.483.648 đến 2.147.483.647

Phao nổi

4

Chính xác đến 6 chữ số thập phân

gấp đôi

8

Chính xác đến 15 chữ số thập phân

dài đôi

10

Chính xác đến 19 chữ số thập phân

Thí dụ:

  • Nếu hai biến X và Y được thêm vào và kết quả được lưu trong Z nhưng giá trị của Z được mong đợi cao hơn thì 65,535 sau khi cộng thì Z có thể được khai báo là dài và X và Y có thể được khai báo là không có dấu int, các giá trị của X và Y cũng không được mong đợi là số âm. Thao tác này sẽ tiết kiệm 04 byte trong bộ nhớ dữ liệu mà lẽ ra đã được sử dụng hết nếu tất cả các biến được khai báo càng lâu.
  • Hai biến X và Y, có giá trị dự kiến ​​là số nguyên sẽ bị chia, nhưng kết quả của phép chia có thể mang lại một số thập phân, khi đó X và Y có thể được khai báo là int và kết quả có thể được khai báo là float hoặc double tùy thuộc vào độ chính xác cần thiết.

Lựa chọn kiểu dữ liệu có thể rất quan trọng khi khai báo mảng chứa nhiều phần tử.

3. Lựa chọn các biến để tối ưu hóa trong thời gian thực thi mã

  • Một thực tế đã được chứng minh là các phép tính dấu phẩy động mất nhiều thời gian hơn các phép tính điểm cố định. Không sử dụng biến dấu phẩy động khi không yêu cầu giá trị thập phân. Làm việc với các số nguyên không dấu bất cứ khi nào có thể.
  • Các biến cục bộ được ưu tiên hơn các biến toàn cục. Nếu một biến chỉ được sử dụng trong một hàm thì nó phải được khai báo trong hàm đó vì việc truy cập các biến toàn cục chậm hơn các biến cục bộ.
  • MCU 8 bit sẽ tìm thấy một biến có kích thước byte đơn để truy cập nhanh hơn và MCU 16 bit sẽ tìm thấy biến 2 byte dễ truy cập hơn do độ dài của địa chỉ được tạo ra.

4. Tối ưu hóa các phép toán số học

Các phép toán số học có thể được tối ưu hóa theo những cách sau.

  1. Sử dụng bảng tra cứu các giá trị được tính toán trước thay vì đánh giá một Sine hoặc bất kỳ hàm lượng giác nào khác hoặc bất kỳ phép toán nào khác mà kết quả của nó có thể được biết trước trong mã.
  2. Trong trường hợp một bảng tra cứu sin đã được lưu trong bộ nhớ, một cosin có thể được đánh giá bằng cách tăng con trỏ mảng tương đương 90 độ.
  3. Trong số bốn phép toán số học, phép chia và phép nhân chiếm nhiều thời gian xử lý nhất, trong thực tế, nó có thể nằm trong khoảng hàng trăm micro giây hoặc lâu hơn trong trường hợp giá trị dấu phẩy động.
  4. Sử dụng hướng dẫn dịch chuyển bit thay vì chia và nhân. Lệnh dịch phải 3 chia hết cho 23 trong đó như lệnh dịch trái 1 sẽ nhân với 21.

5. Sử dụng Bộ vi điều khiển có khả năng DSP để Tính toán Chuyên sâu

Một số bộ điều khiển vi mô có một đơn vị xử lý DSP khác với ALU thông thường được tích hợp trong kiến ​​trúc của chúng. Công cụ DSP này được thiết kế để thực hiện các phép tính số học rất nhanh trong số chu kỳ đồng hồ ít nhất (một trong hầu hết các trường hợp) nhanh hơn nhiều lần so với ALU.

Hướng dẫn mà bộ xử lý DSP có thể thực hiện nhanh hơn thì ALU là:

  • Hướng dẫn dịch chuyển và xoay bit.
  • Phép nhân, phép chia và các phép toán số học khác.
  • Đánh giá Sines và các hàm lượng giác khác.
  • Tất cả các hoạt động DSP như FFT, DFT, tích chập và lọc FIR.

Việc sử dụng công cụ DSP của bộ vi điều khiển yêu cầu:

  • Các thư viện DSP riêng biệt được kết hợp vào dự án.
  • Tên của các hàm khác với thư viện toán học tiêu chuẩn của ngôn ngữ C. Tài liệu về các thư viện và chức năng này có thể được cung cấp từ trang web của các nhà sản xuất tương ứng.
  • Công cụ DSP sử dụng một loại biến khác 'phân số'. Tìm hiểu cách sử dụng biến kiểu phân số trước khi tiếp tục với các hàm thư viện dsp.

Lưu ý rằng các hàm thư viện toán học tiêu chuẩn sẽ không gọi công cụ DSP vì chúng được dịch thành các lệnh hợp ngữ ALU.

6. Làm việc với ngắt

Sử dụng ngắt để thực hiện các chức năng cụ thể như:

  • Đọc giá trị ADC.
  • Gửi và nhận từ UART.
  • Cập nhật các thanh ghi chu kỳ nhiệm vụ PWM.
  • Giao tiếp CAN hoặc I2C.

Ngắt sẽ phục vụ các chức năng này một cách nhanh chóng so với việc thực hiện chúng trong phần thân chính bằng cách gọi hàm hoặc mã nội tuyến.

Ngắt cũng sẽ chỉ kích hoạt khi được yêu cầu, trong khi nếu được mã hóa trong phần thân chính, mã sẽ thực thi trong mỗi lần lặp của vòng lặp while (1).

7. Sử dụng các trình biên dịch tốt nhất hiện có

Trình biên dịch có thể tự động thực hiện một số tối ưu hóa được thảo luận ở trên trong khi dịch mã từ ngôn ngữ C sang ngôn ngữ hợp ngữ nếu được định cấu hình đúng cách. Tìm kiếm các tùy chọn tối ưu hóa trong trình biên dịch của bạn và nếu có thể hãy nâng cấp lên các phiên bản chuyên nghiệp của trình biên dịch vì chúng là những trình tối ưu hóa mã mạnh hơn.

8. Sử dụng các câu lệnh có điều kiện một cách thông minh

  • Khi sử dụng một loạt các câu lệnh if-else, hãy giữ điều kiện có thể xảy ra nhất trước. Bằng cách này, MCU sẽ không phải quét qua tất cả các điều kiện sau khi nó tìm thấy điều kiện thực sự.
  • Câu lệnh switch-case thường nhanh hơn câu lệnh if-else.
  • Sử dụng các câu lệnh if-else lồng nhau thay cho một loạt các câu lệnh. Một khối if-else có nhiều câu lệnh có thể được chia thành các nhánh con nhỏ hơn để tối ưu hóa cho điều kiện trường hợp xấu nhất (cuối cùng).

9. Sử dụng các hàm nội tuyến

Các hàm chỉ được sử dụng một lần trong mã có thể được khai báo là tĩnh. Điều này sẽ làm cho trình biên dịch tối ưu hóa hàm đó thành một hàm nội tuyến và do đó không có mã hợp ngữ nào sẽ được dịch cho lệnh gọi hàm.

  • Một hàm có thể được khai báo nội dòng bằng cách sử dụng từ khóa 'static' với nó.

10. Sử dụng các vòng lặp giảm dần

Một vòng lặp giảm dần sẽ tạo ra ít mã lắp ráp hơn so với một vòng lặp tăng dần.

Đó là bởi vì trong một vòng lặp tăng dần, một lệnh so sánh là cần thiết để so sánh chỉ số vòng lặp với giá trị lớn nhất trong mọi vòng lặp để kiểm tra xem chỉ số vòng lặp có đạt giá trị lớn nhất hay không. Ngược lại trong vòng lặp giảm dần, việc so sánh này không cần thiết nữa vì kết quả giảm dần của chỉ số vòng lặp sẽ đặt cờ không trong SREG nếu nó đạt đến không.

Cho rằng vòng lặp phải lặp đi lặp lại hàng trăm lần, việc giảm bớt một lệnh từ vòng lặp sẽ tránh được lệnh được thực hiện hàng trăm lần, do đó tác động có thể sẽ đáng kể hơn khi vòng lặp phải lặp đi lặp lại nhiều lần.

Kết thúc

Những lời khuyên này có thể hữu ích nhưng ứng dụng thực sự và hiệu lực của chúng phụ thuộc vào kỹ năng của lập trình viên và lệnh anh ta có trên mã của mình. Hãy nhớ rằng kích thước của chương trình không phải lúc nào cũng xác định thời gian thực thi, một số lệnh có thể tiêu tốn nhiều chu kỳ đồng hồ hơn thì lệnh khác, vì vậy một lần nữa các kỹ năng của chương trình phải đóng vai trò của chúng.

Bài viết này chính xác và đúng theo hiểu biết tốt nhất của tác giả. Nội dung chỉ dành cho mục đích thông tin hoặc giải trí và không thay thế cho lời khuyên cá nhân hoặc lời khuyên chuyên nghiệp trong các vấn đề kinh doanh, tài chính, pháp lý hoặc kỹ thuật.

Phổ BiếN Trên CổNg Thông Tin

Hôm Nay Phổ BiếN

Sơ lược về lịch sử của máy vi tính
Máy Tính

Sơ lược về lịch sử của máy vi tính

Liam là một nhà văn lâu năm, người thích tìm hiểu và chia ẻ thông tin về ức khỏe, không gian và khoa học vật liệu.Tất cả các máy vi tính đều...
Tạo và sử dụng các mẫu trong Outlook 2007 và Outlook 2010 để tiết kiệm thời gian
Máy Tính

Tạo và sử dụng các mẫu trong Outlook 2007 và Outlook 2010 để tiết kiệm thời gian

Robbie chủ yếu viết về kyrim nhưng đôi khi cũng làm áng tỏ những điều kỳ lạ của các ứng dụng Micro oft như Excel và Outlook.Trong bài viết này, tôi ẽ xem xé...