اطلاعیه

Collapse
No announcement yet.

نوشتن کتابخانه برای iar

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

    نوشتن کتابخانه برای iar

    سلام دوستان
    من با iar کار میکنم اما تا حالا کتابخونه خودم ننوشتم میخواستم بدونم چه جوری میتونم خودم کتابخونه بنویسم
    تو هلپ iar یه چیزایی دیدم مثل Creating and using libraries که توی User Guide نرم افزار هست اما درست متوجه نشدم که باید چی کار کرد
    برای مثال فرض کنید میخوام یک کتابخونه بنویسم که تایمر n 16 بیتی میکرو x رو تو مد pwm با دیتوی سایکل y و فرکانس f تنظیم کنه !
    حالا باید از کجا شروع کنم ؟
    با تشکر

    #2
    پاسخ : نوشتن کتابخانه برای iar

    از کد ویزارد های اماده تو نت استفاده کن
    میخوای کار کنی رو xmega کار کن
    که کم کار شده
    مگا به اندازه کافی هست
    هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
    بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
    میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

    تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

    دیدگاه


      #3
      پاسخ : نوشتن کتابخانه برای iar

      ممنون از جوابتون
      نه دیگه نشد .من میگم میخوام نحوه نوشتن کتابخونه تو IAR رو یاد بگیرم نه کار با یه TARGET جدید !

      و خوب فرقی نمیکنه که کتابخونه برای سری مگا بنویسیم یا XMEGA میتونیم بعدا با تطبیق رجیستر ها اون رو دوباره استفاده کنیم کاری که من خودم زیاد انجام دادم .

      میخوام بدونم نحوه نوشتن کتابخونه تو IAR به چه صورته ؟

      دیدگاه


        #4
        پاسخ : نوشتن کتابخانه برای iar

        دوستان نظری ندارید ؟

        دیدگاه


          #5
          پاسخ : نوشتن کتابخانه برای iar

          برای نوشتن یک کتابخانه در IAR، توابع مورد نظر خود را در فایل با پسوند c قرار می دهید و Prototype توابع و define های مورد نظر را هم در در فایلی با همان نام و پسوند h قرار می دهید. همچنین فایل با پسوند h را در فایل با پسوند c و سایر فایل هایی که به این کتابخانه احتیاج دارند include می کنید و فایل با پسوند c را به پروژه Add می کنید.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #6
            پاسخ : نوشتن کتابخانه برای iar

            مررسی دوست عزیز
            یعنی فقط همین !؟
            پس این IAR XAR Library قضیه اش چیه ؟ و این قسکتی که برای تولید کتابخونه تو نرم افزار ایجاد شده به چه دردی میخوره ؟ نمیشه گفت کار اون ایجاد فرمت اصلی فایل های کتابخونه هست ؟

            میشه فرمت کلی کتابخونه تو دو تا فایل C , H رو قرار بدبد ؟

            دیدگاه


              #7
              پاسخ : نوشتن کتابخانه برای iar

              اگر هدف شما برنامه نویسی با استفاده از تفکیک وظایف در فایل های کتابخانه ای مختلف است، همان شیوه ذکر شده کفایت می کند و IAR از ابزارهای Linker در پروسه لینک کردن Object file ها بصورت خودکار استفاده می کند. البته با وارد شدن در جزئیات عملکرد ابزارهای لینک می توانید بسیاری از اعمال و از جمله ایجاد فایل های با فرمت مشخص کتابخانه ای را بوسیله command ها ایجاد کنید، اما تصور نمی کنم منظور شما به غیر از کتابخانه نویسی به شکل گفته شده باشد. روش نوشتن فایل های c و h هم در پست قبل توضیح داده شد.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : نوشتن کتابخانه برای iar

                یه سوال
                چرا اول بعضی از فایل هدر کتابخونه ها نوشته میشه:
                مثلا
                #ifndef __DELAY__
                #define __DELAY__

                و در انتها هم فکر میکنم با این if رو میبنده
                #endif

                دیدگاه


                  #9
                  پاسخ : نوشتن کتابخانه برای iar

                  با سلام
                  خوب من یک مثال بزنم شاید یهتون کمک کرد تا بهتر متوجه بشید که چکار باید کرد
                  مثلا برنامه زیر رو که برای اسکن صفحه کلید 4*4 هست در نظر بگیرید :

                  کد:
                  #include<ioavr.h>
                  #include<intrinsics.h>
                  #include "lcd.h"
                  #include "delay.h"
                  #include "stdio.h"
                  
                  #define debounce  20  /** initialize debounce: MIN:1 , MAX:0 , Default=20-->1s **/
                  
                  __flash char digit[17]=
                  {'\0','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
                  unsigned char key,i;
                  
                  __C_task void main(void)
                  {
                    
                     TCNT1H=0x3C;
                     TCNT1L=0xB0;  
                     
                     TIMSK=0x04;
                     
                     GICR|=0x40;
                     MCUCR=0x03;
                     MCUCSR=0x00;
                     GIFR=0x40;
                     
                     DDRA=0X0F; 
                     PORTA=0X0F; 
                     
                     __enable_interrupt(); 
                     
                     lcd_init(LCD_DISP_ON);
                     lcd_clrscr();
                     lcd_home();
                     lcd_puts("Enter your pass");
                     _delay_ms(2000);   
                      lcd_clrscr();
                      
                     while(1);
                      
                  }	
                  /***********INT0*******************/
                   #pragma vector= INT0_vect 
                  __interrupt void EXT_INT0(void)
                     {
                     unsigned char count;
                        
                     PORTA=0X01;
                     i=0;
                     
                  /******keypad scan routin*************/   
                  for(count=1;count<5;count++){
                  if(PINA&(1<<PINA4))key=(count*4-3);
                  if(PINA&(1<<PINA5))key=(count*4-2);
                  if(PINA&(1<<PINA6))key=(count*4-1);
                  if(PINA&(1<<PINA7))key=(count*4);
                  if(PORTA<0X80)PORTA<<=1;
                       }
                  /*************************************/
                  
                  lcd_putc(digit[key]); 
                         
                     PORTA=0X00; 
                     TCCR1B=0X02;    /** Timer 1 on **/
                     
                  }
                  
                  /* Timer1 overflow interrupt service routine*/
                  #pragma vector= TIMER1_OVF_vect 
                  __interrupt void TIMER1_OVF(void)
                  {
                  /* Reinitialize Timer1 value for 50ms*/
                  TCNT1H=(unsigned char)0x3CB0 >> 8;
                  TCNT1L=(unsigned char)0x3CB0;
                  
                  /********* check debounce ************/
                  if(++i==debounce){
                     PORTA=0X0F;
                     i=0;
                     TCCR1B=0x00;     /** Timer 1 Stopped **/
                  }
                  }


                  حالا من امدم این رو به صورت کتابخونه نوشتم شد این :

                  کد:
                  #include<ioavr.h>
                  #include<intrinsics.h>
                  #include "lcd.h"
                  #include "delay.h"
                  #include "stdio.h"
                  #include"keypad.h"
                  
                  #define debounce  20  /** initialize debounce: MIN:1 , MAX:0 , Default=20-->1s **/
                  
                  unsigned char key;
                  __flash char digit[17]=
                  {'\0','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
                  
                  
                  __C_task void main(void)
                  {
                    
                     init_debounce_timer();
                     
                     GICR|=0x40;
                     MCUCR=0x03;
                     MCUCSR=0x00;
                     GIFR=0x40;
                     
                     init_port_direct_scan;
                     on_keypad;  
                     
                     __enable_interrupt(); 
                     
                     lcd_init(LCD_DISP_ON);
                     lcd_clrscr();
                     lcd_home();
                     lcd_puts("Enter your pass");
                     _delay_ms(2000);   
                      lcd_clrscr();
                      
                     while(1);
                      
                  }	
                  /***********INT0*******************/
                   #pragma vector= INT0_vect 
                  __interrupt void EXT_INT0(void)
                     {
                    
                     init_keypad_scan;
                     init_debounce();
                        
                     key=keypad();
                  
                     lcd_putc(digit[key]); 
                            
                     debounce_timer_on;
                     
                  }


                  و این هم برنامه سورس کتابخونه keypad اش شد :

                  کد:
                  #include<ioavr.h>
                  #include"keypad.h"
                  
                  unsigned char timer_count;
                  
                  unsigned char keypad(){
                  unsigned char count,key_number;
                  for(count=1;count<5;count++){
                  if(keypad_pin&(1<<4))key_number=(count*4-3);
                  else if(keypad_pin&(1<<5))key_number=(count*4-2);
                  else if(keypad_pin&(1<<6))key_number=(count*4-1);
                  else if(keypad_pin&(1<<7))key_number=(count*4);
                  if(PORTA<0X80)keypad_port<<=1;
                  }
                  return key_number;
                       }
                  
                  void init_debounce_timer(){
                   
                     init_timer_value; 
                     init_Timer_Interrupt_Mask;
                     
                  }
                  
                  void init_debounce(){   
                   timer_count=0;
                  }
                  
                  
                  #ifdef debounce 
                  #pragma vector= debounce_timer_vector 
                  __interrupt void timer_vector(void)
                  {
                  /* Reinitialize Timern value for 50ms*/
                  init_timer_value; 
                  
                  
                  /********* check debounce ************/
                  if(++timer_count==debounce){
                     on_keypad; 
                     timer_count=0;
                     debounce_timer_off;
                     
                  }
                  }
                  #endif


                  و این هم هدر کتابخونه keypad :

                  کد:
                  #define debounce  20  /** initialize debounce: MIN:1 , MAX:0 , Default=20-->1s whit defulat value **/
                  
                  #define F_CLOCK 8000000UL
                  
                  /* select Timer/Counter n and Overflow Interrupt Enable initilize the mask Register
                  and Timer/Counter value Register*/
                  #ifdef debounce
                  #if defined(__ATmega16A__)
                  #define init_Timer_Interrupt_Mask  TIMSK=0x04 
                  #define Timer_Clock_Sources_reg   TCCR1B
                  #define Timer_value_reg       TCNT1
                  #elif defined(__ATmega16__)
                  #define init_Timer_Interrupt_Mask  TIMSK=0x04 
                  #define Timer_Clock_Sources_reg   TCCR1B
                  #define Timer_value_reg       TCNT1
                  #elif defined(__ATmega32A__)
                  #define init_Timer_Interrupt_Mask  TIMSK=0x04
                  #define Timer_Clock_Sources_reg   TCCR1B
                  #define Timer_value_reg       TCNT1
                  #elif defined(__ATmega8A__)
                  #define init_Timer_Interrupt_Mask  TIMSK=0x04
                  #define Timer_Clock_Sources_reg   TCCR1B
                  #define Timer_value_reg       TCNT1
                  #else
                  #error This file, should only be assembled with the right symbol defined.
                  #endif
                  #endif
                  
                  #define keypad_port       PORTA
                  #define keypad_pin       PINA
                  #define keypad_port_direct   DDRA
                  #define init_port_direct_scan  keypad_port_direct=0X0F,keypad_port=0X00
                  #define init_keypad_scan    keypad_port=0X01
                  #define on_keypad        keypad_port=0X0F
                  #define off_keypad       keypad_port=0X00
                  
                  #define debounce_timer_vector  TIMER1_OVF_vect
                  
                  #define debounce_timer_on    Timer_Clock_Sources_reg=0X02;    /** defulat Timer 1 on **/
                  #define debounce_timer_off   Timer_Clock_Sources_reg=0x00;    /** defulat Timer 1 Stopped **/
                  
                  /* Reinitialize Timer1 value */
                  /* note : defulat value on 8mhz osilator for achive 50ms 
                  debounce is set at follow value*/
                  #define init_timer_value      Timer_value_reg=0x3CB0 
                       
                  
                  
                  unsigned char keypad();
                  void init_debounce_timer();
                  void init_debounce();

                  دیدگاه


                    #10
                    پاسخ : نوشتن کتابخانه برای iar

                    دست درد نکنه آقا مجتبی
                    ولی به این سوالم جواب ندادید که
                    چرا اول بعضی از فایل هدر کتابخونه ها نوشته میشه:
                    مثلا
                    #ifndef __DELAY__
                    #define __DELAY__
                    و در انتها هم فکر میکنم با این if رو میبنده
                    #endif
                    اصلا این چیزایی که بین این دوتا : __ __ ، نوشته میشن چین چرا بعضی جاها تو کتابخونه ها از این تعاریف به این شکل استفاده شده مثلا تو همین کتابخونه خودتون چرا اینجوری نوشتید :
                    #ifdef debounce#if defined(__ATmega16A__)
                    منظورم اون ATmega16A هست که داخل __ __ نوشته شده نمیشه بدون اینها نوشتشون؟ اصلا اینها برای کامایلر معنی خاصی دارند؟ اسم اینها چیه ؟

                    دیدگاه


                      #11
                      پاسخ : نوشتن کتابخانه برای iar

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

                      آقا تو داکیومنت نرم افزار در حالت کلی به این ها "preprocessor" میگن مثل این که ما قرار داد کردیم به این -> :read: ، میگیم خرخون .
                      حالا این preprocessor به پنج دسته تقسیم میشه :

                      1. Predefined preprocessor symbols : یعنی preprocessor هایی که قبلا برای کامپایلر تعریف شده اند

                      2. User-defined preprocessor symbols : یعنی preprocessor هایی که توسط برنامه نویس تعریف میشن ، همون define خودمون

                      3. Preprocessor extensions : دقیق نفهمیدم چیه ولی یه نمونه از این preprocessor ها ، دستور پیش پردازشی که با #pragma شروع میشن و همینطور دستور #warning message که برای نمایش خطا در عمل کامپایل به کار میره و یدونه دیگه که نفهمیدم اصلا چیه اینه : __VA_ARGS__

                      4. Preprocessor output : تا اونجا که من فهمیدم با این Preprocessor میتونید به کامپایلر بگید که یه فایلی براتونم ایجاد کنه که اطلاعاتی در مورد اینکه کجا ها تو برنامه تون از define استفاده کردید که میتونه شامل کامنت هایی هم که تو برنامه نوشتید باشه یا نباشه بجای نوشتن این Preprocessor میتونید به آدرس زیر برید و تنظیم مربوطه رو از اونجا انجام بدید : Project>Options>C/C++ Compiler>Preprocessor.

                      5.Implementation-defined behavior : نفهمیدم.

                      خوب حالا اون چیزی که مورد نظر شماست جزو دسته اول به حساب میاد برای آشنایی بیشتر با این Preprocessor به صفحه 227 Reference Guide بخش Part 2. Compiler فصل The preprocessor قسمت
                      Predefined symbols مراجعه کنید ، چیز بیشتری فهمیدید حتما به من هم بگید منم زیاد با این ها آشنا نیستم و در واقع میشه گفت چون نمیدونم هنوز به چه دردی میخورند هنوز ازشون استفاده نکردم.

                      دیدگاه


                        #12
                        پاسخ : نوشتن کتابخانه برای iar

                        با توجه به امکان چند بار include شدن یک فایل header، از طریق نوشتن ifndef# در ابتدای فایل، در پروسه کامپایل و لینک فقط یکبار این فایل در مجموعه کدها لحاظ می شود. عبارتی هم که تعریف آن مورد بررسی قرار می گیرد می تواند هر اسم دلخواه را داشته باشد که در نامگذاری های فایل های کامپایلر، از نام های خاصی استفاده می شود که برای کامپایلر شناخته شده و دارای معنای مشخص هستند و این اسامی در بسیاری مواقع مطابق تعاریف کامپایلر بین __ __ قرار داده می شوند.
                        اما اگر خود شما قصد ساخت یک کتابخانه را دارید می توانید از نام مورد نظر خود (که بهتر است با حروف بزرگ و هم نام با فایل header باشد) استفاده کنید. مثلا:
                        #ifndef MY_HEADER_H
                        #define MY_HEADER_H
                        header بدنه فایل
                        #endif


                        در هنگام کامپایل اگر برای اولین بار باشد که این فایل include شده باشد، هنوز MY_HEADER_H تعریف نشده است. بنابراین وارد بدنه فایل می شود. اما اگر این فایل در فایل های دیگر include شده باشد، در ادامه کار کامپایل و لینک و بارهای بعدی به دلیل اینکه این عبارت یکبار تعریف شده، وارد کامپایل محتویات فایل نمی شود.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #13
                          پاسخ : نوشتن کتابخانه برای iar

                          با اجازه آقا پدارم

                          استاد کی نژاد ، ببخشید ، من هنوز لمس نکردم که این عمل لینک یعنی چی !؟

                          خوب کامپایل که اگه درست فهمیده باشم یعنی تبدیل برنامه نوشته شده در سطح بالا به زبان سطح پایین یا اسمبلی خوب اگه اینجوری باشه بعد از کامپایل یه مرحله میمونه که اون اسمبل برنامه به زبان سطح پایین هست به زبان ماشین ، حالا منظور از عمل لینک اینجا چیه ؟
                          آیا عمل لینک یک عمل موازی با عمل پامپایل هست مثلا میشه گفت عمل لینک یعنی اینکه کامپایلر میاد از فایل اصلی شروع میکنه به کامپایل و بعد که به توابع کتابخونه ای برخورد کرد میره اون ها رو کامپایل میکنه بعد که همه چی کامپایل شد میاد این رو میکنه یکی بعد اسمبلشون میکنه
                          حالا یک مورد دیگه اینگکه عمل کامپایل اصولا از کجا شروع میشه ، میشه گفت اینطور که اول تمام فایل های اینکلود شده کامپایل میشن بعد برنامه های سورس فایل ها اعم از فایل اصلی برنامه و کتابخونه ها ؟

                          دیدگاه


                            #14
                            پاسخ : نوشتن کتابخانه برای iar

                            زمانی که چند فایل در یک برنامه وجود داشته باشد، با توجه به اینکه همه این فایل ها باید در نهایت بصورت یکپارچه و در یک فایل قرار بگیرند، به غیر از کامپایل تک تک این فایل ها باید یک عملیات لینک هم بین فایلهای object حاصل از هر سورس مجزا انجام شود. به همین دلیل ممکن است یک فایل به تنهایی در پروسه کامپایل خطایی نداشته باشد. اما در قرار گرفتن و لینک با سایر فایل ها و تبدیل شدن همه فایل ها به یک فایل واحد، دچار مشکل شود. اما جزئیات و ترتیب عملکرد کامپایلر و لینکر در برابر چند فایل و اینکه آیا یک یا چند pass مختلف یک فایل را کامپایل می کند (و ترتیب آن)، یک الگوریتم داخلی کامپایلر است و بدون قرار داشتن در جریان روش هایی که هسته یک کامپایلر مانند IAR بر مبنای آن عمل می کند، در این مورد اظهار نظر دقیقی نمی توان ارائه کرد.
                            اوژن: به معنای افکننده و شکست دهنده است
                            دانایی، توانایی است-Knowledge is POWER
                            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                            دیدگاه


                              #15
                              پاسخ : نوشتن کتابخانه برای iar

                              :applause:
                              حالا فهمیدم چی به چی شد :job:
                              از دو استاد عزیز جناب طراح و آقا مجتبی بسیار متشکرم
                              کتابخونه ام رو برای مثالی که تو پست اول گفتم مینویسم بعد میزارم ببینید نظرتون چیه . :nerd:

                              دیدگاه

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