Բովանդակություն
- Ինչպես փորձարարորեն չափել ծածկագրի կատարման ժամանակը
- 1. Իմացեք ձեր միկրոհսկիչի մշակման հզորությունը և հիշողության չափը
- 2. Կոդի չափի օպտիմալացման համար փոփոխականների ընտրություն
- 3. Կոդի կատարման ժամանակի օպտիմալացման համար փոփոխականների ընտրություն
- 4. Թվաբանական գործողությունների օպտիմալացում
- 5. Ինտենսիվ հաշվարկների համար օգտագործեք DSP ունակ միկրոկոնտրոլեր
- Հրահանգներ, որոնք DSP պրոցեսորը կարող է ավելի արագ իրականացնել, քան ALU- ն են.
- Միկրոհսկիչի DSP շարժիչի օգտագործումը պահանջում է, որ.
- 6. Աշխատեք ընդհատումների հետ
- 7. Օգտագործեք լավագույն մատչելի կազմողները
- 8. Օգտագործեք պայմանական հայտարարությունները խելացիորեն
- 9. Օգտագործեք Inline գործառույթներ
- 10. Օգտագործեք նեխած օղակները
- Փաթաթում
Հեղինակն ավարտեց իր վերջին տարվա ինժեներական նախագիծը dsPic միկրոկարգավորիչների միջոցով ՝ այս սարքերում լայն պատկերացում կազմելով:
Միկրոհսկիչի C- լեզվով ծածկագիրը կարող է օպտիմալացում պահանջել որոշակի առաջադեմ ծրագրերում: Կոդի այս օպտիմիզացումը կիրառվում է երկու կարևոր բան նվազեցնելու համար.
- Կոդի չափը: Միկրոհսկիչները կարող են պահպանել սահմանափակ տվյալներ և ցուցումներ `իրենց RAM- ի սահմանափակ չափի պատճառով: Ուստի օրենսգիրքը պետք է օպտիմիզացվի, որպեսզի մատչելի հրահանգները և տվյալների հիշողությունը հնարավոր լինի օգտագործել առավել արդյունավետ կերպով:
- Կոդի կատարման ժամանակները. Միկրոհսկիչները հերթականական սարքեր են, որոնք միաժամանակ կատարում են մեկ ցուցում: Յուրաքանչյուր հավաքման հրահանգ սպառում է որոշակի քանակությամբ ժամացույցի ցիկլեր `ինքն իրեն կատարելու համար: Հետևաբար, կոդը պետք է օպտիմիզացված լինի ՝ ապահովելու համար, որ այն կատարում է պահանջվող առաջադրանքը ժամացույցի ցիկլերի կամ հավաքման հրահանգների նվազագույն քանակով: Որքան քիչ ժամացույցի ցիկլեր է օգտագործում կոդը, այնքան արագ է այն գործում: Սա նշանակում է, որ ծրագրերը կարող են ավելի արագ աշխատել, քանի որ մշակման ժամանակները նվազագույնի են հասցվում:
Այս հոդվածը ներկայացնում է խորհուրդներ և հնարքներ, որոնք կարող են օգտագործվել միկրոհսկիչի կոդի չափը և կատարման ժամանակը նվազեցնելու համար:
Microchip- ի MplabX զարգացման IDE- ն կօգտագործվի օրինակները ցուցադրելու համար, երբ դա անհրաժեշտ է:
Ինչպես փորձարարորեն չափել ծածկագրի կատարման ժամանակը
Պատկերացում կազմելու համար, թե իրականում իրական ժամանակում իրականացնելու համար ձեր կոդն իրականում որքան ժամանակ է պահանջում, անհրաժեշտ է չափել այն փորձնականորեն: Տրամաբանության անալիզատորը կարող է հարմարավետորեն օգտագործվել կոդի կատարման ժամանակը չափելու համար, և ցանկացողները կարող են էլեկտրոնային փոստով ինձանից հետաքրքրվել, թե ինչ ընթացք ունի այդ գործընթացը: Սրա կողքին.
- Որոշ կազմողներ կարող են հաշվել ժամացույցի ցիկլերը, որոնք կսպառի ծածկագիրը:
- Որոշ կարգաբերիչներ, օրինակ, ICD 3-ը միկրոչիպից, կարող է ուղղակիորեն չափել կատարման ժամանակը վայրկյանաչափի միջոցով:
1. Իմացեք ձեր միկրոհսկիչի մշակման հզորությունը և հիշողության չափը
Միշտ չէ, որ ժամացույցի հաճախականությունը (Mhz) տալիս է միկրոկարգավորիչի մշակման արագության իրական պատկերը, իսկ ավելի իրատեսական միջոց է MIPS- ը (մեգա հրահանգներ վայրկյանում) կամ MCU- ի կողմից վայրկյանում կարող է կատարել ցուցումների քանակը:
MCU- ները սովորաբար տատանվում են բարձրակարգ կատեգորիայում 60-70 MIPS- ից մինչև 20 MIPS 8-bit AVR: Բարձր MIPS միկրոկարգավորիչը, ամենայն հավանականությամբ, ավելի թանկ կլինի, քան ցածրակարգ սարքը, այնպես որ այստեղ դուք փոխզիջում կունենաք արժեքի և մշակման արագության միջև:
Միկրոհսկիչները ունեն առանձին հիշողություն տվյալների և ծրագրի ծածկագիրը պահելու համար: Երկուսի չափն էլ կարելի է գտնել տվյալների թերթից: Ձեզ կարող է անհրաժեշտ լինել ավելի մեծ հիշողություն ունեցող MCU, եթե ձեր կոդը էապես մեծ է:
2. Կոդի չափի օպտիմալացման համար փոփոխականների ընտրություն
Միկրոհսկիչները ունեն սահմանափակ տվյալների հիշողություն, սովորաբար տատանվում է 1-ից 4 Կբայթ: Այս դեպքում իմաստուն է ընտրել ամենահարմար փոփոխականի տեսակը `ըստ պահվող ամսաթվի ակնկալվող տիրույթի: Ստորև բերված աղյուսակում ամփոփված են այս փոփոխականները.
Փոփոխական տեսակը | Չափը բայթերով | Լեռնաշղթա |
---|---|---|
բոլ | 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. Թվաբանական գործողությունների օպտիմալացում
Թվաբանական գործողությունները կարելի է օպտիմիզացնել հետևյալ ձևերով.
- Օգտագործեք նախապես հաշվարկված արժեքների որոնման աղյուսակներ ՝ փոխանակ Սինուսը կամ որևէ այլ եռանկյունաչափական գործառույթը կամ որևէ այլ գործողություն գնահատելու, որի արդյունքը կարող է նախապես հայտնի լինել օրենսգրքում:
- Այն դեպքում, երբ սինուսների որոնման աղյուսակն արդեն պահված է հիշողության մեջ, կոսինուսը կարող է գնահատվել `զանգվածի ցուցիչը 90 աստիճանին համարժեք առաջ տանելով:
- Չոր թվաբանական գործողությունների շարքում բաժանումը և բազմապատկումը տևում է առավելագույն մշակման ժամանակ, գործնականում այն կարող է լինել հարյուրավոր միկրո վայրկյանների սահմաններում կամ լողացող կետի արժեքների դեպքում:
- Բաժանման և բազմապատկման փոխարեն օգտագործեք բիտ հերթափոխի ցուցումներ: 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- ում, եթե այն հասնի զրոյի:
Հաշվի առնելով, որ օղակը պետք է կրկնի հարյուր անգամ, օղակից մեկ հրահանգը կրճատելը կխուսափի այն հարյուր անգամ կատարելուց, ուստի ազդեցությունն, ամենայն հավանականությամբ, կլինի ավելի նշանակալի, երբ օղակը պետք է բազմիցս կրկնվի:
Փաթաթում
Այս խորհուրդները կարող են օգտակար լինել, բայց դրանց իրական կիրառությունն ու ուժը կախված է ծրագրավորողի հմտությունից և իր կոդի վրա ունեցած հրամաններից: Հիշեք, որ ծրագրի չափը միշտ չէ, որ որոշում է կատարման ժամանակները, որոշ հրահանգներ կարող են սպառում ավելի շատ ժամացույցի ցիկլեր, իսկ մյուսը, այնպես որ ծրագրի հմտությունները ևս մեկ անգամ պետք է խաղան իրենց դերը:
Այս հոդվածը ճշգրիտ է և համապատասխանում է հեղինակի լավագույն գիտելիքներին: Բովանդակությունը նախատեսված է միայն տեղեկատվական կամ ժամանցային նպատակներով և չի փոխարինում անձնական խորհրդատվությանը կամ մասնագիտական խորհրդատվությանը բիզնեսի, ֆինանսական, իրավական կամ տեխնիկական հարցերում: