Misc

Կոդի օպտիմալացում միկրոհսկիչներում

Հեղինակ: Laura McKinney
Ստեղծման Ամսաթիվը: 4 Ապրիլ 2021
Թարմացման Ամսաթիվը: 16 Մայիս 2024
Anonim
Կոդի օպտիմալացում միկրոհսկիչներում - Misc
Կոդի օպտիմալացում միկրոհսկիչներում - Misc

Բովանդակություն

Հեղինակն ավարտեց իր վերջին տարվա ինժեներական նախագիծը dsPic միկրոկարգավորիչների միջոցով ՝ այս սարքերում լայն պատկերացում կազմելով:

Միկրոհսկիչի C- լեզվով ծածկագիրը կարող է օպտիմալացում պահանջել որոշակի առաջադեմ ծրագրերում: Կոդի այս օպտիմիզացումը կիրառվում է երկու կարևոր բան նվազեցնելու համար.

  1. Կոդի չափը: Միկրոհսկիչները կարող են պահպանել սահմանափակ տվյալներ և ցուցումներ `իրենց RAM- ի սահմանափակ չափի պատճառով: Ուստի օրենսգիրքը պետք է օպտիմիզացվի, որպեսզի մատչելի հրահանգները և տվյալների հիշողությունը հնարավոր լինի օգտագործել առավել արդյունավետ կերպով:
  2. Կոդի կատարման ժամանակները. Միկրոհսկիչները հերթականական սարքեր են, որոնք միաժամանակ կատարում են մեկ ցուցում: Յուրաքանչյուր հավաքման հրահանգ սպառում է որոշակի քանակությամբ ժամացույցի ցիկլեր `ինքն իրեն կատարելու համար: Հետևաբար, կոդը պետք է օպտիմիզացված լինի ՝ ապահովելու համար, որ այն կատարում է պահանջվող առաջադրանքը ժամացույցի ցիկլերի կամ հավաքման հրահանգների նվազագույն քանակով: Որքան քիչ ժամացույցի ցիկլեր է օգտագործում կոդը, այնքան արագ է այն գործում: Սա նշանակում է, որ ծրագրերը կարող են ավելի արագ աշխատել, քանի որ մշակման ժամանակները նվազագույնի են հասցվում:

Այս հոդվածը ներկայացնում է խորհուրդներ և հնարքներ, որոնք կարող են օգտագործվել միկրոհսկիչի կոդի չափը և կատարման ժամանակը նվազեցնելու համար:


Microchip- ի MplabX զարգացման IDE- ն կօգտագործվի օրինակները ցուցադրելու համար, երբ դա անհրաժեշտ է:

Ինչպես փորձարարորեն չափել ծածկագրի կատարման ժամանակը

Պատկերացում կազմելու համար, թե իրականում իրական ժամանակում իրականացնելու համար ձեր կոդն իրականում որքան ժամանակ է պահանջում, անհրաժեշտ է չափել այն փորձնականորեն: Տրամաբանության անալիզատորը կարող է հարմարավետորեն օգտագործվել կոդի կատարման ժամանակը չափելու համար, և ցանկացողները կարող են էլեկտրոնային փոստով ինձանից հետաքրքրվել, թե ինչ ընթացք ունի այդ գործընթացը: Սրա կողքին.

  • Որոշ կազմողներ կարող են հաշվել ժամացույցի ցիկլերը, որոնք կսպառի ծածկագիրը:
  • Որոշ կարգաբերիչներ, օրինակ, ICD 3-ը միկրոչիպից, կարող է ուղղակիորեն չափել կատարման ժամանակը վայրկյանաչափի միջոցով:

1. Իմացեք ձեր միկրոհսկիչի մշակման հզորությունը և հիշողության չափը

Միշտ չէ, որ ժամացույցի հաճախականությունը (Mhz) տալիս է միկրոկարգավորիչի մշակման արագության իրական պատկերը, իսկ ավելի իրատեսական միջոց է MIPS- ը (մեգա հրահանգներ վայրկյանում) կամ MCU- ի կողմից վայրկյանում կարող է կատարել ցուցումների քանակը:

MCU- ները սովորաբար տատանվում են բարձրակարգ կատեգորիայում 60-70 MIPS- ից մինչև 20 MIPS 8-bit 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

Iseշգրիտ ճշգրտեք մինչև 6 տասնորդական կետ

կրկնակի

8

Cշգրիտ ճշգրիտ մինչեւ 15 տասնորդական կետ

երկար կրկնակի

10

Iseշգրիտ ճշգրտեք մինչև 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. Բաժանման և բազմապատկման փոխարեն օգտագործեք բիտ հերթափոխի ցուցումներ: Rightիշտ հերթափոխի ցուցումը 3 ծառայում է բաժանելու 2-ի3 որտեղ որպես ձախ հերթափոխի ցուցում 1-ը կծառայի բազմապատկել 2-ով1.

5. Ինտենսիվ հաշվարկների համար օգտագործեք DSP ունակ միկրոկոնտրոլեր

Որոշ միկրոկարգավորիչներ ունեն DSP մշակման միավոր, այլ ոչ թե սովորական ALU, որը ներկառուցված է իրենց ճարտարապետության մեջ: Այս DSP շարժիչը նախատեսված է թվաբանական հաշվարկները շատ արագ կատարելու համար ժամացույցի ցիկլերի նվազագույն քանակով (շատ դեպքերում մեկը) շատ անգամ ավելի արագ, քան ALU- ն:

Հրահանգներ, որոնք DSP պրոցեսորը կարող է ավելի արագ իրականացնել, քան ALU- ն են.

  • Բիտային հերթափոխի և պտտման ցուցումներ:
  • Բազմապատկումներ, բաժանումներ և այլ թվաբանական գործողություններ:
  • Սինուսների և այլ եռանկյունաչափական գործառույթների գնահատում:
  • Բոլոր DSP գործողությունները, ինչպիսիք են FFT, DFT, կոնվոլյուցիան և FIR զտումը:

Միկրոհսկիչի DSP շարժիչի օգտագործումը պահանջում է, որ.

  • SPրագրում ընդգրկված են առանձին DSP գրադարաններ:
  • Ֆունկցիաների անվանումները տարբերվում են C- լեզվի ստանդարտ մաթեմատիկական գրադարանից: Այս գրադարանների և գործառույթների փաստաթղթավորումը կարող է օգտագործվել համապատասխան արտադրողների կայքից:
  • DSP շարժիչը օգտագործում է այլ փոփոխական տիպի «կոտորակային»: Իմացեք, թե ինչպես օգտագործել կոտորակային տիպի փոփոխականներ `նախքան dsp գրադարանի գործառույթներին անցնելը:

Նշենք, որ մաթեմատիկայի գրադարանի ստանդարտ գործառույթները չեն կանչում DSP շարժիչը, քանի որ դրանք թարգմանվում են ALU հավաքման հրահանգների:

6. Աշխատեք ընդհատումների հետ

Օգտագործեք ընդհատումներ հատուկ գործառույթներ կատարելու համար, ինչպիսիք են.

  • Կարդալով ADC արժեքները:
  • Ուղարկում և ստանում է UART- ից:
  • PWM հերթապահ ցիկլերի գրանցումների թարմացում:
  • CAN կամ I2C հաղորդակցություն:

Ընդհատումներն արագորեն կսպասարկեն այս գործառույթները, համեմատած հիմնական մասում դրանք ֆունկցիայի զանգի կամ ներքին կոդի միջոցով կատարելու հետ:

Ընդհատումները նաև կաշխատեն միայն այն ժամանակ, երբ պահանջվում է, մինչդեռ եթե հիմնական ծածկագրում ծածկագրվելու դեպքում, կոդը կկատարվի մինչև (1) օղակի յուրաքանչյուր կրկնության դեպքում:

7. Օգտագործեք լավագույն մատչելի կազմողները

Կոմպիլյատորները կարող են ավտոմատ կերպով իրականացնել վերը քննարկված որոշ օպտիմիզացիաներ, մինչդեռ ծածկագիրը թարգմանելիս C- լեզվից ասամբլեայի լեզուն, եթե ճիշտ կազմաձևված է: Ձեր կազմողի մեջ փնտրեք օպտիմալացման ընտրանքներ և հնարավորության դեպքում նորացրեք կազմողների մասնագիտական ​​տարբերակները, քանի որ դրանք կոդերի ավելի հզոր օպտիմիզատորներ են:

8. Օգտագործեք պայմանական հայտարարությունները խելացիորեն

  • Եթե-ուրիշ հայտարարությունների շարք օգտագործելիս նախ պահիր ամենահավանական պայմանը: Այս կերպ MCU- ն ստիպված չի լինի ստուգել բոլոր պայմանները իրական վիճակը հայտնաբերելուց հետո:
  • Անջատիչ դեպքի հայտարարությունը սովորաբար ավելի արագ է, քան եթե-ուրիշը:
  • Մի շարք հայտարարությունների փոխարեն օգտագործեք nest if (այլ) հայտարարություններ: Եթե ​​այլընտրանք ունեցող բլոկը, որն ունի բազմաթիվ հայտարարություններ, կարող է բաժանվել ավելի փոքր ենթաճյուղերի ՝ վատթարագույն (վերջին) պայմանի օպտիմալացման համար:

9. Օգտագործեք Inline գործառույթներ

Գործառույթները, որոնք պետք է օգտագործվեն միայն մեկ անգամ ծածկագրում, կարող են հայտարարվել որպես ստատիկ: Սա կստիպի կազմողին օպտիմալացնել այդ գործառույթը ներքին ֆունկցիային, ուստի գործառույթի զանգի համար ոչ մի հավաքման կոդ չի թարգմանվի:

  • Ֆունկցիան կարող է հայտարարվել inline ՝ իր հետ օգտագործելով «ստատիկ» հիմնաբառը:

10. Օգտագործեք նեխած օղակները

Նվազեցված օղակը կստեղծի ավելի քիչ հավաքման կոդ `համեմատ ավելացված օղակի հետ:

Դա այն պատճառով է, որ ավելացման օղակում անհրաժեշտ է համեմատության հրահանգ ՝ օղակի ինդեքսը յուրաքանչյուր օղակում առավելագույն արժեքի հետ համեմատելու համար ՝ ստուգելու համար, թե արդյոք օղակի ինդեքսը հասնում է առավելագույն արժեքի: Ընդհակառակը, իջեցման օղակում, այս համեմատությունն այլևս անհրաժեշտ չէ, քանի որ հանգույցի ինդեքսի նվազեցված արդյունքը զրոյի դրոշը կդնի SREG- ում, եթե այն հասնի զրոյի:

Հաշվի առնելով, որ օղակը պետք է կրկնի հարյուր անգամ, օղակից մեկ հրահանգը կրճատելը կխուսափի այն հարյուր անգամ կատարելուց, ուստի ազդեցությունն, ամենայն հավանականությամբ, կլինի ավելի նշանակալի, երբ օղակը պետք է բազմիցս կրկնվի:

Փաթաթում

Այս խորհուրդները կարող են օգտակար լինել, բայց դրանց իրական կիրառությունն ու ուժը կախված է ծրագրավորողի հմտությունից և իր կոդի վրա ունեցած հրամաններից: Հիշեք, որ ծրագրի չափը միշտ չէ, որ որոշում է կատարման ժամանակները, որոշ հրահանգներ կարող են սպառում ավելի շատ ժամացույցի ցիկլեր, իսկ մյուսը, այնպես որ ծրագրի հմտությունները ևս մեկ անգամ պետք է խաղան իրենց դերը:

Այս հոդվածը ճշգրիտ է և համապատասխանում է հեղինակի լավագույն գիտելիքներին: Բովանդակությունը նախատեսված է միայն տեղեկատվական կամ ժամանցային նպատակներով և չի փոխարինում անձնական խորհրդատվությանը կամ մասնագիտական ​​խորհրդատվությանը բիզնեսի, ֆինանսական, իրավական կամ տեխնիկական հարցերում:

Հետաքրքրաշարժ Հրապարակումներ

Մենք Խորհուրդ Ենք Տալիս Տեսնել

Ինչպե՞ս ոճավորել Bootstrap- ի ներդիրները քայլ առ քայլ
Համակարգիչներ

Ինչպե՞ս ոճավորել Bootstrap- ի ներդիրները քայլ առ քայլ

Boot trap- ը առջևի զարգացման հզոր շրջանակ է, և դրա օգտագործմամբ շատ հեշտ է կառուցել պատասխանատու կայքեր: Boot trap- ի պաշտոնական կայքը առաջարկում է բազմաթիվ ընդհանուր C / HTML բաղադրիչներ և Java cript...
Հոկտեմբեր 2017 Խաղային համակարգիչ կառուցվում է
Համակարգիչներ

Հոկտեմբեր 2017 Խաղային համակարգիչ կառուցվում է

Ես պարզապես փոքր ժամանակի տղա եմ, որը նորմալ աշխատանք է կատարում ՝ որպես բժշկի օգնական: Իմ կիրքը համակարգչային համակարգիչներ կառուցելն է և համակարգչային տեխնիկայի փորձարկումը / վերանայումը:Ողջույն բոլ...