راه‌اندازی کتابخانه ff.h

blog
۱۳۹۷-۰۸-۰۱
6 دقیقه

FAT File System چیست؟

بصورت ساده فرض کنید یک  حافظه فلش یا رم …  در اختیار دارید,و قراره از این حافظه جهت ذخیره اطلاعات استفاده کنید, به عنوان یک مهندس الکترونیک میدونید که در حالت عادی میتونید یک بایت یا یک سکتور از اطلاعات را در هر بار تغییر بدید.

حالا فرض کنید این اطلاعات لازمه در دسته بندی های مختلف مدیریت بشند و هر بار بتونید اطلاعات جدیدی را به یک دسته اضافه یا حذف کنید و یا بتونید حتی دسته ای را حذف نمایید.

برای مدیریت چنین حافظه هایی استانداردهایی وجود دارد که یکی از معروفترین آنها استانداردهایی هست که مایکروسافت ایجاد کرده و برخی از اونها تحت عنوان FAT شناخته میشند, مانند FAT16 FAT32 …

در این ساختار  دسته بندی اطلاعات تحت عنوان فایل ذخیره میشه و کلی قابلیت دیگه هم در ساختار FAT دیده شده که به مرور به ورژنهای بالاتر اضافه شده است.

درباره این آموزش – مقدمه

وقتی قراره پروژه الکترونیکی انجام بدید و  قراره مثلا حافظه مموری کارت را به پروژتون اضافه کنید استفاده از یک استاندارد مانند  FAT در مدیریت ذخیره سازی اطلاعات بر روی حافظه میتونه محاسن زیادی را برای شما  رقم بزنه

مثلا به راحتی میتونید اطلاعات را با سرعت بالا از کامپیوتر به حافظه و از حافظه به کامپیوتر انتقال بدید و همینطور میتونید مدیریت اطلاعاتتون را تحت یک استاندارد داشته باشید.

چندین سال پیش  آقایی به نام Chang در وب سایت شخصی اش کتابخانه ای برای FAT  منتشر کرده که مخصوص میکرو کنترلرهای با سرعت و رم پایین مثل AVR بوده و بسیار هم پرکاربرد  بوده و هست.

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

درباره‌ی راه‌اندازی کتابخانه ff.h

این نوشته آموزشی صرفا برای آشنایی اولیه و راه‌اندازی کتابخانه‌ی ff است و اصلاً به عنوان یک راهنمای کامل و جامع قابل استفاده نیست. برای اطلاعات بیشتر باید به راهنمای کتابخانه که در سایت elm-chang.org مراجعه نمایید.

در این پست آموزشی قرار است ما ضمن شبیه سازی برنامه نوشته شده در کدویژن با پروتئوس, حافظه مموری کارت را نیز با برنامه OSFMount که یک برنامه رایگان هست شبیه سازی نماییم.

درباره‌ی کتابخانه‌ها

این سایت منتشر کننده‌ی دو کتابخانه‌ی ff و pff برای کار با سیستم فایل FAT است. کتابخانه‌ی ff برای میکروکنترلرهایی مانند ATMega که حافظه‌ی کافی دارند یا میکروکنترلرهای قوی‌تر ساخته شده در حالیکه کتابخانه pff با کمی امکانات کمتر برای استفاده روی میکروکنترلرهای با حافظه‌ی کمتر مانند ATTiny ساخته شده است. با توجه به مقدار حافظه‌ای که نیاز داریم یکی از این دو کتابخانه را استفاده می‌کنیم.

درباره‌ی نرم‌افزار و سخت‌افزار

سیستم عامل مورد استفاده Windows 10 x64 Version 1703 Build 15063.540 است. مثال مطرح شده توسط برنامه‌ی CodeVisionAVR 3.12 Advanced نوشته و کامپایل شده است.

برای شبیه‌سازی نیز از نرم‌افزارهای Proteus 8.5 SP0 Build 22067 برای شبیه‌سازی منطق برنامه و دیدن خروجی و برنامه‌ی OSFMount 1.5 Build 1015 for 64-Bit Windows برای ایجاد فضای شبیه‌سازی شده‌ی فایل‌سیستم FAT و اختصاص فضای شبیه‌سازی خام برای برنامه‌ی Proteus استفاده شده است.

لازم به ذکر است که در این پست مثال مطرح شده فقط نرم افزاری  شبیه سازی شده است.

 

 

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

برنامه نوشته شده با کدویژن

  • کتابخانه‌های مورد استفاده معرفی شده‌اند تا از توابع موجود در آن‌ها در برنامه استفاده کنیم.
  • متغیرها و ساختارهای مورد استفاده که سعی شده نام‌گذاری آن‌ها متناسب با کارکردشان باشد.
  • وقفه‌ی تایمر 0 که در بازه‌های زمانی کوتاه اقدام به فراخوانی تابع disk_timeproc() می‌کند تا MemoryCard به حالت خواب نرود.
  • باقی کدها برای اجرای برنامه

تنظیمات تایمر 0 هم به این شکل انجام شده‌اند.

تنظیمات تایمر در کدویژن

یادتان باشد این تنظیمات برای شبیه‌سازی انجام شده‌اند و برای واقعیت باید از روی راهنمای کتابخانه محاسبه را انجام دهید. زمان اجرای تابع disk_timeproc() را باید هر 10 میلی‌ثانیه تنظیم کنید تا کارت حافظه فعال بماند.

 

 

 

همچنین از منوی

Project  ==>  Configure ==>  C Compiler  ==> Libraries  ==> MMC/SD/SD HC Card

تیک هر دو گزینه‌ی موجود را بزنید و باقی تنظیمات رو مطابق عکس انجام دهید.

 

تنظیمات مموری کارت در کدویژن

کدهای کامل برنامه هم در اتمام پست برای دانلود قرار گرفته است.

 

مدار را مطابق شماتیک زیر در پروتئوس ببندید و تنظیمات قطعات را مطابق عکس‌های زیر انجام دهید (حافظه‌ی مموری کارت 1MB در نظر گرفته شده است تا فایل نهایی پروژه جهت آپلود کم حجم شود):

 

 

همچنین از منوی

Project  ==> Configure  ==> C Compiler  ==> Libraries  ==> MMC/SD/SD HC Card

تیک هر دو گزینه‌ی موجود را بزنید و باقی تنظیمات رو مطابق عکس انجام دهید.

کدهای کامل برنامه هم در ادامه‌ی این مقاله و هم در ضمیمه آمده‌اند.

مدار را مطابق شماتیک زیر در پروتئوس ببندید و تنظیمات قطعات را مطابق عکس‌های زیر انجام دهید (حافظه‌ی مموری کارت 1MB در نظر گرفته شده است تا فایل نهایی پروژه جهت آپلود کم حجم شود):

 

راه‌اندازی کتابخانه ff.h

 

شبیه سازی در پروتئوس

 

را ه اندازی مموری کارت با کدویژن

 

بعد از اولین اجرای شبیه‌سازی Proteus پیام‌های خطایی خواهد داد که به دلیل نبودن فایل‌سیستم است! تصویر زیر را ببینید:

 

شبیه سازی مموری کارت در پروتئوس

 

 

راهکار حل مشکل این است که یک بار با استفاده از برنامه‌ی OSFMount فایل Image کارت حافظه که توسط پروتئوس ایجاد شده است را به ویندوز وصل کنیم تا بتوانیم آن را به فرمت FAT تبدیل کنیم.

ابتدا برنامه‌ی OSFMount را اجرا کنید و سپس از منوی File گزینه‌ی Mount new virtual disk را بزنید تا پنجره‌ی روبرو باز شود. مطابق شکل مقادیر پنجره را تنظیم کنید و روی OK کلیک کنید.

استفاده از OSFMount در پروتئوس

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

 

شبیه ساز حافظه

 

همچنین درایور F نیز به صورت زیر دیده شود:

شبیه سازی در نرم افزار پروتئوس

 

 

برای استفاده از درایو و تبدیل آن به FAT روی آن کلیک راست کرده و گزینه‌ی Format را انتخاب کنید. سپس تنظیمات را با توجه به شکل انجام دهید و سپس عملیات فرمت را Start کنید. پیام‌های هشدار را هم تأیید نمایید.

راه‌اندازی کتابخانه ff.h شبیه سازی فت فایل سیستم

 

 

چون حجم درایو را 1MB درنظر گرفتیم، فقط می‌توانیم از FAT12 استفاده کنیم؛ در حالیکه اگر حجم درایو را بیشتر می‌کردیم می‌توانستیم FAT16 و FAT32 رو هم توی گزینه‌ها ببینیم و با آن‌ها فرمت کنیم.

کار ما با درایو مجازی تمام شد! به برنامه OSMount برگردید و روی دکمه‌ی Dismount all & Exit کلیک کنید. با اجرای برنامه‌ی شبیه‌سازی شده در Proteus می‌بینید که ایندفعه برنامه به خوبی کار می‌کند و تا انتها پیش می‌رود. با Mount مجدد فایل SDcard می‌توانیم فایل ایجاد شده در فایل سیستم را هم ببینیم.

 

راه اندازی کتابخانه ff.h Fat file System با AVR

 

 

 

 

دانلود فایل آموزشی بصورت PDF

CodeVision-ff-MMC-library-Virtualization.pdf

دانلود سورس پروتئوس و کدویژن

SD_Card-Virtualization.zip

 

 

اطلاعات
28
0
لینک و اشتراک
profile

محمد امین حردانی

متخصص الکترونیک

Telegram, Eitaa, Gap, Bale: mahwaz Aparat: imahwaz

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

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

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

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

دیدگاه ها

profile
حمید رضا گفت :
۱۴۰۲-۰۷-۰۷ ۱۹:۱۰

سلام ممنون از آموزشتون
یه مشکل با این پروژه دارم. احتمال دادم شما بتونید مشکل را حل کنید
بنده تمام مراحلی که گفتید را انجام میدم و از هر دو مرحله write to disk و read from disk داخل پروتئوس جواب گرفتم (برنامه در کدویژن نوشته شده). ولی مشکلی اینه که: RAM Global variables size در کدویژن سریع مقدارش افزایش پیدا میکنه و بعد از گذاشتن چند تا شرط ساده بر روی این دستورات (برای اینکه بفهمم تونسته فایل را باز کنه یا نه … شرط گذاشتم)، این حافظه RAM خطای is too large رو میزنه و دیگه برنامه داخل کدویژن کامپایل نمیشه!

profile
نرگس گفت :
۱۴۰۰-۱۲-۰۲ ۱۳:۱۰

سلام
من با micro sd هشت گیگ و میکروی atxmega128a1u کار میکنم. کارت حافظه رو هم به صورت fat32 فرمت کردم. تیکه کد f_mount چه کارت حافظه توی سوکت باشه چه نباشه(که عجیبه به نظرم) ok میده ولی وقتی به f_open میرسه انگار گیر میکنه. احیانا میدونین ممکنه مشکل از چی باشه؟

profile
Zeus ‌ گفت :
۱۴۰۱-۰۱-۲۸ ۱۱:۵۸

سلام دوست عزیز تابع f_mount پارامتر دومی داره که میگه آیا بره واقعا دیسک رو چک کنه یا نه که معمولا صفر میذاریمش و برای همین ok رو برمیگردونه اون پارامتر رو یک کنید و خواهید دید که با خطا مواجه میشید
حالا این که مشکل از کجاست بستگی به خطایی که بر می‌گردونه داره

profile
فاطمه گفت :
۱۴۰۰-۰۸-۱۵ ۲۱:۰۷

سلام وقت بخیر ممنون از آموزش خوبتون من سوالی که داشتم اینه که اگه بخوایم به جای sd card این حرکت رو روی حافظه فلش که همون باspi کار می کنه بزنیم چه تغییری نیاز هست در کد ایجاد کنیم؟

profile
Zeus ‌ گفت :
۱۴۰۱-۰۵-۰۲ ۱۵:۱۲

خیلی بستگی داره که نوع حافظه فلش چی باشه
Nor باشه یا Nand باشه و برای هر کدام کتابخانه مناسبی وجود دارد
مثلا کتابخانه JFFS, JFFS2 و YAFFS رو ببینید

profile
محمد نوری گفت :
۱۴۰۰-۰۵-۰۱ ۲۰:۳۷

سلام.
تشکر از مطلب خوب و مفید تون.
1- بخش تایمر واقعا لازم است؟ کارت به حالت خواب بره مشکل چیه؟ فرض کنید خیلی وقتها اصلا با کارت حافظه کار نداریم.
مثلا یک فایل رو می خونیم و دیگه با کارت کاری نداریم. حالا چ نیازی به تایمر و خواب نرفتن کارت است؟

2- فرآیند خوندن از کارت به صورت یک سکتور 512 بایتی است یا بایت به بایت داره می خونه؟ چون تو کامپیوتر یک سکتور کامل خونده میشه.

profile
علی گفت :
۱۴۰۰-۰۴-۱۷ ۲۲:۰۷

سلام
تشکر
ولی چه طور میشه از طریق میکرو فایلی ایجاد کرد و داخل اون نوشت؟

profile
Zeus ‌ گفت :
۱۴۰۳-۰۱-۰۶ ۰۹:۲۷

مثال های chan رو ببینید داره همچین مثالی

profile
علی ن گفت :
۱۳۹۹-۰۳-۲۳ ۲۲:۵۰

سلام
من خیلی تلاش کردم که جواب بگیرم. از نظر سخت افزاری دقیقا مطابق چیزی که هست انجام دادم.
ولی هر کاری میکنم جواب نمیده.
این جمله فکرم رو خیلی در گیر کرده… که جمله نکته ی هست و ازش غافل شدم.!!
“یادتان باشد این تنظیمات برای شبیه‌سازی انجام شده‌اند و برای واقعیت باید از روی راهنمای کتابخانه محاسبه را انجام دهید.”
میشه یه نفر پیدا بشه مشکل من حل بشه الان سه ماه در گیرشم.
ممنون

profile
زئوس Zeus گفت :
۱۳۹۹-۰۴-۱۶ ۱۴:۳۹

سلام
راه اندازی این سخت افزار واقعا چیز پیچیده ای نداره از چه میکروکنترلر و نرم افزاری استفاده میکند اگر از میکروکنترلر ۵ ولت دارید استفاده میکنید از چه روشی منطق ۳.۳ رو ایجاد میکنید ؟

profile
علی ن گفت :
۱۳۹۹-۰۴-۱۶ ۲۱:۳۳

سلام
من از ماژول آماده استفاده میکنم داخل خودش رگولاتور داره.

profile
زئوس Zeus گفت :
۱۳۹۹-۰۴-۱۷ ۰۸:۵۵

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

profile
علی ن گفت :
۱۳۹۹-۰۴-۱۶ ۱۷:۲۴

سلام
ممنون از پاسخگویتون.
من از ATmega32 و نرم افزار Codevision استفاده میکنم.

profile
زئوس Zeus گفت :
۱۳۹۹-۰۴-۱۷ ۰۸:۵۵

خوب وقتی دارید از کدویژن استفاده میکنید – دیگه حتی نمیشه شک کرد که برنامه مشکل داره – احتمالا یه جایی یه چیزی کوچیکی رو در نظر گرفتید

profile
علی گفت :
۱۳۹۹-۰۱-۱۱ ۰۹:۳۹

سلام
من این برنامه رو داخل پروتئوس قرار میدم به خوبی جواب میده.
ولی تو عمل نمی تونم ازش جواب بگیرم!!!

profile
زئوس Zeus گفت :
۱۳۹۹-۰۱-۱۱ ۱۱:۲۰

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

profile
علی گفت :
۱۳۹۹-۰۱-۱۴ ۱۲:۰۴

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

profile
زئوس Zeus گفت :
۱۳۹۹-۰۱-۱۶ ۱۰:۱۸

اگه مطمئن هستید که سخت افزارتون با برنامه دیگه ای جواب میده – احتمالا باید پایه ای چیزی رو اشتباه تعریف کرده باشید توی این پروژه از کتابخانه های کدویژن استفاده شده است که احتمالا نباید مشکلی داشته باشند.
و این مقوله به ظرفیت حافظه هم ربطی نداره من با مموری ۱۶ گیگ هم تست کردم و مشکلی نداشتم پس از این بابت خیااتون راحت
ببنید توایع یه کد خطا بر میگردونن که معانی متفاتی دارند – اون کد خطا رو چک کنید بهتر میتونید به نتیجه برسید.

profile
علی ن گفت :
۱۳۹۸-۱۲-۲۹ ۲۰:۱۷

سلام
آیا میشه یه عدد مثلا دما رو ذخیره کرد و در کامپیوتر به صورت TEXT مشاهده کرد؟؟
ممنون

profile
زئوس Zeus گفت :
۱۳۹۹-۰۱-۰۲ ۱۳:۲۳

سلام دوست عزیز
بله میشه

profile
فایل سیستم در STM32 – نامینیک گفت :
۱۳۹۸-۰۷-۱۴ ۱۱:۱۶

[…] خوشبختانه قبل از اینکه این مقاله نوشته شود تقریبا از 20 سال پیش راه کاری به نام فایل سیستم برای مدیریت فایل ها بر روی حافظه ها در نظر گرفته شده است.(درباره فایل سیستم بیشتر بدانید) […]

profile
علی گفت :
۱۳۹۷-۱۰-۲۴ ۲۰:۱۳

برای آردوینو کتابخونه ی اس دی مناسب وجود نداره؟؟؟؟
البته منظورم اون کتابخونه ی داخل خود کامپایلر آردوینو نیست منظورم یه کتابخونه ی کم حجمه که بتونه میکرو های کوچیک تر مثل atmega8 سازگار باشه…
ممنون میشم راهنمایی کنید

profile
محمد گفت :
۱۳۹۷-۰۸-۰۲ ۱۴:۲۶

درود
من این کتابخونه رو روی میکرو arm اجرا کردم با رم microsd 4GB و FAT32… موقعی که برنامه اجرا میشه ارور 5 که بمعنی fr_no_file هستش رو میده در حالی که فایل با همون اسم داخل sd card هستش و ظاهرا مثل اینکه فایل رو پیدا نمیکنه.

profile
Sisoog Os گفت :
۱۳۹۷-۰۸-۰۵ ۰۹:۵۹

سلام
سخته در مورد این مشکل صحبت کنیم
با FAT16 هم یه تستی بزنید
شخصا این لایبرری را روی سخت افزار تست کردم و مشکلی نبوده
در ضمن مطمئن باشید که f_mount تونسته درست مموری و FAT را شناساییی کنه یعنی مقادیر برگشت را تست کنید
Return Values
FR_OK, FR_INVALID_DRIVE, FR_DISK_ERR, FR_NOT_READY, FR_NOT_ENABLED, FR_NO_FILESYSTEM

profile
محمد گفت :
۱۳۹۷-۰۸-۰۵ ۱۱:۳۷

update: با فرمت کردن microsd مشکل به کلی حل شد …
تابع f_mount هم مقدار برگشتی اش از اول FR_OK بود و کارت بخوبی شناسایی شده بود ولی با فرمت کارت و اضافه کردن فایل جدید به رم، تابع f__open هم مقدار fr_ok رو برگردوند و عکس مورد نظر روی ال سی دی نمایش داده شد از روی رم microsd .
ممنون از پاسخگویی تون . Like

profile
Sisoog Os گفت :
۱۳۹۷-۰۸-۰۵ ۱۶:۴۲

متشکر از شما

profile
Amir گفت :
۱۳۹۷-۰۸-۰۱ ۱۸:۱۰

جالب بود
سایت شما بنظر من جز 5 سایت برتر آموزش الکترونیک ایران هست .
امیدوارم ادامه دار باشه …

profile
Sisoog Os گفت :
۱۳۹۷-۰۸-۰۱ ۲۰:۰۹

متشکر از لطف شما و دوستانی که محتواهای خودشون را از این بستر منتقل میکنند

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله