اگر قسمت سوم آموزش میکروبلیز “ آموزش میکروبلیز قسمت سوم: آموزش زبان برنامهنویسی C ” را مطالعه کرده باشید به بحث جذاب متغیرها با شناسایی کلاسهای حافظه و همینطور به نحوه اصولی تعریف متغیر به همراه کلاسهای حافظه پرداختیم. حال در این قسمت میخواهیم ابتدا به تعریف اولیه عملگرها و در ادامه به انواع مختلف عملگرها به همراه تقدم آنها در برنامه نویسی به همراه مثالهای متعدد بپردازیم.
عملگر چیست؟
عملگر (Operator) در برنامهنویسی به ساختاری گفته میشود که رفتاری مشابه با تابع دارد اما از نظر سازمان گرامری با آن متفاوت میباشد.
از سوی دیگر در اکثر زبانهای برنامه نویسی، اجازه تعریف توابع به برنامه نویس داده میشود اما ممکن است تنها استفاده از عملگرهای از پیش تعریف شده در کدنویسی مجاز باشد. به علاوه تعداد عملوندها برخلاف تعداد پارامترهای توابع محدود هستند. اغلب عملگرها در زبانهای برنامهنویسی تنها یک یا دو عملوند دارند و تعداد اندکی از عملگرها از تعداد بیشتری عملوند برخوردار هستند (به عنوان مثال عملگر?: در زبان C یک عملگر سه عملوندی به شمار میرود در ادامه به این عملگر را بیشتر توضیح میدهیم). با وجود این تفاوتها میتوان بسیاری از عملگرها نظیر عملگر باقیماندهی تقسیم یک عدد بر عددی دیگر را با یک تابع دو پارامتری که چنین عملی را انجام میدهد معادل دانست.
محل قرارگیری عملگر در مقایسه با عملوندها میتواند مبتنی بر یکی از حالات پیشوندی، میانوندی و یا پسوندی باشد. به عبارت بهتر ممکن است عملگر پیش از عملوند، مابین عملوندها یا پس از عملوند قرار بگیرد. به عنوان مثال عملگرهای یکانی میتوانند همانند عملگر منفی (-x) به صورت پیشوندی یا مانند عملگر افزایشی (x++) به صورت پسوندی ظاهر شوند. عملگرهای دودویی همانند جمع نیز به صورت میانوندی (x + y) ظاهر میشوند.{منبع}
انواع عملگرها در برنامهنویسی زبان C
عملگرهای ریاضی ( Arithmetic Operators)
عملگرهای منطقی ( Logical Operators)
عملگرهای بیتی ( Bitwise Operators)
عملگرهای انتسابی (Assignment Operators)
عملگرهای رابطهای (Relational Operators)
عملگرهای متفرقه (Misc Operators)
عملگرهای محاسباتی (Arithmetic Operators)
قبل از اینکه به توضیح این بخش بپردازیم ابتدا به تصویری که مشاهده میکنید، دقت کنید.
همانطوری که در تصویر مشاهده میکنید در سمت چپ جدول عملگرها نوشته شده است و در نهایت پس از توضیح در مورد عملگر موردنظر یک مثال زده شده است حال میخواهیم به صورت کلیتر در مورد این عملگرها بپردازیم.
عملگر + :
از این عملگر زمانیکه بخواهیم دو مقدار را با یک دیگر جمع کنیم استفاده میکنیم البته صرفا برای دو عدد نیست. بلکه اگر کمی با دید یک برنامه نویس نگاه کنیم میتوانیم به صورت کلی بگوییم انجام هر عملی که در آن عمل جمع نیاز باشد صورت میگیرد میتوان از این عملپر استفاده کرد. به طور مثال :
C
1
2
3
4
5
6
7
shortA=24;
shortB=56;
intresult;
result=A+B;
عملگر – :
عملگر تفریق هم دقیقا مشابه عملگر بعلاوه است با این تفاوت که به جای عملیات جمع، عملیات تفریق صورت میگیرد.
C
1
2
3
4
shortA=24;
shortB=56;
intresult;
result=B-A;
عملگر * :
زمانیکه در برنامه بخواهیم دو متغیر را با یک دیگر ضرب کنیم از این عملگر استفاده میکنیم.
C
1
2
3
4
shortA=24;
shortB=56;
intresult;
result=B*A;
عملگر / :
زمانیکه در برنامه بخواهیم عمل تقسیم را انجام دهیم باید از این متغیر استفاده کنیم.
C
1
2
3
4
shortA=24;
shortB=56;
intresult;
result=B/A;
عملگر % :
از این عملگر هم جهت بدست آوردن مقدار باقیمانده تقسیم استفاده میکنیم.
C++
1
2
3
4
shortA=24;
shortB=56;
intresult;
result=B%A;
عملگر ++ :
این عملگر، یک عملگر افزایشی است که از آن برای افزایش یک واحدی برای متغیرها استفاده میکنیم.
C++
1
A++
عملگر — :
دقیقا عملکرد آن مثل عملگر افزایشی است با این تفاوت که به جای افزایش یک واحد به متغیر، یک واحد از متغیر کاهش میدهد.
C++
1
B--
عملگرهای منطقی (Logical Operators)
عملگر && :
از این عملگر جهت مقایسه دو مقدار در برنامه استفاده میشود و عملکرد آن به این گونه است که باید حتما دو مقدار برقرار باشد تا خروجی 1 شود در غیر اینصورت شرط برقرار نیست و در نهایت خروجی 0 خواهد ماند برای درک بهتر اجازه دهید که ابتدا با ساختار گیت AND آشنا شویم.
اگر به تصویر با دقت نگاه کنید میبینید که خروجی در تمامی حالات 0 است (شرط برقرار نیست) و فقط در یک حالت عبارت خروجی برابر با 1 است (شرط برقرار است) و آن زمانی است که دو عبارت A و B برابر با 1 باشند. برای بحث برنامه نویسی هم دقیقا این موارد صدق میکند. به عنوان مثال :
C++
1
A&&B
عملگر || :
این عملگر هم یک عملگر مقایسهای است و عملکرد آن هم مثل عملگر (&&) است البته با این تفاوت که اگر یکی از عبارات برقرار باشد خروجی مقدار آن صحیح است. برای درک بهتر به تصویری که در ادامه قرار میدهیم دقت کنید.
همانطوری که مشاهده میکنید دقیقا این گیت برعکس گیت AND عمل میکند یا به عبارت دیگر در صورتیکه یکی از مقادیر صحیح باشد مقدار خروجی آن 1 میشود و فقط در یک حالت شرط برقرار نمیشود و آن هم زمانی است که هیچکدام از شرط ها برقرار نباشند. طرز استفاده از آن هم در برنامه به صورت زیر است.
C++
1
A||B
عملگر ! :
اصطلاحا به این عملگر نقیض هم گفته میشود یعنی اینکه هر مقداری که میخواهد در خروجی قرار گیرد آن را نقیض یا NOT میکند. برای درک بهتر به تصویر زیر دقت کنید.
همانطوری که در تصویر مشخص شده است خروجی دقیقا برعکس مقدار ورودی است به عبارت دیگر مقدار خروجی NOT مقدار ورودی است. طرز استفاده از آن هم در برنامه به صورت زیر است.
C++
1
!(A&&B)
عملگرهای بیتی (Bitwise Operators)
قبل از اینکه به توضیح این دسته از عملگرها بپردازیم ابتدا باید با دو تعریف بایت و بیت آشنا شویم.
بیت چیست؟
Bit مخفف عبارت binary digit است. بیت، یک عدد در دستگاه اعداد دودویی و یکای اندازهگیری داده در رایانه است. هر ۸ بیت معادل ۱ بایت است. بیت کوچکترین واحد داده در ذخیره و بازیابی داده در رایانه محسوب میشود.
بایت چیست؟
بایت یکی از یکاهای اساسی سنجش مقدار دادهها در ادوات الکترونیکی دارای هسته است که به معنی هشت بیت متوالی است.
خب طبق تعاریفی که در بالا به آنها اشاره کردیم میخواستیم که این نکته را بیان کنیم. تمامی عملگرهایی که در ادامه میخواهیم به توضیح آنان بپردازیم در واقع فقط قادر به تغیر بیتها در برنامه میباشند که این کار، باعث دسترسی بیشتر برنامهنویس به میکروکنترلر میشود ( خلاصه یهو نگین این فرقش با بالایی چی بودها).
قبل از اینکه وارد توضیح این بخش از عملگرها شویم دو مقدار زیر را در نظر بگیرید.
C++
1
2
3
A=00111100
B=00001101
عملگر & :
این عملگر در واقع کار گیت منطقی AND را به صورت بیت به بیت انجام میدهد. به تصویری که در ادامه قرار میدهیم دقت کنید.
در واقع منطق این گیت به گونهای است که ، هر چیزی را که با مقدار صفر AND کند مقدار آن صفر میباشد و در غیر ینصورت یعنی هر چیزی که با مقدار یک AND شود خودش میشود. برای درک بهتر موضوع اجازه دهید که دو مقدار A و B را با یک دیگر AND کنیم (لطفا اول خودتون محاسبه کنید).
C++
1
A&B =00001100
عملگر | :
این عملگر در واقع کار گیت منطقی OR را به صورت بیت به بیت انجام میدهد. به تصویری که در ادامه قرار میدهیم دقت کنید.
در واقع منطق گیت OR به این گونه است که، هر مقداری که با یک OR شود مقدار آن یک میشود. برای درک بهتر سعی کنید که دو مقدار A و B را با یک دیگر OR کنید.
C++
1
A|B=00111101
عملگر ^ :
این عملگر در واقع کار گیت منطقی XOR را به صورت بیت به بیت انجام میدهد. به شکل زیر دقت کنید.
اگر به شکل بالا دقت کنید میتوان یک نتیجه کلی گرفت و آن را به کل نیز تعمیم داد.
در واقع میتوان گفت زمانیکه یکی از ورودی ها مقدار آن یک باشد خروجی هم مقداری برابر با عدد یک خواهد داشت. خب برای تمرین هم که شده است لطفا مقدار A و B را با یک دیگر XOR کنید.
C++
1
A^B=00110001
عملگر ~ :
این عملگر در واقع کار گیت منطقی NOT را به صورت بیت به بیت انجام میدهد. که در بخش عملگرهای منطقی عملکرد آن را توضیح دادهایم.
در واقع میتوان گفت که این عملگر ورودی را نقیض (NOT) حالت خروجی میکند. برای درک بهتر مقدار A و B را NOT کنید.
C++
1
2
3
~A=11000011
B=؟
عملگر >> :
این عملگر را اصطلاحا عملگر شیفت میگویند حالا نکته ای که وجود دارد این است که، طبق جهتی که قرار دارند چپ و راست بودن آنها مشخص میشود به طور مثال این (>>) عملگر را عملگر شیفت به چپ میگویند ( اگر به لبه جهت ها دقت کنید میبینید که جهت آنها سمت چپ میباشد).
اما کار این عملگر به چه صورتی است؟ در واقع همانطور که توضیح دادیم این عملگر کار شیفت به چپ را انجام میدهد.
شیفت دادن چیست؟ عمل شیفت یعنی اینکه شما قادر هستید مقدار یک بیت را به اندازه دلخواه در جهتی که میخواهید (چپ یا راست) جا به جا کنید. به طور مثال میخواهیم مقدار A را به انداره دو واحد به سمت چپ شیفت دهیم.
C++
1
A=001111000مقداراولیهA
C++
1
A<<2=>11110000
اگر مقدار اولیه A را با مقدار شیفت داده آن مقایسه کنید میبینید که این مقدار به اندازه دو واحد نیز تغیر کرده است.
عملگر << :
این عملگر را شیفت به راست میگویند ( به لبه ها دقت کنید چون سمت راست هستند به این عملگر شیفت به راست میگوییم). دقت کنید که دقیقا تعاریف بالا، برای این قسمت هم کاملا صدق میکند و از تعریف مجدد پرهیز میکنیم. حال اگر بخواهیم مقدار A را دو واحد به سمت راست شیفت دهیم باید چه تغییری در مقدار اولیه A ایجاد کنیم؟ و جواب نهایی به چه صورتی خواهد بود؟
C++
1
A=001111000مقداراولیهA
C++
1
A>>2=>00001111
تمرین: مقدار زیر را به ترتیب شیفت به چپ به اندازه 2 واحد، شیفت به راست به اندازه 3 واحد و شیفت به چپ به اندازه 4 واحد انجام دهید.
C++
1
B=00001101
عملگرهای انتسابی (Assignment Operators)
در واقع به این نوع از عملگرها، عملگرهای ترکیبی هم میگویند که تقریبا میتوان گفت از این نوع عملگرها جهت ساده سازی و خوانایی کد استفاده میکنند وگرنه از لحاظ عملکرد اصلی برنامه، تغیری در آن صورت نمیگیرد و تفاوتی در اصل برنامه ایجاد نمیکند. برای درک بهتر موضوع برای هر یک از عملگرها یک مثال میزنیم تا دید بهتری نسبت به این نوع از عملگرها پیدا کنیم.
عملگر = :
C++
1
C=A+B
عملگر =+ :
C++
1
2
3
C+=A
برابراستبا
C=C+A
عملگر =- :
C++
1
2
3
4
C-=A
برابراستبا
C=C-A
عملگر =* :
C++
1
2
3
4
5
C*=A
برابراستبا
C=C*A
عملگر =/ :
C++
1
2
3
4
5
C/=A
برابراستبا
C=C/A
عملگر =% :
C++
1
2
3
4
5
C%=A
برابراستبا
C=C%A
عملگر =>> :
C++
1
2
3
4
5
C<<=2
برابراستبا
C=C<<2
عملگر =<< :
C++
1
2
3
4
5
C>>=2
برابراستبا
C=C>>2
عملگر =& :
C++
1
2
3
4
5
C&=2
برابراستبا
C=C&2
عملگر =^ :
C++
1
2
3
4
5
C^=2
برابراستبا
C=C^2
عملگر =| :
C++
1
2
3
4
5
C|=2
برابراستبا
C=C|2
عملگرهای رابطهای (Relational Operators)
در واقع به این نوع از عملگرها، میتوان عملگرهای مقایسهای هم گفت. در واقع اگر به تصویر بالا دقت کنید مشاهده میکنید که از این عملگرها برای برسی یا مقایسه یک شرط نیز استفاده شده است که در ادامه برای هر یک از این عملگرها یک مثال میزنیم.
عملگر == :
دقت کنید این عملگر را با = اشتباه نگیرید.
سوال: چه تفاوتی بین عملگر = و == وجود دارد؟
عملگر = برای کپی کردن یک مقدار در یک متغیر به کار میرود اما عملگر == برای مقایسه دو مقدار با یک دیگر به کار میرود برای درک بهتر به مثالی که در ادامه میگذاریم دقت کنید.
از این عملگر برای نامساوی بودن بین دو مقدار یا متغیر استفاده میکنند همانطور که از مباحث قبلی میدانیم علامت ! به عنوان نقیض استفاده میشود و به عبارتی با هر چیزی که استفاده شود مقدار آن را نقیض میکند. پس اگر علامت = به معنی مساوی است قاعدتا علامت =! به معنای نامساوی است. برای درک بهتر موضوع به مثال زیر توجه کنید.
در واقع دلیل اینکه این دسته از عملگرها را متفرقه مینامیم، این است که، این دسته از عملگرها را نمیتوان جز سایر عملگرها قرار دهیم به همین دلیل این دسته از عملگرها را، متفرقه مینامیم .
عملگر sizeof : به جرات میتوانیم بگوییم که این عملگر، یکی از مهمترین عملگرهایی است که در زبان برنامه نویسی C وجود دارد. کار این عملگر یا در واقع مهمترین کار این عملگر به دست آوردن اندازه متغیر مورد نظر است که متاسفانه خیلی از تازه کارها از این عملگر استفاده نمیکنند و یا کاربرد آن را نمیدانند (اگر زبان C را با این آموزش ها شروع کرده اید توصیه میکنیم حتما و حتما از این عملگر در برنامه های خود استفاده کنید). اگر به زبان ساده بگوییم یکی از راههای دیباگ برنامه استفاده از همین متغیر است.
فرض کنید برنامه نوشتید که از در آن از نوع Double استفاده کردهاید در صورتیکه کار شما با نوع Float هم حل میشد اما شما با خود فکر کردید مقدار Float برای این کار کافی نیست( به صورت محاسبه سرانگشتی و آشنایی نداشتن با عملگر sizeof) برای اینکه مطمئن تر شوید در اینجا میتوانستید که از عملگر sizeof استفاده کنید و در نهایت دقیقا مقدار هر متغیر را محاسبه میکردید و در نهایت نوع متناسب با آن را در نظر میگرفتید. البته اگر هم به صورت اشتباه نوع Double را انتخاب میکردید مشکلی در کد هایی با حجم پایین مشکلی پیش نمیآمد اما در کد هایی با حجم بالا متوجه این موضوع میشدید. تفاوتی که بین اندازه Float و Double در میکروکنترلرهای سری CortexM است مقداری برابر 4 بایت است ( البته این مقدار بسته به نوع سخت افزار تغیر خواهد کرد یعنی حرفی رو که زدیم ممکنم هست که کاملا صدق نکنه برای همین، همیشه برای بدست آوردن اندازه متغیر ها از عملگر sizeof استفاده کنید.) که در کد های حجم بالا 4 بایت فضای خالی یعنی یک موفقیت بسیار بزرگ محسوب میشود( اهل دلش میدونن چی میگم).
طرز استفاده از این عملگر در زبان C به صورت زیر میباشد.
C++
1
sizeof(double)
عملگر & و * :
در واقع این دو عملگر با آدرس کار میکنند یعنی چی؟ اجازه دهید با یک مثال به توضیح این بخش بپردازیم. فرض کنید الان میخواهیم به دنیای داخلی میکروکنترلرها سفر کنیم (چشمها بسته) همینطور که مشاهده میکنید یک میکروکنترلر از چندین بخش مختلف تشکیل شده، مثل رابط های سختافزاری و نرمافزاری UART و I2C و IO و … خب هنوز باید بیشتر عمیق تر شویم اگر دقت کنید الان دقیقا رسیدیم به نقطه موردنظر، که همان اجزای تشکیل دهنده حافظه میکروکنترلر هستند ( خب کمربند ها رو محکم ببندید) اگر کمی با دقت تر نگاه کنیم میبینیم که این حافظه ها خودشان در واقع از فلیپ فلاپها ساخته شده اند ( حالا اینکه چرا فلیپ فلاپ؟ برمیگیرده به بحث مدارت ترکیبی و ترتیبی که در اینجا بحث ما نیست برای درک این نوع از مدارت به آموزش FPGA مراجعه کنید.) که دقیقا ما هم میخواستیم به همین نتیجه برسیم. اگر کمی به عقب تر برگردیم میبینیم که هر حافظه در دنیای میکروکنترلرها دارای یک آدرس خاص و منحصر به فرد مربوط به خود را دارد ( دوستان چشماتونو باز کنید). خب برگردیم به مبحث عملگرها، طبق توضیحاتی که دادیم مشخص شد که این عملگرها مثل اینکه با حافظه ها سر و کار دارند. بله دقیقا درست است.
در واقع عملگر * کاری را که انجام میدهد این است که به صورت غیر مستقیم به ما اجازه دسترسی به حافظه مربوطه را میدهد دقت کنید که به حافظه مورد نظر اشاره میکند و اگر به زبان عامیانه تعریف کنیم این عملگر برای هر متغیری که به کار رود یک آدرس از کل حافظه را در نظر میگیرد و مشخص میکند که این متغیر در آدرس xxxx حافظه قرار گرفته است. حال نوبت به عملگر & میرسد این عملگر کاری که انجام میدهد این است که حافظه آدرس دهی شده را فراخوانی میکند (دقت کنید حافظه مورد نظر رو نه اینکه محتوا اون، خیلی مهمه این موضوع، شاید برخی از دوستان این اشتباه رو کنند که فقط محتوا رو برمیگردونه نه اینطور نیست واقعا اتفاقی که میفته اینکه آدرس حافظه رو برمیگردونه حالا توی اون حافظه هر چی میخواد باشه لطفا دقت کنید). دقت کنید که در میکروبلیز بسیار این موضوع کاربرد دارد و از اهمیت بسیار بالایی برخوردار است. نحوه استفاده از این نوع عملگرها در زبان برنامهنویسی C به صورت زیر میباشد.
C++
1
2
3
4
5
P=&BآدرسBدرPقرارمیگیرد.
P=20*جاییکهآدرسآندرPاست(همانB),برابربا20میشود.
m=*PمحتویاتجاییکهآدرسشدرPاست(20)درmقرارمیگیرد.
البته اگر این مبحث کمی برایتان گنگ است جای ناراحتی ندارد ان شالله در قسمت های بعدی به طور کاملا مفصل به این موضوع خواهیم پرداخت (البته به شرط حیات).
عملگر : ? :
این عملگر، یک عملگر شرطی است که در نوشتن کتابخانهها واقعا کاربرد دارد و طرز استفاده آن به صورت زیر میباشد.
; <عبارت۲> : <عبارت ۱> ؟ <شرط >=متغیر
C++
1
2
3
4
shortB,L;
B=5;
L=B>5?B∗۲:B∗۵;
در واقع عملکرد برنامه بالا به صورت زیر میباشد.
اگر ارزش آن درست باشد عبارت ۱ برای انتساب مورد استفاده قرار میگیرد.
اگر ارزش آن نادرست باشد عبارت ۲ برای انتساب مورد استفاده قرار میگیرد.
عملگر کاما (Comma) :
در واقع از این عملگر برای انجام چند عمل در یک دستور به کار میرود.
; ( < عبارت ۲ > , < عبارت ۱ >) = متغیر
معمولا عبارت ۱ به نحوی با عبارت ۲ در ارتباط است . بعد از اینکه ارزیابی و اجرای عبارت ۱ به پایان رسید عبارت ۲ میتواند از نتیجه آن استفاده کند. به طور مثال به برنامه ای که در ادامه قرار گرفته است دقت کنید.
C++
1
2
3
intx,y;
y=(x=5,x*9/2);
تقدم عملگرها (Operators Precedence)
اگر به شکل بالا دقت کنید میبینید که عملگرها طبق یک قانون و قاعدهای اولویت بندی شدهاند که در واقع به این نکته اشاره میکند که استفاده از هر عملگر دارای یک اولویتی است که باید ابتدا به این موضوع تسلط داشته باشیم چون در در صورت ندانستن این اولویت بندیها، در جواب نهایی دچار اشتباه خواهیم شد. به طور مثال به کد زیر نگاه کنید.
C++
1
x=7+3*2;
به نظر شما جواب چه عددی است؟ خیر اشتباه حدس زدید جواب 13 است نه 20. دلیل این اتفاق هم چیزی جز رعایت نکردن این اولویت بندیها نیست چون اگر به تصویر بالا دقت کنید تقدم عمل * بیشتر از + است در نهایت اتفاقی که میافتد ابتدا عمل ضرب صورت میگیرد و در نهایت جمع میشود.
خب سوالی که شاید برای خیلی از شماها پیش آید این است که باید ترتیب این اولویت بندی ها را باید حفظ باشیم؟ خیر هیچ نیازی نیست بلکه راهحل این است که از پرانتز() برای اولویت بندی در برنامهها استفاده کنیم دلیل این کار هم این است که، پرانتز () بالاترین تقدم را نسبت به همه عملگرها دارد. به طور مثال اجازه دهید که برنامه بالا را تصحیح کنیم.
C++
1
x=(7+3)*2;
خب حالا به نظر شما جواب چند است؟ بله درست حدس زدید 20 جواب درست است. دلیل هم این است که تقدم پرانتز بیشتر از عمل ضرب است پس اتفاقی که میافتد این است که ابتدا محاسبات داخل پرانتز صورت میگیرد و در نهایت عمل ضرب صورت میگیرد.
امیدوارم که این آموزش هم برای شما عزیزان مفید واقع شده باشد.
سلام
خیلی مفصل و کامل بود.خدا قوت .
سوالی داشتم : آیا میشه میکروبلیز رو روی SoC ها هم اجرا کرد ؟ مثلا پردازنده های زینک سری7 خود شرکت زایلینکس . قطعا نرم افزار Vivado باید پشتیبانی کنه دیگه …
خیر، چون خود SOC که شما اشاره کردید در واقع نوعی میکروکنترلر هستند و تقریبا هم عملکردی مشابه با میکروبلیز انجام میدهند. البته اگر منظورتون رو درست متوجه شده باشم
حالا اینکه دقیقا میکروبلیز چیه و چیکار میکنه و ….
ان شالله در قسمت های بعدی به این مبحث جذاب خواهم پرداخت
با سلام و احترام،
گمان می کنم دوست من منظور شما رو دقیق متوجه نشده باشه. چون پاسخ سوال شما بله است. داخل تراشه zynq یک یا دو هسته پردازشی ARM داریم که می تواند بسیار پرقدرت تر جایگزین میکروبلیز شود. ولی در حالت کلی پیاده سازی میکروبلیز روی بخش PL تراشه zynq امکانپذیر است. @Hexalinx
سلام دوست عزیزم اولا متشکرم از توضیحاتی که دادید و اینکه در تکمیل صحبت هاتون دوست عزیزم در پاسخ به اقای امیر نیازه که اینجا یک سری توضیحات رو بدم که سوالاشون کاملا رفع ابهام شه.
اول از همه اجازه بدید من یک سری توضیحات اولیه رو بدم خدمتتون که مسله حل شه
میکروبلیز در واقع یک Softcore در واقع محسوب میشه یعنی اینکه شما به خودی خود روی FPGA چیزی به نام میکروبلیز نداری در صورت نیاز باید طبق روندی که در ادامه مقالات توضیح خواهیم داد این رو درست کنیم و در نهایت با اون به زبان C برنامه نویسی کنیم و ادامه ماجرا
حالا SOC اصطلاحا مخفیف واژه System on chip هستش که در واقع تلفیقی از دو نوع ARM و FPGA (دقت کنید که مفهوم SOC در واقع چیز دیگری است من فقط برای مثال اینجوری گفتم خدمتتون امیدوارم سو برداشت نشه ) در کنار همدیگه هستش یعنی چی؟ یعنی اینکه مثلا توی سری های مثلا زینک ما دو قسمت داریم به نام PL و PS خب سوالی که اینجا ممکنه براتون پیش بیاد اینکه PS و PL چیه اصلا؟
PS در واقع مخفف واژه processing system هست که اگر به معنی دقت کنید یعنی اینکه دارای یک پروسسور یا اصطلاحا پردازنده است که توسط یک راه ارتباطی (باس) پر سرعت (AXI) کار میکنه. حالا اینکه این پروسسور یه هسته مجزا توی FPGA یا با گیت منطقی دقیقا کار میکنه و … سوالاتی که توی ذهنتونه اجازه بدید که بیشتر دیگه ادامه ندم واقعا بخوام بگم خودش باز دنیای دیگه ای اصلا یه مقاله ای میشه برا خودش
PL مخفف واژه peripherals implemented هست به این معنی که شما قادر هستی به صورت نرمافزاری IP موردنظرتو پیاده سازی کنی دقیقا مثل میکروبلیز که در ادامه اموزش ها این کار رو خواهیم کرد ( من اگر خیلی توضیح نمیدم چون در ادامه مقالات مفصلا به این ها خواهیم پرداخت بلاخص در مورد باسهای AXI و AHB و PLB و اصل معماری میکروبلیز و زینک و ….
که در نهایت ان شالله ( به شرط حیات البته ) تفاوت معماری نوع زینک و میکروبلیز رو اشاره خواهیم کرد و اگر خیلی مشتاق بودید در مورد پیکوبلیز هم مقایسه ای انجام خواهیم داد ماشالله خیلی مباحث گستردس هر چی بگم بازم فکر میکنم کمه )
خب اگر یه نتیجه گیری کنیم در واقع شما روی SOC خودتون بخش سخت افزاری که وجود داره که از نوع ARM هستش که کار میکروبلیز رو انجام میده نه تنها میکروبلیز بلکه با توانایی و قدرت بسیار بالاتری از میکروبلیز که شما قادر به انجام خیلی از کارهای پیچیده میکنه
اما اگر مدنظرتون اینکه حتما میکروبلیز رو پیاده سازی کنید همونطوری که دوست عزیزم گفتند و طبق توضیحاتی که داده شد شما قادر هستید در بخش نرمافزاری یا PL این کار رو انجام بدید
اما با وجود اون هسته قدرتمند ارم کار خیلی درستی به نظر نمیرسه ولی از لحاظ شدنی کاملا این کار شدنی است دوست عزیزم ( امیدوارم که اقا امیر این دفعه درست متوجه منظورتون شده باشم).
بنده هم خیلی خوشحال میشم که شما عزیزان در این حوزه فعال هستید و حقیقتا باعث دل گرمی بنده است.
ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموتهای درب بازکن تا ریموتهای دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی میکنند و آنهم ارسال اطلاعات بهصورت بیسیم است....
امنیت همیشه و در همهی اعصار، مقولهی مهم و قابلتوجه ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموتهای کنترل خواهیم پرداخت....
ممنون از زحمات شما
امیدوارم همینگونه با انرژی ادامه بدین به این کار زیبا
سلام وقت بخیر .برای پروژه حضور وغیاب تصویری با رسپری پای چه وسایلی مورد نیاز هست؟
سلام
احتمالا یه برد رزبری پای + یک دوربین (میتونه وبکم هم باشه) و شاید اگه بخواید چیزی رو نمایش بدید یه lcd 🙂
البته یه تغذیه هم باید داشته باشید دیگه
سلام و خداقوت!
این سری اموزش ها که مفصل به c میپردازه خیلی خیلی لازم بود ممنون که چنین اموزش خوبی منتشر میکنید
حتما ادامه بدید
سلام دوست عزیز
به زودی خبر های خوبی در همین راستا از سیسوگ خواهید شنید.
توضیحات عالی و پر محتوا بودند . ممنون . اگه کمی هم درمورد عملگر های پیش پردازنده توضیح بدید عالی میشه .
من از # , ## استفاده های خوبی داشتم .
سلام دوست عزیزم لطفا سری مقالات میکروبلیز رو از دست ندید چون به تک تک این موارد در صورت نیاز برنامهنویس حتما پرداخته خواهد شد.
ممنون از اینکه با نظراتتون بنده رو بیشتر راغب می کنید که این سری از مباحث رو با قدرت بیشتری ادامه بدم.
موفق باشید.
سلام
خیلی مفصل و کامل بود.خدا قوت .
سوالی داشتم : آیا میشه میکروبلیز رو روی SoC ها هم اجرا کرد ؟ مثلا پردازنده های زینک سری7 خود شرکت زایلینکس . قطعا نرم افزار Vivado باید پشتیبانی کنه دیگه …
سلام دوست عزیزم
خیر، چون خود SOC که شما اشاره کردید در واقع نوعی میکروکنترلر هستند و تقریبا هم عملکردی مشابه با میکروبلیز انجام میدهند. البته اگر منظورتون رو درست متوجه شده باشم
حالا اینکه دقیقا میکروبلیز چیه و چیکار میکنه و ….
ان شالله در قسمت های بعدی به این مبحث جذاب خواهم پرداخت
موفق باشید دوست عزیزم
با سلام و احترام،
گمان می کنم دوست من منظور شما رو دقیق متوجه نشده باشه. چون پاسخ سوال شما بله است. داخل تراشه zynq یک یا دو هسته پردازشی ARM داریم که می تواند بسیار پرقدرت تر جایگزین میکروبلیز شود. ولی در حالت کلی پیاده سازی میکروبلیز روی بخش PL تراشه zynq امکانپذیر است. @Hexalinx
از آموزش بسیار خوب BLO OM ممنونم.
سلام دوست عزیزم اولا متشکرم از توضیحاتی که دادید و اینکه در تکمیل صحبت هاتون دوست عزیزم در پاسخ به اقای امیر نیازه که اینجا یک سری توضیحات رو بدم که سوالاشون کاملا رفع ابهام شه.
اول از همه اجازه بدید من یک سری توضیحات اولیه رو بدم خدمتتون که مسله حل شه
میکروبلیز در واقع یک Softcore در واقع محسوب میشه یعنی اینکه شما به خودی خود روی FPGA چیزی به نام میکروبلیز نداری در صورت نیاز باید طبق روندی که در ادامه مقالات توضیح خواهیم داد این رو درست کنیم و در نهایت با اون به زبان C برنامه نویسی کنیم و ادامه ماجرا
حالا SOC اصطلاحا مخفیف واژه System on chip هستش که در واقع تلفیقی از دو نوع ARM و FPGA (دقت کنید که مفهوم SOC در واقع چیز دیگری است من فقط برای مثال اینجوری گفتم خدمتتون امیدوارم سو برداشت نشه ) در کنار همدیگه هستش یعنی چی؟ یعنی اینکه مثلا توی سری های مثلا زینک ما دو قسمت داریم به نام PL و PS خب سوالی که اینجا ممکنه براتون پیش بیاد اینکه PS و PL چیه اصلا؟
PS در واقع مخفف واژه processing system هست که اگر به معنی دقت کنید یعنی اینکه دارای یک پروسسور یا اصطلاحا پردازنده است که توسط یک راه ارتباطی (باس) پر سرعت (AXI) کار میکنه. حالا اینکه این پروسسور یه هسته مجزا توی FPGA یا با گیت منطقی دقیقا کار میکنه و … سوالاتی که توی ذهنتونه اجازه بدید که بیشتر دیگه ادامه ندم واقعا بخوام بگم خودش باز دنیای دیگه ای اصلا یه مقاله ای میشه برا خودش
PL مخفف واژه peripherals implemented هست به این معنی که شما قادر هستی به صورت نرمافزاری IP موردنظرتو پیاده سازی کنی دقیقا مثل میکروبلیز که در ادامه اموزش ها این کار رو خواهیم کرد ( من اگر خیلی توضیح نمیدم چون در ادامه مقالات مفصلا به این ها خواهیم پرداخت بلاخص در مورد باسهای AXI و AHB و PLB و اصل معماری میکروبلیز و زینک و ….
که در نهایت ان شالله ( به شرط حیات البته ) تفاوت معماری نوع زینک و میکروبلیز رو اشاره خواهیم کرد و اگر خیلی مشتاق بودید در مورد پیکوبلیز هم مقایسه ای انجام خواهیم داد ماشالله خیلی مباحث گستردس هر چی بگم بازم فکر میکنم کمه )
خب اگر یه نتیجه گیری کنیم در واقع شما روی SOC خودتون بخش سخت افزاری که وجود داره که از نوع ARM هستش که کار میکروبلیز رو انجام میده نه تنها میکروبلیز بلکه با توانایی و قدرت بسیار بالاتری از میکروبلیز که شما قادر به انجام خیلی از کارهای پیچیده میکنه
اما اگر مدنظرتون اینکه حتما میکروبلیز رو پیاده سازی کنید همونطوری که دوست عزیزم گفتند و طبق توضیحاتی که داده شد شما قادر هستید در بخش نرمافزاری یا PL این کار رو انجام بدید
اما با وجود اون هسته قدرتمند ارم کار خیلی درستی به نظر نمیرسه ولی از لحاظ شدنی کاملا این کار شدنی است دوست عزیزم ( امیدوارم که اقا امیر این دفعه درست متوجه منظورتون شده باشم).
بنده هم خیلی خوشحال میشم که شما عزیزان در این حوزه فعال هستید و حقیقتا باعث دل گرمی بنده است.
موفق باشید.