اطلاعیه

Collapse
No announcement yet.

typedef کردن تابع

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    typedef کردن تابع

    با سلام.

    ببخشید در مورد کد زیر این چیزی که میگم درست هست یا نه ؟؟؟
    اگر درست نیست بی زحمت اصلاحش کنید.
    در خط اول یعنی :
    typedef __interrupt void (*PINT)(void);


    یک نوع جدیدی تعریف کریم که اشاره گر به یک تابع وقفه هست که ورودی ندارد و خروجی هم ندارد.
    پس وقتی در استراکچر PIE_VECT_TABLE مینویسیم :PINT TIMER1_INT; یعنی در واقع عبارت زیر را داریم:

    _interrupt void (*TIMER1_INT) (void);

    ***** در انتها کد برنامه قرار گرفته است.
    *****لطفا مثالی بزنید که این نوع کاربرد از تعریف تابع رو داخلش داشته باشه.
    خیلی ممنون.


    typedef __interrupt void (*PINT)(void);


    // Define Vector Table:
    struct PIE_VECT_TABLE {
    PINT PIE1_RESERVED_INT; // Reserved
    PINT PIE2_RESERVED_INT; // Reserved
    PINT PIE3_RESERVED_INT; // Reserved
    PINT PIE4_RESERVED_INT; // Reserved
    PINT PIE5_RESERVED_INT; // Reserved
    PINT PIE6_RESERVED_INT; // Reserved
    PINT PIE7_RESERVED_INT; // Reserved
    PINT PIE8_RESERVED_INT; // Reserved
    PINT PIE9_RESERVED_INT; // Reserved
    PINT PIE10_RESERVED_INT; // Reserved
    PINT PIE11_RESERVED_INT; // Reserved
    PINT PIE12_RESERVED_INT; // Reserved
    PINT PIE13_RESERVED_INT; // Reserved
    PINT TIMER1_INT; // CPU Timer 1 Interrupt
    PINT TIMER2_INT; // CPU Timer 2 Interrupt
    PINT DATALOG_INT; // Datalogging Interrupt
    PINT RTOS_INT; // RTOS Interrupt
    PINT EMU_INT; // Emulation Interrupt
    PINT NMI_INT; // Non-Maskable Interrupt
    PINT ILLEGAL_INT; // Illegal Operation Trap
    PINT USER1_INT; // User Defined Trap 1
    PINT USER2_INT; // User Defined Trap 2
    PINT USER3_INT; // User Defined Trap 3
    PINT USER4_INT; // User Defined Trap 4
    PINT USER5_INT; // User Defined Trap 5
    PINT USER6_INT; // User Defined Trap 6
    PINT USER7_INT; // User Defined Trap 7
    PINT USER8_INT; // User Defined Trap 8
    PINT USER9_INT; // User Defined Trap 9
    PINT USER10_INT; // User Defined Trap 10
    PINT USER11_INT; // User Defined Trap 11
    PINT USER12_INT; // User Defined Trap 12
    PINT ADCA1_INT; // 1.1 - ADCA Interrupt 1
    PINT ADCB1_INT; // 1.2 - ADCB Interrupt 1
    PINT ADCC1_INT; // 1.3 - ADCC Interrupt 1
    PINT XINT1_INT; // 1.4 - XINT1 Interrupt
    PINT XINT2_INT; // 1.5 - XINT2 Interrupt
    PINT ADCD1_INT; // 1.6 - ADCD Interrupt 1
    PINT TIMER0_INT; // 1.7 - Timer 0 Interrupt
    PINT WAKE_INT; // 1.8 - Standby and Halt Wakeup Interrupt
    PINT EPWM1_TZ_INT; // 2.1 - ePWM1 Trip Zone Interrupt
    PINT EPWM2_TZ_INT; // 2.2 - ePWM2 Trip Zone Interrupt
    PINT EPWM3_TZ_INT; // 2.3 - ePWM3 Trip Zone Interrupt
    PINT EPWM4_TZ_INT; // 2.4 - ePWM4 Trip Zone Interrupt
    PINT EPWM5_TZ_INT; // 2.5 - ePWM5 Trip Zone Interrupt
    PINT EPWM6_TZ_INT; // 2.6 - ePWM6 Trip Zone Interrupt
    PINT EPWM7_TZ_INT; // 2.7 - ePWM7 Trip Zone Interrupt
    PINT EPWM8_TZ_INT; // 2.8 - ePWM8 Trip Zone Interrupt
    PINT EPWM1_INT; // 3.1 - ePWM1 Interrupt
    PINT EPWM2_INT; // 3.2 - ePWM2 Interrupt
    PINT EPWM3_INT; // 3.3 - ePWM3 Interrupt
    PINT EPWM4_INT; // 3.4 - ePWM4 Interrupt
    PINT EPWM5_INT; // 3.5 - ePWM5 Interrupt
    PINT EPWM6_INT; // 3.6 - ePWM6 Interrupt
    PINT EPWM7_INT; // 3.7 - ePWM7 Interrupt
    PINT EPWM8_INT; // 3.8 - ePWM8 Interrupt
    PINT ECAP1_INT; // 4.1 - eCAP1 Interrupt
    PINT ECAP2_INT; // 4.2 - eCAP2 Interrupt
    PINT ECAP3_INT; // 4.3 - eCAP3 Interrupt
    PINT ECAP4_INT; // 4.4 - eCAP4 Interrupt
    PINT ECAP5_INT; // 4.5 - eCAP5 Interrupt
    PINT ECAP6_INT; // 4.6 - eCAP6 Interrupt
    PINT PIE14_RESERVED_INT; // 4.7 - Reserved
    PINT PIE15_RESERVED_INT; // 4.8 - Reserved
    PINT EQEP1_INT; // 5.1 - eQEP1 Interrupt
    PINT EQEP2_INT; // 5.2 - eQEP2 Interrupt
    PINT EQEP3_INT; // 5.3 - eQEP3 Interrupt
    PINT PIE16_RESERVED_INT; // 5.4 - Reserved
    PINT PIE17_RESERVED_INT; // 5.5 - Reserved
    PINT PIE18_RESERVED_INT; // 5.6 - Reserved
    PINT PIE19_RESERVED_INT; // 5.7 - Reserved
    PINT PIE20_RESERVED_INT; // 5.8 - Reserved
    PINT SPIA_RX_INT; // 6.1 - SPIA Receive Interrupt
    PINT SPIA_TX_INT; // 6.2 - SPIA Transmit Interrupt
    PINT SPIB_RX_INT; // 6.3 - SPIB Receive Interrupt
    PINT SPIB_TX_INT; // 6.4 - SPIB Transmit Interrupt
    PINT MCBSPA_RX_INT; // 6.5 - McBSPA Receive Interrupt
    PINT MCBSPA_TX_INT; // 6.6 - McBSPA Transmit Interrupt
    PINT MCBSPB_RX_INT; // 6.7 - McBSPB Receive Interrupt
    PINT MCBSPB_TX_INT; // 6.8 - McBSPB Transmit Interrupt
    PINT DMA_CH1_INT; // 7.1 - DMA Channel 1 Interrupt
    PINT DMA_CH2_INT; // 7.2 - DMA Channel 2 Interrupt
    PINT DMA_CH3_INT; // 7.3 - DMA Channel 3 Interrupt
    PINT DMA_CH4_INT;

    جدیدترین ویرایش توسط saati.sms; ۱۰:۱۷ ۱۳۹۸/۰۶/۰۳.

    #2
    پاسخ : typedef کردن تابع

    نوشته اصلی توسط saati.sms نمایش پست ها
    با سلام.

    ببخشید در مورد کد زیر این چیزی که میگم درست هست یا نه ؟؟؟
    اگر درست نیست بی زحمت اصلاحش کنید.
    در خط اول یعنی :
    typedef __interrupt void (*PINT)(void);


    یک نوع جدیدی تعریف کریم که اشاره گر به یک تابع وقفه هست که ورودی ندارد و خروجی هم ندارد.
    پس وقتی در استراکچر PIE_VECT_TABLE مینویسیم :PINT TIMER1_INT; یعنی در واقع عبارت زیر را داریم:

    _interrupt void (*TIMER1_INT) (void);

    ***** در انتها کد برنامه قرار گرفته است.
    *****لطفا مثالی بزنید که این نوع کاربرد از تعریف تابع رو داخلش داشته باشه.
    خیلی ممنون.


    typedef __interrupt void (*PINT)(void);


    // Define Vector Table:
    struct PIE_VECT_TABLE {
    PINT PIE1_RESERVED_INT; // Reserved
    PINT PIE2_RESERVED_INT; // Reserved
    PINT PIE3_RESERVED_INT; // Reserved
    PINT PIE4_RESERVED_INT; // Reserved
    PINT PIE5_RESERVED_INT; // Reserved
    PINT PIE6_RESERVED_INT; // Reserved
    PINT PIE7_RESERVED_INT; // Reserved
    PINT PIE8_RESERVED_INT; // Reserved
    PINT PIE9_RESERVED_INT; // Reserved
    PINT PIE10_RESERVED_INT; // Reserved
    PINT PIE11_RESERVED_INT; // Reserved
    PINT PIE12_RESERVED_INT; // Reserved
    PINT PIE13_RESERVED_INT; // Reserved
    PINT TIMER1_INT; // CPU Timer 1 Interrupt
    PINT TIMER2_INT; // CPU Timer 2 Interrupt
    PINT DATALOG_INT; // Datalogging Interrupt
    PINT RTOS_INT; // RTOS Interrupt
    PINT EMU_INT; // Emulation Interrupt
    PINT NMI_INT; // Non-Maskable Interrupt
    PINT ILLEGAL_INT; // Illegal Operation Trap
    PINT USER1_INT; // User Defined Trap 1
    PINT USER2_INT; // User Defined Trap 2
    PINT USER3_INT; // User Defined Trap 3
    PINT USER4_INT; // User Defined Trap 4
    PINT USER5_INT; // User Defined Trap 5
    PINT USER6_INT; // User Defined Trap 6
    PINT USER7_INT; // User Defined Trap 7
    PINT USER8_INT; // User Defined Trap 8
    PINT USER9_INT; // User Defined Trap 9
    PINT USER10_INT; // User Defined Trap 10
    PINT USER11_INT; // User Defined Trap 11
    PINT USER12_INT; // User Defined Trap 12
    PINT ADCA1_INT; // 1.1 - ADCA Interrupt 1
    PINT ADCB1_INT; // 1.2 - ADCB Interrupt 1
    PINT ADCC1_INT; // 1.3 - ADCC Interrupt 1
    PINT XINT1_INT; // 1.4 - XINT1 Interrupt
    PINT XINT2_INT; // 1.5 - XINT2 Interrupt
    PINT ADCD1_INT; // 1.6 - ADCD Interrupt 1
    PINT TIMER0_INT; // 1.7 - Timer 0 Interrupt
    PINT WAKE_INT; // 1.8 - Standby and Halt Wakeup Interrupt
    PINT EPWM1_TZ_INT; // 2.1 - ePWM1 Trip Zone Interrupt
    PINT EPWM2_TZ_INT; // 2.2 - ePWM2 Trip Zone Interrupt
    PINT EPWM3_TZ_INT; // 2.3 - ePWM3 Trip Zone Interrupt
    PINT EPWM4_TZ_INT; // 2.4 - ePWM4 Trip Zone Interrupt
    PINT EPWM5_TZ_INT; // 2.5 - ePWM5 Trip Zone Interrupt
    PINT EPWM6_TZ_INT; // 2.6 - ePWM6 Trip Zone Interrupt
    PINT EPWM7_TZ_INT; // 2.7 - ePWM7 Trip Zone Interrupt
    PINT EPWM8_TZ_INT; // 2.8 - ePWM8 Trip Zone Interrupt
    PINT EPWM1_INT; // 3.1 - ePWM1 Interrupt
    PINT EPWM2_INT; // 3.2 - ePWM2 Interrupt
    PINT EPWM3_INT; // 3.3 - ePWM3 Interrupt
    PINT EPWM4_INT; // 3.4 - ePWM4 Interrupt
    PINT EPWM5_INT; // 3.5 - ePWM5 Interrupt
    PINT EPWM6_INT; // 3.6 - ePWM6 Interrupt
    PINT EPWM7_INT; // 3.7 - ePWM7 Interrupt
    PINT EPWM8_INT; // 3.8 - ePWM8 Interrupt
    PINT ECAP1_INT; // 4.1 - eCAP1 Interrupt
    PINT ECAP2_INT; // 4.2 - eCAP2 Interrupt
    PINT ECAP3_INT; // 4.3 - eCAP3 Interrupt
    PINT ECAP4_INT; // 4.4 - eCAP4 Interrupt
    PINT ECAP5_INT; // 4.5 - eCAP5 Interrupt
    PINT ECAP6_INT; // 4.6 - eCAP6 Interrupt
    PINT PIE14_RESERVED_INT; // 4.7 - Reserved
    PINT PIE15_RESERVED_INT; // 4.8 - Reserved
    PINT EQEP1_INT; // 5.1 - eQEP1 Interrupt
    PINT EQEP2_INT; // 5.2 - eQEP2 Interrupt
    PINT EQEP3_INT; // 5.3 - eQEP3 Interrupt
    PINT PIE16_RESERVED_INT; // 5.4 - Reserved
    PINT PIE17_RESERVED_INT; // 5.5 - Reserved
    PINT PIE18_RESERVED_INT; // 5.6 - Reserved
    PINT PIE19_RESERVED_INT; // 5.7 - Reserved
    PINT PIE20_RESERVED_INT; // 5.8 - Reserved
    PINT SPIA_RX_INT; // 6.1 - SPIA Receive Interrupt
    PINT SPIA_TX_INT; // 6.2 - SPIA Transmit Interrupt
    PINT SPIB_RX_INT; // 6.3 - SPIB Receive Interrupt
    PINT SPIB_TX_INT; // 6.4 - SPIB Transmit Interrupt
    PINT MCBSPA_RX_INT; // 6.5 - McBSPA Receive Interrupt
    PINT MCBSPA_TX_INT; // 6.6 - McBSPA Transmit Interrupt
    PINT MCBSPB_RX_INT; // 6.7 - McBSPB Receive Interrupt
    PINT MCBSPB_TX_INT; // 6.8 - McBSPB Transmit Interrupt
    PINT DMA_CH1_INT; // 7.1 - DMA Channel 1 Interrupt
    PINT DMA_CH2_INT; // 7.2 - DMA Channel 2 Interrupt
    PINT DMA_CH3_INT; // 7.3 - DMA Channel 3 Interrupt
    PINT DMA_CH4_INT;

    اگه اشتباه نکنم اینو تو گروه چیپکده هم پرسیده بودید و همونطور که انتظار میرفت صاحب گروه و نویسنده معظم کتاب پاسخی نداشت واسش. بدیهیه.

    انی وی. چیزی که شما میگید تا حدود زیادی درسته.
    ""یک نوع جدیدی تعریف کریم که اشاره گر به یک تابع وقفه هست که ورودی ندارد و خروجی هم ندارد.""
    تعریف کردن یه تایپ جدید شکل صرفا برای راحتی کده. با فرض اینکه شما باش آشنایی دارید و صرفا همین موضوع سوالتونه،

    تایپدف کردن تابع، در اصل یه "قالب" جدید درسته میکنه و میگه هرچیزی که من با این تایپ تعریف کردم، تو به شکل قالبش تعریفش کن. تو نمونه کد شما، میگه اگه من با تایپ PINT چیزی تعریف کردم، تو اینجور در نظرش بگیر:

    1) ورودی ش void و خروجیش void
    2) تعریفش، معادل تعریفیه که بعدا بهت میگم ( یه تابع تعریف میکنید، و بهش اشاره میکنید که همون تابع وقفه ی مورد نظرتونه)
    3) یه اتریبیوت اینتراپت بهش اضافه کن که کامپایلر بدونه این مربوط به وقفه س و کارای مربوط بهش رو انجام بده

    همونطور که تو بند 2 نوشته، شما باید یه قالب کلی (دقیقا یه تابع وقفه نمونه) تعریف کنید و بهش اشاره کنید. مثلا اگر میخواید برای وقفه ی خارجی فلان پورت بنویسید، یه تابع دلخواه مینویسید که توش تشخیص میده کدوم پورت و کدوم پایه بوده و چیکار کنه. بعد هر تعداد اینستنس دلخواه از اون تایپ تعریف میکنید، اشاره میکنید به تابعی که نوشتید !

    میدونم شلوغ شد، ولی اگر به همین راحتی قابل فهم بود الان شما اینجا اینو نمیپرسیدید. بهترین کار اینه که تو راهنمای C تو اینترنت بخونیدش و وقتتونو تلف نکنید با یه آدم که گروه تلگرامی میزنه و تبلیغات رو ممنوع میکنه ولی تبلیغات کارا خودشو میکنه. خودش سود میبره، کسایی که مشکل دارن هم مشکلشون حل میشه، متخصصا باید بمونن در و دیوارو نیگا کنن ثواب اخروی بدست بیارن.

    اگر با سی شارپ آشنایی دارید، این مفهوم، تا حدود زیادی مشابه مفهوم delegate تو سی شارپه. در اصل دلگیت آسون شده همینه !

    اینم اشتباهه ، چون شما مشخص نکردید تابع اصلی چیه. تایمر1_اینت جایگزین PINT نمیشه.
    _interrupt void(*TIMER1_INT) (void);


    جدیدترین ویرایش توسط tiranoid; ۱۲:۳۲ ۱۳۹۸/۰۶/۰۴.
    Si vis pacem, para bellum

    دیدگاه

    لطفا صبر کنید...
    X