جمعه , ۳ آذر ۱۳۹۶
آخرین نوشته‌ها
خانه | سیستم های نهفته | برنامه‌نویسی | زبان C | زبان C – ساختن کتابخانه (جلسه ۱۳)

زبان C – ساختن کتابخانه (جلسه ۱۳)

یک سلام به زیبایی فصل رنگارنگ پاییز خدمت شما کاربران دوست داشتنی میکرولرن 🙂

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

چرا کتابخانه بنویسیم؟

قبل از هر چیزی توصیه می کنم حتما پست مفاهیم مهم برنامه نویسی را مطالعه کنید. در این مطلب به طور مفصل در مورد ماژول نرم افزاری توضیح دادیم و اشاره کردیم که چه فایده و کاربردی دارد. هم چنین اشاره شد که زبان C امکان برنامه نویسی ماژولار را ندارد ولی با استفاده از فایل های سورس (c.) و هدر (h.) می توان تا حدودی سبک برنامه نویسی ماژولار را پیاده سازی کرد. حال در جلسه امروز می خواهیم به صورت عملی یک کتابخانه در زبان C بنویسیم. این کتابخانه همان حکم ماژول نرم افزاری در زبان C را دارد. لازم به ذکر است که چون هدف از آموزش زبان C در وب سایت میکرولرن، استفاده از آن در میکروکنترلرها می باشد؛ بنابراین کتابخانه نوشته شده را در IDE پرطرفدار Atmel studio هم تست خواهیم کرد.

فایل های یک کتابخانه

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

در ادامه جهت آشنایی با کتابخانه نویسی، یک کتابخانه ی اولیه را می نویسم و سپس یک نمونه کتابخانه از قبل نوشته شده برای LCD کاراکتری را بررسی می کنیم. در مرحله ی بعدی روش افزودن آن به پروژه در Atmel studio را برای شما تشریح خواهیم کرد. دقت داشته باشید که موارد اشاره شد در جلسات گذشته در ویدیو توضیح داده نخواهد شد. بنابراین حتما جلسات پیش نیاز را مطالعه بفرمایید.

ویدیوی شماره یک – مقدمات

ویدیوی شماره دو – تست در محیط Atmel studio

این جلسه می تونه خیلی براتون استفاده کاربردی تر نسبت به جلسات قبل داشته باشه. در واقع یه جورایی سبک برنامه نویسی شما را چند سطح بالاتر می بره. سعی کنید تکرار و تمرین زیادی روی مطالب این جلسه داشته باشید. ممنون میشم اگه ویدیوهای امروز را با دوستاتون و هم چنین شبکه های اجتماعی که لینکشون زیر همین پست هست به اشتراک بگذارید. 🙂

درباره‌ی احسان

کارشناس الکترونیک و کارشناس ارشد مخابرات سیستم | زمینه ی تحقیقاتی : هوش مصنوعی و شبکه های عصبی عمیق (CNN)، پردازش تصویر و ویدیو، تعقیب اشیا متحرک |‌برنامه نویس میکروکنترلرهای AVR و ARM و بردهای رزبری پای | مسلط به زبان های برنامه نویسی C و Python

۱۴ ديدگاه

  1. سلام
    ببخشید هر فایل ال سی دی که اینکلود میکنم از جمله همین فایل های کتابخانه ای که شما اسفاده کردید خطای زیر رو میده:
    Severity Code Description Project File Line
    Error undefined reference to `lcd_init(unsigned char)
    هیچ چیزی هم ننوشتم به محض نوشتن تابع شروع کننده ال سی دی این خطا رو میزنه

    • برای استفاده از تابع ابتدا باید هدر فایل اون را در جای مناسب معرفی کنید. این خطا به این خاطره که نمیتونه تعریف تابع را پیدا کنه.

  2. سلام مهندس.
    من یه مشکل در ساخت کتابخانه ی جدید در atmel studio دارم.شما میتونید کمک کنید؟

  3. سلام
    از اموزشه خوبتون بسیار ممنون
    در صورت امکان اگر این اموزش رو در محیط کدوژن نیز تست کنید…
    ممنون میشم

  4. متشکر بابت جوابتون. حق با شما بود و با بازسازی محتوای هدرها مشکلم حل شد. فقط یک سوال ! همون طور که میدونید در اتمل استادیو برای استفاده از تابع _delay_ms باید فرکانس کار سی پی یو نیز تعریف بشه تا تابع بتونه محاسباتش رو درست انجام بده. حالا اگر ما توی کتابخونه هامون از این تابع استفاده کرده باشیم آیا باید در همه اونها فرکانس سی پی یو رو تعریف کنیم یا اینکه اگر فقط یک بار توی صفحه اصلی برنامه ( main ) فرکانس رو مشخص کنیم کافیه ؟

    • خواهش می کنم. خوشحالم که نتیجه گرفتید از کار خودتون. 🙂
      ببینید اگه شما در کد خودتون بخواید از این تابع استفاده کنید یا باید در اون فایل از define استفاده کنید و فرکانس cpu را تعریف کنید. یا اینکه در یک فایل که من ترجیح میدم اسمشو global بذارم این تعریف و سایر تعاریف عمومی برنامتون را بیارید و در ابتدای هر کدوم از فایل های کتابخونتون Include کنید.

  5. سلام. من دو تا فایل هدر دارم که هر کدوم دارای توابع مربوط به خودشان هستند. وقتی هر کدام از آنها را در اتمل استادیو اینکلود می کنم، توابع داخل برنامه من قابل اجرا هستند. مشکلم اینجاست که وقتی دو تا هدر رو همزمان در پروژه اضافه می کنم، فقط هدر اولی توابعش کار می کنه و اگر از توابع دومی استفاده کنم خطا میده و کامپایل نمی کنه. چرا ؟

    • سلام به شما دوست گرامی
      مشکلی که شما می فرمایید بدون دیدن کد خیلی قابل بررسی نیست و پاسخی که من میدم ممکنه لزوما برای شما درست نباشه. اما اون طور به نظر میرسه که فایل های این دو تا کتابخونه با هم دیگه تداخل دارند یا از منابع و متغییرهای مشترکی که به درستی محدوده ی حافظه براشون تعریف نشده دارن استفاده میکنن. حتما بررسی دقیقی از این نظر انجام بدید تا مطمئن بشید که توابع دو کتابخونه مشکلی نداشته باشند.

  6. عااااااااااااااااااااااااالیییییییییییییییییییییییییییییییییییی هستید.
    چندین وقت هست که دنبال آموزش کتابخونه نویسی هستم……
    دمتوم گرممممممممممممممممممممممممم

  7. سلام مهندس خسته نباشید من دوتا سوال شبیه به هم دارم:
    من قبلا یجا خوندم نوشته بود توی کتابخونه باید توابع به صورت extern تعریف بشن! منظور از این مفهوم چیه؟ همین رو تو اینترنت سرچ کردم ولی نتیجه اونی که میخواستم نشد ولی بجاش اینارو آورد که که باعث سردرگمی بیشتر من شد: توی زبان c یه مبحثی هست در مورد حافظه که یه موردش حافظه extern هستش و موردای دیگش حافظه رجیستر و حافظه استاتیک و اوتوماتیک (البته تو کامپیوتر)! این موارد آیا تو میکرو هم هستن؟ اگر هستن چجورین؟! لازمه چیزی ازشون بدونیم؟
    ممنون از زحماتتون. ببخشید که سوالات عجیب و غریب میپرسم!

    • سلام حسین جان
      بله چیزی که خوندی درسته. توابع کتابخانه ها رو معمولا از نوع extern انتخاب می کنن تا از سایر فایل های پروژه هم قابلیت فراخوانی داشته باشند. حالا اگه تابعی از نوع static انتخاب بشه فقط در محدوده فایل خودش قابل استفاده است و در فایل های دیگه ی برنامه تعریف نشده است. مباحثی هم که در مورد حافظه گفتی بسیار برای میکرو مهمه و حتما باید دربارشون مطالعه ی دقیقی کنی.

  8. خیلی مطلب خوب و کمک کننده ای بود. خصوصا با ویدیوهای کاملی که تهیه کرده بودین تونستم بحث را خوب متوجه بشم.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Time limit is exhausted. Please reload CAPTCHA.