
راهنمای مصاحبه برای برنامهنویسی Embedded C
- ارسال شده توسط Reza Mehrabani
- تاریخ جولای 27, 2025
- دسته بندی آمادگی مصاحبه Embedded system
- نظرات 0 نظر
راهنمای مصاحبه برای برنامهنویسی Embedded C
برنامهنویسی Embedded C یکی از محبوبترین زبانها برای توسعه سیستمهای نهفته است که به دلیل سادگی و کارایی در پروژههای مختلف استفاده میشود. این مقاله به شما کمک میکند با سؤالات رایج مصاحبههای Embedded C آشنا شوید و پاسخهای حرفهای ارائه دهید.
سؤالات مصاحبه برای تازهکاران
۱. برنامهنویسی Embedded C چیست و چه تفاوتی با زبان C دارد؟
توضیح: این سؤال دانش پایه شما از Embedded C و تفاوتهای آن با C استاندارد را بررسی میکند.
پاسخ: Embedded C نسخهای از زبان C است که برای سیستمهای نهفته طراحی شده و از همان سینتکس C استفاده میکند. تفاوتها:
- C استاندارد: برای برنامههای دسکتاپ، مستقل از سختافزار.
- Embedded C: وابسته به سختافزار، پشتیبانی از عملیات ورودی/خروجی و بهینه برای منابع محدود.
۲. کد راهاندازی (Startup Code) چیست؟
پاسخ: کد راهاندازی قبل از تابع main اجرا میشود و وظایفی مانند مقداردهی اولیه پشته و تنظیم بردار وقفهها را انجام میدهد.
۳. ISR چیست؟
پاسخ: ISR یا Interrupt Service Routine تابعی است که در پاسخ به وقفههای سختافزاری یا نرمافزاری اجرا میشود. باید کوتاه و سریع باشد.
۴. اشارهگر Void چیست و چرا استفاده میشود؟
پاسخ: اشارهگر Void میتواند به هر نوع دادهای اشاره کند و برای انعطافپذیری استفاده میشود:
int num = 20;
void *ptr = #
printf("%d", *(int*)ptr);
۵. چرا از کلیدواژه volatile استفاده میکنیم؟
پاسخ: volatile به کامپایلر میگوید که متغیر ممکن است به صورت غیرمنتظره تغییر کند:
volatile int sensor_value;
۶. تفاوت بین const و volatile چیست؟
پاسخ:
const: متغیر را فقط خواندنی میکند.volatile: از بهینهسازی متغیر توسط کامپایلر جلوگیری میکند.
۷. عملگر اتصال (Concatenation Operator) چیست؟
پاسخ: عملگر ## در ماکروها آرگومانها را به صورت متنی ترکیب میکند:
#define CONCAT(x, y) x##y
int main() {
int xValue = 20;
printf("%d", CONCAT(x, Value));
}
۸. تاخیر وقفه (Interrupt Latency) چیست؟
پاسخ: مدت زمانی که ISR برای پاسخ به وقفه نیاز دارد.
۹. استفاده از متغیر یک فایل در فایل دیگر
پاسخ: با استفاده از extern:
// file1.c
int global_variable = 10;
// file2.c
extern int global_variable;
printf("%d", global_variable);
۱۰. خطای Segmentation Fault چیست؟
پاسخ: دسترسی به حافظه غیرمجاز، مانند اشارهگر NULL یا آرایه خارج از محدوده.
۱۱. تفاوت تابع Inline و ماکرو
پاسخ: ماکرو توسط پیشپردازنده گسترش مییابد و نوع داده را بررسی نمیکند، اما Inline توسط کامپایلر گسترش مییابد و امنتر است.
۱۲. آیا متغیر میتواند volatile و const باشد؟
پاسخ: بله، const تغییر توسط برنامه را ممنوع میکند، اما volatile تغییر توسط عوامل خارجی را مجاز میداند.
۱۳. تعریف متغیر static در فایل هدر
پاسخ: ممکن است، اما توصیه نمیشود، زیرا هر فایل منبعی نسخه جداگانهای از متغیر خواهد داشت.
۱۴. عملگرهای پیشکاهش و پسکاهش
پاسخ:
int x = 100, y;
y = --x; // y = 99, x = 99
y = x--; // y = 100, x = 99
۱۵. تابع Reentrant چیست؟
پاسخ: تابعی که میتواند متوقف شده و دوباره فراخوانی شود بدون مشکل.
سؤالات مصاحبه برای افراد با تجربه
۱۶. حلقه صعودی یا نزولی؟
پاسخ: حلقه نزولی به صفر بهینهتر است، زیرا مقایسه با صفر سریعتر است.
۱۷. اشارهگر Null چیست؟
پاسخ: اشارهگری که به هیچ آدرس معتبری اشاره نمیکند:
int *ptr = NULL;
۱۸. معنای اعلانهای زیر چیست؟
پاسخ:
const int x;: عدد صحیح فقط خواندنی.const int *x;: اشارهگر به عدد صحیح فقط خواندنی.int *const x;: اشارهگر ثابت به عدد صحیح.int const *x const;: اشارهگر ثابت به عدد صحیح فقط خواندنی.
۱۹. چرا ++i سریعتر از i+1 است؟
پاسخ: ++i از یک دستور ماشین استفاده میکند، اما i+1 نیاز به بارگذاری و جمع دارد.
۲۰. دلایل خطای Segmentation Fault و پیشگیری
پاسخ: دلایل: دسترسی به اشارهگر NULL، حافظه آزادشده یا آرایه خارج از محدوده. پیشگیری: مقداردهی اولیه اشارهگرها و بررسی حدود آرایه.
۲۱. استفاده از printf در ISR
پاسخ: خیر، printf غیرقابل بازگشت است و باعث تاخیر میشود.
۲۲. ارسال پارامتر یا بازگشت مقدار از ISR
پاسخ: خیر، ISR نمیتواند پارامتر دریافت کند یا مقداری برگرداند.
۲۳. حافظه مجازی در Embedded C
پاسخ: حافظه مجازی با صفحهبندی پیادهسازی میشود تا مصرف حافظه کاهش یابد.
۲۴. مشکل کد زیر چیست؟
int square(volatile int *p) {
return (*p) * (*p);
}
پاسخ: مقدار *p ممکن است تغییر کند. کد صحیح:
long square(volatile int *p) {
int x = *p;
return (long)x * x;
}
۲۵. آیا این ISR صحیح است؟
__interrupt double calculate_circle_area(double radius) {
double circle_area = 3.14 * radius * radius;
printf("Area = %f", circle_area);
return circle_area;
}
پاسخ: خیر، ISR نمیتواند مقدار برگرداند، پارامتر دریافت کند یا printf استفاده کند.
۲۶. نتیجه کد زیر چیست؟
void demo(void) {
unsigned int x = 10;
int y = -40;
if (x + y > 10) {
printf("Greater than 10");
} else {
printf("Less than or equals 10");
}
}
پاسخ: خروجی: Greater than 10، زیرا y به نوع بدون امضا تبدیل میشود.
۲۷. دلایل تاخیر وقفه و کاهش آن
پاسخ: دلایل: همگامسازی سختافزاری، خط لوله CPU، ISRهای طولانی. کاهش: کوتاه کردن ISRها و اولویتبندی وقفهها.
۲۸. محافظت از اشارهگر کاراکتری
پاسخ: با استفاده از char *const.
۲۹. اشارهگر Wild و Dangling
پاسخ:
- Wild: اشارهگری بدون مقداردهی اولیه.
- Dangling: اشارهگری به حافظه آزادشده.
۳۰. تفاوت #include "..." و #include <...>
پاسخ: "..." ابتدا دایرکتوری فعلی را جستجو میکند، <...> فقط دایرکتوریهای استاندارد.
۳۱. نشت حافظه و پیشگیری
پاسخ: نشت حافظه زمانی رخ میدهد که حافظه آزاد نشود. پیشگیری با free و ابزارهایی مثل Valgrind.
برنامهنویسی Embedded C
۳۲. ضرب عدد در ۹ به روش سریع
#include <stdio.h>
int main() {
int num;
printf("Enter number: ");
scanf("%d", &num);
printf("%d", (num << 3) + num);
return 0;
}
۳۳. تعویض دو متغیر
int a = 20, b = 30, temp;
temp = a;
a = b;
b = temp;
۳۴. بررسی توان ۲ بودن
#include <stdio.h>
int main() {
int num;
printf("Enter number: ");
scanf("%d", &num);
if (num && !(num & (num - 1)))
printf("Number is a power of 2");
else
printf("Number is not a power of 2");
return 0;
}
۳۵. چاپ اعداد ۱ تا ۱۰۰ بدون شرط
#include <stdio.h>
int main() {
int i = 0;
while (100 - i++)
printf("%d ", i);
return 0;
}
۳۶. ماکرو MIN
#define MIN(a, b) ((a) <= (b) ? (a) : (b))
نتیجهگیری
آمادگی برای مصاحبه Embedded C نیازمند درک عمیق مفاهیم C و بهینهسازی برای سیستمهای نهفته است. با تمرین این سؤالات، میتوانید با اعتماد به نفس در مصاحبه شرکت کنید.
ما کنار هم رشد می کنیم.
شما همچنین ممکن است دوست داشته باشید
مفاهیم پیشرفته FreeRTOS، پورت کردن و اصول بلادرنگ
مبانی FreeRTOS و مدیریت وظایف درEmbedded System
