اطلاعیه

Collapse
No announcement yet.

avr با طعم شئی گرایی. c++ vs c

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

    #16
    پاسخ : Re: avr با طعم شئی گرایی. c++ vs c

    نوشته اصلی توسط amirdelta نمایش پست ها
    اما میتونه ضعف هم باشه، چون برای استفاده از یه امکان کوچیک برای یه کاری مجبور میشی گاهی یه شی جدید تعریف کنی و اگه کامپایلر خوب تنظیم نشده باشه(optimization) مصرف حافظه sram و flash رو میبره بالا.
    کاملا درسته. طبق چیزی که من تا الان فهمیدم، تکنیک خوب برای استفاده از c++ تو سیستم های embedded اینه که از ویژگی های مفیدش فقط جاهایی که واقعا لازمه استفاده بشه، و بقیه برنامه مشابه یه برنامه کلاسیک c نوشته بشه. از اونجایی که بیشتر کد های c برای c++ هم مفهوم هستن، این کار شدنی به نظر میرسه. مثلا در مورد شی گرایی، هر جا لازمه یه کلاس و شی تعریف میشه، و هر جا لازم نیست، به صورت معمولی با متغیر ها کار میشه. البته نمیدونم در عمل میشه یه بخشی از برنامه دائما با اشیا کار کنه و بقیه برنامه معمولی باشه یا نه. از اونجا که چند کتابخونه با این سبک دیدم، فکر می کنم بشه.

    نوشته اصلی توسط amirdelta نمایش پست ها
    ضمن اینکه در c کنترل روی تعریف واحد های حافظه به نسبت بیشتره و من خودم معمولا با حساسیت فوق العاده متغییر ها رو تعریف میکنم تا حجم کد بیاد پایین.

    منظور از تعریف واحد های حافظه چیه؟ فضای ذخیره داده ها که با keyword مشخص میشه؟ مثل auto, static و ... یا اندازشون؟ مثل uint8_t و unsigned char که 8 بیتی هستن ؟ یا اینکه منظور تکنیک دیگه ای هست خبر ندارم

    نوشته اصلی توسط amirdelta نمایش پست ها
    اونچه که قطعا میسه در موردش نظر داد اینه که زمان کد نویسی رو تو پروژه های بزرگ به شدت کاهش میده

    مهم ترین انگیزه منم همینه. من توی پروژه های نسبتا کوچیک هم با این مسئله مواجه میشم که مجبورم وقت زیادی بذارم که مطمئن بشم جریان کار و پاس کاری داده ها درست انجام میشه. مهم ترین دلیل طولانی شدن دیباگ برای من شلوغ بودن و چند لایه بودن برنامست که با توجه به تحقیقاتی که تا الان داشتم، c++ میتونه مشکلمو حل کنه. مثلا فرض کنیم یه برنامه ساده داشته باشیم که میکرو بخواد دو تا موتور با ویژگی های مختلف رو با فیدبک و پالس pwm کنترل کنه و یه سری اطلاعات مربوط به اون رو هم روی یه ال سی دی ساده نمایش بده.شاید برنامه نویسی با c خیلی سخت نباشه. ولی اگه قرار باشه هر کدوم از این موتور ها یه سری تنظیمات هم داشته باشن که کاربر بتونه تغییر بده ، برنامه خیلی در هم میشه و دنبال کردن روال کار اجرا و دیباگ واقعا عذاب آور. (و بدتر از اون ، اینه که تنظیمات این دو موتور با هم متفاوت باشه، مثلا محدوده ولتاژ یا فرکانس ها با فرق کنه یا برای یه موتور امکان حرکت معکوس در نظر گرفته بشه و برای دیگری نه). اگه حتی بخوایم وضعیت پیچیده تر کنیم میشه اینطور در نظر گرفت که رفتار بخش های دیگه برنامه وابسته به تنظیمات موتورها یا وضعیت هر لحظه اونا (مثلا جریان موتور)، باشه که در پروژه های واقعی معمولا همینطوره. چنین برنامه ای با اینکه کلیاتش سادس، ولی چون همه متغیر ها به هم وابسته میشن، پیچیده و در هم میشه.
    یا شاید هم مشکل از دانش پایین برنامه نویسی منه )
    اگه راهکار بهتری هست، خوشحال میشم بدونم.

    دیدگاه


      #17
      پاسخ : Re: avr با طعم شئی گرایی. c++ vs c

      با یه ذره اطلاعاتی که در مورد c++ داشتم یه برنامه ساده نوشتم که مقایسه ای بشه بین کد c و مشابه همون تو c++ . تو این برنامه دو تا دکمه مشخص شده و یه شی که یه داده int هشت بیتی و عنوان (string) داره. یکی از این دکمه مقدار int رو زیاد میکنه و اون یکی کم میکنه. هدف اینه که بشه در ادامه توسعه برنامه دکمه های بیشتر اضافه کرد با روش های مختلف چک کردن دکمه و عملکرد های مجزای و متغیر هر دکمه تو موقعیت های متفاوت. کدی که تو c++ نوشتم اینطوری شد (احتمالا بهتر و مرتب تر هم میشد نوشت):




      // basic information of object
      class basic_info{
      public:
      uint8_t value;
      char *title;
      };


      // buttons to check and method to check if any of the buttons has been pushed
      class buttons{
      protected:
      typedef enum buttons_enum{add = 2 , subtract = 1 , no_push = 0}buttons_enum;
      buttons_enum pushed_button;
      void check_buttons(){
      uint8_t add_button =0 , subtract_button = 0;
      add_button = ((PINA) & (1 << PINA1));
      subtract_button = ((PINA) & (1 << PINA0));
      if((subtract_button != 0) && (add_button == 0)) pushed_button = add;
      else if((subtract_button == 0) && (add_button != 0)) pushed_button = subtract;
      }
      };


      // uint8 object with a uint8_t editable value and method to change that value based on the pushed_button
      class uint8_object : public basic_info, public buttons{
      public:
      void change_value(){
      check_buttons();
      if((pushed_button == add) && (value < 255)) value +=1;
      else if( (pushed_button == subtract) && (value > 0)) value -=1;
      }
      void initializer(uint8_t value_init , char* title_i){ value = value_init; title = title_i;}
      };


      uint8_object object1;


      int main(void)
      {
      object1.initializer(0 , "object1");
      DDRA = 0x00;
      DDRB = 0xff;
      while (1)
      {
      object1.change_value();
      // lcd_write(object1.title);
      }
      }


      و مشابهش تو c یه همچین چیزی شد:


      enum buttons_enum;struct uint8_object;struct info;struct buttons;
      void f_change_value(struct uint8_object* option); void f_check_button(enum buttons_enum* button);


      typedef struct info{
      uint8_t value;
      char* title;
      }info;


      typedef enum buttons_enum{add = 2 , subtract = 1 , no_push = 0}buttons_enum;


      typedef struct buttons{
      buttons_enum pushed_button;
      void (*check_button)(buttons_enum*);
      }buttons;


      typedef struct uint8_object{
      info info;
      struct buttons option_buttons;
      void (*change_value)(struct uint8_object*);
      }uint8_object;


      void f_check_button(buttons_enum* pushed_button){
      volatile uint8_t b_right = 0 , b_left = 0;
      if( (PINA & (1 << PINA0)) != 0) b_right = 1;
      if( (PINA & (1 << PINA1)) != 0) b_left = 1;
      if((b_right != 0) && (b_left == 0)) (*pushed_button) = add;
      else if( (b_right == 0) && (b_left != 0) ) (*pushed_button) = subtract;
      else pushed_button = no_push;
      }


      void f_change_value(uint8_object* option){
      option->option_buttons.check_button(&option->option_buttons.pushed_button);
      if((option->option_buttons.pushed_button == add) && (option->info.value < 255)) option->info.value +=1;
      else if( (option->option_buttons.pushed_button == subtract) && (option->info.value > 0)) option->info.value -=1;
      }


      uint8_object object1 = {
      .change_value = f_change_value,
      .info.title = "object1",
      .info.value = 0,
      .option_buttons.pushed_button = no_push,
      .option_buttons.check_button = f_check_button,
      };


      int main(void)
      {
      DDRA = 0x00;
      DDRB = 0xff;
      while (1)
      {
      object1.change_value(&object1);
      // lcd_write(object1.info.title);
      }
      }


      برای من c++ به مراتب خوانا تره. البته میدونم که برنامه c با برنامه c++ یه مقدار متفاوته. تو c من از function pointer استفاده کردم که تو زبان c++ مشابه virtual function هست. ولی عملا تو برنامه c++ که نوشتم از virtual استفاده نکردم و ظاهرا برای برنامه ای با این اندازه موثر بوده. چون نتیجه برنامه c این بود:
      Program Memory Usage : 312 bytes Data Memory Usage :18 bytes
      و نتیجه c++ این:
      Program Memory Usage : 236 bytes Data Memory Usage :12 bytes

      پ.ن: در هر دو برنامه، تنظیمات optimization روی O1- قرار گرفته.
      جدیدترین ویرایش توسط a.rahami; ۱۵:۲۱ ۱۳۹۹/۰۸/۲۶.

      دیدگاه

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