Misc

კოდის ოპტიმიზაცია მიკროკონტროლერებში

Ავტორი: Laura McKinney
ᲨᲔᲥᲛᲜᲘᲡ ᲗᲐᲠᲘᲦᲘ: 4 ᲐᲞᲠᲘᲚᲘ 2021
ᲒᲐᲜᲐᲮᲚᲔᲑᲘᲡ ᲗᲐᲠᲘᲦᲘ: 16 ᲛᲐᲘᲡᲘ 2024
Anonim
Crypto Pirates Daily News - January 27th, 2022 - Latest Cryptocurrency News Update
ᲕᲘᲓᲔᲝ: Crypto Pirates Daily News - January 27th, 2022 - Latest Cryptocurrency News Update

ᲙᲛᲐᲧᲝᲤᲘᲚᲘ

ავტორმა დაასრულა თავისი ბოლო წლის საინჟინრო პროექტი dsPic მიკროკონტროლერებით, ამ მოწყობილობებში ფართო ცოდნა მიიღო.

მიკროკონტროლერის C- კოდის კოდს შეიძლება დასჭირდეს ოპტიმიზაცია გარკვეულ მოწინავე პროგრამებში. ამ კოდის ოპტიმიზაცია გამოიყენება ორი მნიშვნელოვანი საკითხის შესამცირებლად:

  1. კოდის ზომა: მიკროკონტროლერებს შეუძლიათ შეინარჩუნონ შეზღუდული მონაცემები და ინსტრუქციები RAM– ის შეზღუდული ზომის გამო. ამიტომ საჭიროა კოდის ოპტიმიზაცია, რომ ხელმისაწვდომი ინსტრუქციისა და მონაცემთა მეხსიერების მაქსიმალურად ეფექტური გამოყენება მოხდეს.
  2. კოდის შესრულების დრო: მიკროკონტროლერები არის თანმიმდევრული მოწყობილობები, რომლებიც ერთდროულად ასრულებენ ერთ ინსტრუქციას. ასამბლეის თითოეული ინსტრუქცია ხარჯავს საათის ციკლის გარკვეულ რაოდენობას საკუთარი თავის შესასრულებლად. ამიტომ კოდი უნდა იყოს ოპტიმიზირებული, რათა უზრუნველყოს, რომ იგი ასრულებს საჭირო დავალებას საათის ციკლის ან შეკრების ინსტრუქციის მინიმუმ რაოდენობაში. რაც უფრო ნაკლები საათის ციკლს იყენებს კოდი, მით უფრო სწრაფად მუშაობს ის. ეს ნიშნავს, რომ აპლიკაციებს შეუძლიათ უფრო სწრაფად იმუშაონ, რადგან დამუშავების დრო მინიმუმამდეა დაყვანილი.

ამ სტატიაში მოცემულია რჩევები და ხრიკები, რომლებიც შეიძლება გამოყენებულ იქნას მიკრო კონტროლერის კოდის ზომისა და შესრულების დროის შესამცირებლად.


Microchip– ის MplabX– ის განვითარების IDE გამოყენებული იქნება მაგალითების საჩვენებლად საჭიროების შემთხვევაში.

როგორ გავზომოთ კოდის შესრულების დრო ექსპერიმენტულად

იმის წარმოდგენისთვის, თუ რამდენი დრო სჭირდება რეალურად რეალურ დროში თქვენი კოდის შესასრულებლად, საჭიროა მისი ექსპერიმენტული გაზომვა. ლოგიკის ანალიზატორი შეიძლება მოსახერხებლად გამოვიყენოთ კოდის შესრულების დროის გასაზომად და მსურველებს ჩემთვის ელ.ფოსტით შეუძლიათ დაინტერესდნენ ამ პროცესის შესახებ. ამის გარდა:

  • ზოგიერთ შემდგენელს აქვს შესაძლებლობა დაითვალოს საათის ციკლი, რომელსაც კოდი მოიხმარს.
  • ზოგიერთ გამმართველს, მაგალითად, ICD 3 მიკროჩიპს შეუძლია პირდაპირ გაზომოს შესრულების დრო წამზომით.

1. იცოდეთ თქვენი მიკროკონტროლის დამუშავების ძალა და მეხსიერების ზომა

ყოველთვის არ არის საათის სიხშირე (Mhz), რომელიც იძლევა მიკრო-კონტროლერის დამუშავების სიჩქარის რეალურ სურათს, უფრო რეალისტური ღონისძიებაა MIPS (მეგა ინსტრუქცია წამში) ან ინსტრუქციების რაოდენობა, რომელსაც MCU შეუძლია წამში შეასრულოს.

MCU ჩვეულებრივ მერყეობს 60–70 MIPS მაღალი დონის კატეგორიაში 20 MIPS 8 ბიტიან AVR– მდე. მაღალი MIPS მიკრო-კონტროლერი, სავარაუდოდ, უფრო ძვირი იქნება, ვიდრე დაბალი დონის მოწყობილობა, ასე რომ, აქ თქვენ გაქვთ ურთიერთგაგება ფასსა და დამუშავების სიჩქარეს შორის.


მიკრო-კონტროლერებს აქვთ ცალკე მეხსიერება მონაცემთა და პროგრამის კოდის შესანახად. ორივე მათგანის ზომა შეგიძლიათ იხილოთ მონაცემთა ცხრილიდან. შეიძლება დაგჭირდეთ MCU მეხსიერების უფრო დიდი ზომით, თუ თქვენი კოდი მნიშვნელოვნად დიდია.

2. ცვლადების არჩევანი კოდის ზომაში ოპტიმიზაციისთვის

მიკრო-კონტროლერებს აქვთ მონაცემთა მეხსიერება შეზღუდული, ჩვეულებრივ, 1-დან 4 კბაიტამდე. ამ შემთხვევაში გონივრულია შეარჩიოთ ყველაზე შესაფერისი ცვლადის ტიპი შენახული თარიღის მოსალოდნელი დიაპაზონის შესაბამისად. ქვემოთ მოცემულ ცხრილში მოცემულია ცვლადები:

C- ენაში გამოყენებული ცვლადების შეჯამება.

ცვლადი ტიპიზომა ბაიტებშიᲓიაპაზონი

ბოლი

1

მხოლოდ 0 ან 1

ჩარი

1


-128-დან 127-მდე

ინტ

2

-32,768-დან 32,767-მდე

ხელმოუწერელი int

2

0-დან 65,535-მდე

გრძელი

4

-2,147,483,648-დან 2,147,483,647-მდე

ათწილადი

4

ზუსტი 6 ათწილადი ადგილები

ორმაგი

8

ზუსტი 15 ათწილადი ადგილები

გრძელი ორმაგი

10

ზუსტი 19 ათობითი ადგილი

მაგალითი:

  • თუ ორი ცვლადი X და Y უნდა დაემატოს და შედეგი უნდა იყოს შენახული Z- ში, მაგრამ Z– ის მნიშვნელობა უფრო მაღალი იქნება, ვიდრე 65,535, დამატების შემდეგ Z შეიძლება გამოცხადდეს გრძლად, ხოლო X და Y შეიძლება გამოცხადდეს როგორც ხელმოუწერელი int, X და Y მნიშვნელობები ასევე არ იქნება უარყოფითი. ეს დაზოგავს 04 ბაიტს მონაცემთა მეხსიერებაში, რომელიც სხვაგვარად მოიხმარდა, თუ ყველა ცვლადი გამოცხადდებოდა ხანგრძლივად.
  • ორი ცვლადი X და Y, რომელთა მნიშვნელობები მოსალოდნელია მთლიან რიცხვებში უნდა გაიყოს, მაგრამ გაყოფის შედეგად შეიძლება ათწილადი იყოს, შემდეგ X და Y შეიძლება გამოცხადდეს int და შედეგი შეიძლება გამოცხადდეს float ან ორმაგად, რაც დამოკიდებულია საჭირო სიზუსტე.

დიდი რაოდენობით ელემენტების შემცველი მასივების გამოცხადებისას შეიძლება გადამწყვეტი იყოს მონაცემთა ტიპის არჩევანი.

3. ცვლადების არჩევანი კოდის შესრულების დროში ოპტიმიზაციისთვის

  • დადგენილი ფაქტია, რომ მცურავი წერტილის გამოთვლებს უფრო დიდი დრო სჭირდება, ვიდრე ფიქსირებული წერტილის გამოთვლებს. არ გამოიყენოთ მცურავი წერტილის ცვლადი, სადაც ათობითი მნიშვნელობა არ არის საჭირო. იმუშავეთ ხელმოუწერელ მთელი რიცხვებით, სადაც ეს შესაძლებელია.
  • ადგილობრივი ცვლადები უპირატესობას ანიჭებენ გლობალურ ცვლადებს. თუ ცვლადი გამოიყენება მხოლოდ ფუნქციაში, მაშინ იგი უნდა იყოს დეკლარირებული ამ ფუნქციაში, რადგან გლობალურ ცვლადებზე წვდომა უფრო ნელია, ვიდრე ადგილობრივი ცვლადები.
  • 8-ბიტიანი MCU ნახავთ ერთ ბაიტის ზომის ცვლადს უფრო სწრაფად მისასვლელად, ხოლო 16-ბიტიანი MCU– ს 2-ბაიტიანი ცვლადი უფრო ადვილად მიუწვდომელია გამომუშავებული მისამართის სიგრძის გამო.

4. არითმეტიკული მოქმედებების ოპტიმიზაცია

არითმეტიკული მოქმედებების ოპტიმიზაცია შესაძლებელია შემდეგნაირად.

  1. გამოიყენეთ წინასწარ გამოანგარიშებული მნიშვნელობების საძიებო ცხრილები სინუსის ან სხვა ნებისმიერი ტრიგონომეტრიული ფუნქციის ან სხვა ნებისმიერი ოპერაციის შეფასების ნაცვლად, რომლის შედეგი შეიძლება წინასწარ იყოს ცნობილი კოდით.
  2. იმ შემთხვევაში, თუ სინუსური საძიებო მაგიდა უკვე ინახება მეხსიერებაში, კოსინუსის შეფასება შეიძლება მოხდეს მასივის მაჩვენებლის 90 გრადუსით დაწინაურებით.
  3. ოთხ არითმეტიკულ ოპერაციას შორის, გაყოფა და გამრავლება ყველაზე მეტ დამუშავებას მოითხოვს, პრაქტიკაში ეს შეიძლება იყოს ასობით მიკროწამის დიაპაზონში ან მცურავი წერტილის მნიშვნელობების შემთხვევაში.
  4. გამოიყენეთ bit shift ინსტრუქციები გაყოფისა და გამრავლების ნაცვლად. მარჯვენა ცვლის ინსტრუქცია 3 ემსახურება 2-ზე გაყოფას3 სადაც მარცხენა ცვლის ინსტრუქცია 1 მოემსახურება 2-ზე გამრავლებას1.

5. ინტენსიური გამოთვლებისთვის გამოიყენეთ DSP- ს მქონე მიკროკონტროლერი

ზოგიერთ მიკრო-კონტროლერს აქვს DSP დამუშავების განყოფილება, შემდეგ ჩვეულებრივი ALU მათ არქიტექტურაში. ეს DSP ძრავა მიზნად ისახავს არითმეტიკული გამოთვლების შესრულებას ძალიან სწრაფად საათის ციკლის სულ მცირე რაოდენობაში (უმეტეს შემთხვევაში) ბევრჯერ უფრო სწრაფად ვიდრე ALU.

ინსტრუქციები DSP პროცესორს შეუძლია შეასრულოს უფრო სწრაფად, ვიდრე ALU:

  • Bit ცვლის და როტაციის ინსტრუქციები.
  • გამრავლება, დაყოფა და სხვა არითმეტიკული მოქმედებები.
  • სინუსების და სხვა ტრიგონომეტრიული ფუნქციების შეფასება.
  • ყველა DSP ოპერაცია, როგორიცაა FFT, DFT, კონვოლუცია და FIR ფილტრაცია.

მიკროკონტროლერის DSP ძრავის გამოყენება მოითხოვს:

  • პროექტში შედის ცალკე DSP ბიბლიოთეკები.
  • ფუნქციების სახელები განსხვავდება სტანდარტული C მათემატიკის ბიბლიოთეკისგან. ამ ბიბლიოთეკების და ფუნქციების დოკუმენტაცია შეგიძლიათ მიიღოთ შესაბამისი მწარმოებლების ვებსაიტიდან.
  • DSP ძრავა იყენებს სხვადასხვა ცვლადის ტიპის "წილადებს". შეიტყვეთ, თუ როგორ გამოიყენოთ ფრაქციული ტიპის ცვლადები dsp ბიბლიოთეკის ფუნქციებთან მუშაობის დაწყებამდე.

გაითვალისწინეთ, რომ მათემატიკის ბიბლიოთეკის სტანდარტული ფუნქციები არ გამოიყენებენ DSP ძრავას, რადგან ისინი თარგმნიან ALU ასამბლეის ინსტრუქციებში.

6. მუშაობა წყვეტებთან

გამოიყენეთ წყვეტები კონკრეტული ფუნქციების შესასრულებლად, როგორიცაა:

  • ADC მნიშვნელობების კითხვა.
  • იგზავნება და იღებს UART– დან.
  • PWM სამუშაო ციკლის რეგისტრების განახლება.
  • CAN ან I2C კომუნიკაცია.

შეწყვეტა ამ ფუნქციებს სწრაფად მოემსახურება, ვიდრე ძირითადი ფუნქციის შესრულება, ფუნქციური ზარის ან შინაგანი კოდის საშუალებით.

წყვეტები ასევე იმოქმედებს მხოლოდ საჭიროების შემთხვევაში, ხოლო თუ კოდირდება მთავარ კორპუსში, კოდი შესრულდება while (1) მარყუჟის ყველა გამეორებაში.

7. გამოიყენეთ საუკეთესო ხელმისაწვდომი შემდგენლები

შემდგენლებს შეუძლიათ ავტომატურად განახორციელონ ზემოთ განხილული ზოგიერთი ოპტიმიზაცია, თუ კოდი სწორად არის კონფიგურირებული, C- ენიდან ასამბლეის ენაზე თარგმნისას. მოძებნეთ ოპტიმიზაციის ვარიანტები თქვენს შემდგენელში და, თუ ეს შესაძლებელია, განაახლეთ შემდგენლების პროფესიონალურ ვერსიებზე, რადგან ისინი კოდების უფრო მძლავრი ოპტიმიზატორია.

8. გამოიყენეთ პირობითი განცხადებები ინტელექტუალურად

  • If-else განცხადებების სერიის გამოყენებისას ჯერ დაიცავით ყველაზე სავარაუდო პირობა. ამ გზით MCU- ს არ მოუწევს ყველა პირობის შემოწმება მას შემდეგ რაც აღმოაჩენს ნამდვილ მდგომარეობას.
  • შეცვლა შემთხვევაში განცხადება, როგორც წესი, უფრო სწრაფად, თუ სხვა.
  • გამონათქვამების სერიის ნაცვლად გამოიყენეთ nested if-else განცხადებები. თუ-სხვა ბლოკი, რომელსაც აქვს მრავალი დებულება, შეიძლება დაიყოს უფრო მცირე ქვე-განშტოებად, რათა მოხდეს ყველაზე ცუდი (ბოლო) მდგომარეობის ოპტიმიზაცია.

9. გამოიყენეთ Inline ფუნქციები

ფუნქციები, რომლებიც კოდში მხოლოდ ერთხელ უნდა იქნას გამოყენებული, შეიძლება გამოცხადდეს, როგორც სტატიკური. ეს კომპილატორს გახდის ამ ფუნქციის ოპტიმიზაციას შინაგან ფუნქციამდე და, შესაბამისად, ასამბლეის კოდი არ ითარგმნება ფუნქციის ზარისთვის.

  • ფუნქცია შეიძლება გამოცხადდეს inline, მასთან ერთად საკვანძო სიტყვის 'static' გამოყენებით.

10. გამოიყენეთ დეკორირებული მარყუჟები

შემცირებული მარყუჟი ნაკლებ ასამბლეის კოდს გამოიმუშავებს, გაზრდილ მარყუჟთან შედარებით.

ეს იმიტომ ხდება, რომ ნამატიანი ციკლის დროს საჭიროა შედარების ინსტრუქცია მარყუჟის ინდექსის ყველა მარყუჟის მაქსიმალურ მნიშვნელობასთან შესადარებლად, რათა შეამოწმოთ, მიაღწია თუ არა მარყუჟის ინდექსი მაქსიმალურ მნიშვნელობას. შემცირების მარყუჟში, ამის საწინააღმდეგოდ, ეს შედარება აღარ არის საჭირო, რადგან მარყუჟის ინდექსის შემცირებული შედეგი SREG– ში დააყენებს ნულოვან დროშას, თუ იგი ნულს მიაღწევს.

იმის გათვალისწინებით, რომ მარყუჟს ასჯერ უნდა განმეორდეს, მარყუჟიდან ერთი ინსტრუქციის შემცირება თავიდან აიცილებს ასჯერ შესრულებას, ამიტომ გავლენა უფრო მნიშვნელოვანი იქნება, როდესაც მარყუჟს მრავალჯერ უნდა განმეორდეს.

შეფუთვა

ეს რჩევები შეიძლება სასარგებლო იყოს, მაგრამ მათი ნამდვილი გამოყენება და პოტენციალი დამოკიდებულია პროგრამისტის უნარზე და ბრძანებაზე, რომელიც მას აქვს მის კოდზე. გახსოვდეთ, რომ პროგრამის ზომა ყოველთვის არ განსაზღვრავს შესრულების ვადებს, ზოგიერთ ინსტრუქციას შეიძლება მოხმარდეს საათის მეტი ციკლი, ხოლო სხვა, ამიტომ პროგრამის კიდევ ერთხელ ცოდნა თავის როლს ასრულებს.

ეს სტატია ზუსტი და სარწმუნოა, ვიდრე ავტორის ცოდნაა. შინაარსი განკუთვნილია მხოლოდ ინფორმაციული ან გასართობი მიზნებისათვის და არ ცვლის პირად რჩევას ან პროფესიულ რჩევას ბიზნესში, ფინანსურ, იურიდიულ და ტექნიკურ საკითხებში.

ᲡᲐᲮᲐᲚᲮᲝ

ᲩᲕᲔᲜ ᲒᲘᲠᲩᲔᲕᲗ ᲬᲐᲘᲙᲘᲗᲮᲝᲗ

რატომ არის ონლაინ ფულის გამომკეთებელი საიტები თაღლითობა
ᲘᲜᲢᲔᲠᲜᲔᲢ

რატომ არის ონლაინ ფულის გამომკეთებელი საიტები თაღლითობა

ანა არის დიდი ხნის დამოუკიდებელი მწერალი, რომელიც მუდმივად ცდილობს მოძებნოს სტატიები ინტერნეტით და მოგება მიიღოს.Სტუდენტი ხარ? თქვენ ხართ ვინმე, ვინც მხარეს დამატებითი თანხის მიღებას აპირებს? სამუშაო ...
როგორ გადაიტანოთ ფაილები თქვენი Kindle Fire- დან თქვენს კომპიუტერში
ᲙᲝᲛᲞᲘᲣᲢᲔᲠᲔᲑᲘ

როგორ გადაიტანოთ ფაილები თქვენი Kindle Fire- დან თქვენს კომპიუტერში

ჟანი წერს ინტერნეტში რვა წელზე მეტი ხნის განმავლობაში. იგი მოიცავს უამრავ თემას - ყველაფერი ზაზუნებით დამთავრებული საოფისე სამუშაოებით.გილოცავთ, თუ ახლახან იყიდეთ პირველი Kindle Fire. მრავალი ჩვენგანი...