نمایش نتایج 1 تا 8 از 8

نام تاپیک: مشکل در دسترسی تابع وقفه به متغییر های کلاس

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #2

    نقل قول: مشکل در دسترسی تابع وقفه به متغییر های کلاس

    نقل قول نوشته شده توسط md3848 مشاهده تاپیک
    سلام - کلاس من ( داخل فایل usb.h ) به صورت زیر هستش :
    class USB {
    public :
    void isr();
    private :
    volatile uint8_t CCEMPTY_status = 1;
    } static usb;


    در فایل usb.cpp، تو تابع وقفه، اومدم یه تابع از کلاس فوق رو فراخوندم :
    extern "C" {
    void USB_IRQHandler() {
    usb.isr();
    }
    }


    داخل تابع isr از متغیر CCEMPTY_status استفاده کردم ولی تغییرات داخل این متغییر ثبت نمیشه ولی وقتی تعریف متغییر CCEMPTY_status رو، اول فایل usb.cpp قرار میدم مشکل حل میشه - چرا؟

    کد زیر داخل کلاس به صورت private باشه یا اول فایل usb.cpp باشه - چه فرقی داره - چرا باید تو یکیش تغییرات تو متغییر ثبت نشه؟
    volatile uint8_t CCEMPTY_status = 1;
    اگر متغییر را در ابتدای فایل usb.cpp تعریف کنید متغیر شما دیگه یک متغییر عضو نخواهد بود و global خواهد شد. به همین علت می تونید از همه توابع بهش دسترسی داشته باشید.
    ولی کد شما که مشکلی نداره نوع unsigned char که تعریف شده متغییر عضو کلاس هست پس بنابراین بدون مشکل برای اعضای کلاس کار خواهد کرد.
    البته دوتا نکته وجود داره یکی اینکه فرار تعریف شدن این متغییر در ناحیه های بحرانی برای شما کاربردی داره؟
    دوم اینکه تابع مذکور را دارید داخل یک shared library / dynamic library استفاده میکنید؟ و چون که یک آبجکت استاتیک از کلاس تعریف کرده اید پس بنابراین در تمام لایبرری خودتون به یک شی واحد دسترسی خواهید داشت و این حوزه دسترسی در لایبرری خواهد بود پس بنابراین در خارج از این لایبرری دسترسی به این متغییر نخواهید داشت در صورت نیاز باید امکانی را فراهم کنید که در خارج از حوزه لایبرری هم به آن دسترسی داشته باشید با تعریف یک متد دسترسی در لایبرری هم به رفرنس و هم به اشاره گری ثابت وهم به مقدار متغییر می تونید دسترسی داشته باشید.
    بنابراین همانطور که قبلا هم گفتم دسترسی و تغییر مقدار متغییر عضو در سطح لایبرری نمی تونه مشکلی داشته باشه!
    به هرحال برای راهنمایی بهتر باید کدتون را کاملتر قرار بدید.
    در آخر هم پیشنهاد میکنم بجای استفاده از نوع volatile از کلاسهای std::atomic و std::memory_order استفاده کنید تا بتونید از قفل های تعریف شده در این کلاسها در جهت همگام سازی داده ها در نخ های مختلف استفاده کرده باشید
    آخرین ویرایش به وسیله farhad_shiri_ex : سه شنبه 11 دی 1397 در 09:18 صبح

تاپیک های مشابه

  1. تغییر استایل نرم افزار طراحی شده با سی شارپ
    نوشته شده توسط ocean896 در بخش C#‎‎
    پاسخ: 0
    آخرین پست: سه شنبه 17 فروردین 1395, 16:46 عصر
  2. دسترسی به فیلد مربوط به فایل xml و تغییر فونت آن
    نوشته شده توسط sara62 در بخش Android Studio
    پاسخ: 4
    آخرین پست: دوشنبه 25 آذر 1392, 08:50 صبح
  3. سوال: تغییر دسترسی به فایل/فولدر در شبکه!
    نوشته شده توسط saeedkheiri در بخش تالار های مرتبط با شبکه و امنیت
    پاسخ: 2
    آخرین پست: یک شنبه 02 آبان 1389, 13:30 عصر
  4. سوال: عدم دسترسی کاربران به تغییر IP ها
    نوشته شده توسط sahel65 در بخش شبکه و Networking‌
    پاسخ: 18
    آخرین پست: یک شنبه 03 مرداد 1389, 21:27 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •