Audio
🎧 بررسی عمیقتر AhuraRTOS
در راستای معرفی و بررسی پروژه AhuraRTOS که توسعهی آن توسط مهندس عسکری انجام شده، مطالبی که در ۵ بخش دربارهی معماری، هسته، زمانبندی، مدیریت منابع و قابلیتهای این RTOS بررسی و جمعآوری کردم و در روزهای قبل به اشتراک گذاشتم را ، به همراه مستندات اصلی پروژه در اختیار NotebookLM قرار گرفت. نتیجه، تولید ۳ فایل صوتی تحلیلی و توضیحی است که موضوعات مطرحشده را از زاویهای متفاوت و عمیقتر بررسی میکنند. گوش دادن به این فایلهای صوتی خالی از لطف نیست و میتواند درک کاملتر و عمیقتری از ساختار و نحوهی عملکرد AhuraRTOS ایجاد کند.
@Amin_Techlab
در راستای معرفی و بررسی پروژه AhuraRTOS که توسعهی آن توسط مهندس عسکری انجام شده، مطالبی که در ۵ بخش دربارهی معماری، هسته، زمانبندی، مدیریت منابع و قابلیتهای این RTOS بررسی و جمعآوری کردم و در روزهای قبل به اشتراک گذاشتم را ، به همراه مستندات اصلی پروژه در اختیار NotebookLM قرار گرفت. نتیجه، تولید ۳ فایل صوتی تحلیلی و توضیحی است که موضوعات مطرحشده را از زاویهای متفاوت و عمیقتر بررسی میکنند. گوش دادن به این فایلهای صوتی خالی از لطف نیست و میتواند درک کاملتر و عمیقتری از ساختار و نحوهی عملکرد AhuraRTOS ایجاد کند.
@Amin_Techlab
👍6🔥1
🚀 نکات کوتاه و کاربردی زبان C
اگه با C، میکروکنترلرها و سیستمهای Embedded کار میکنی، این پلیلیست رو از دست نده! 👨💻⚡️
توی این مجموعه از YouTube Shorts، نکات، ترفندها و مفاهیم کاربردی زبان C رو در ویدیوهای کوتاه و سریع بررسی میکنیم؛ مناسب برای یادگیری و مرور سریع.
▶️ مشاهده پلیلیست (نکات و ترفندهای زبان |C Programming Tips)
https://www.youtube.com/playlist?list=PLf9OiDN9PuA4
@Amin_Techlab
اگه با C، میکروکنترلرها و سیستمهای Embedded کار میکنی، این پلیلیست رو از دست نده! 👨💻⚡️
توی این مجموعه از YouTube Shorts، نکات، ترفندها و مفاهیم کاربردی زبان C رو در ویدیوهای کوتاه و سریع بررسی میکنیم؛ مناسب برای یادگیری و مرور سریع.
▶️ مشاهده پلیلیست (نکات و ترفندهای زبان |C Programming Tips)
https://www.youtube.com/playlist?list=PLf9OiDN9PuA4
@Amin_Techlab
🔥4❤2👎1👾1
🚀 آشنایی با AhuraRTOS؛ یک RTOS ایرانی برای سیستمهای Embedded
در این ویدیو با AhuraRTOS آشنا میشویم؛ یک سیستمعامل بلادرنگ (RTOS) با تمرکز بر توسعه سیستمهای نهفته و Embedded.
اگر به حوزههای Embedded Systems، میکروکنترلرها، RTOS، طراحی Firmware و سیستمهای بلادرنگ علاقهمند هستید، این ویدیو میتواند شروع خوبی برای آشنایی با این پروژه باشد.
دیدن پروژههایی از این جنس، علاوه بر جنبه فنی، میتواند قدمی برای شکلگیری و توسعه اکوسیستم نرمافزارهای Embedded در ایران باشد.
🎥 تماشای ویدیو: معرفی AhuraRTOS | اولین RTOS ایرانی برای سیستمهای Embedded
@Amin_Techlab
در این ویدیو با AhuraRTOS آشنا میشویم؛ یک سیستمعامل بلادرنگ (RTOS) با تمرکز بر توسعه سیستمهای نهفته و Embedded.
اگر به حوزههای Embedded Systems، میکروکنترلرها، RTOS، طراحی Firmware و سیستمهای بلادرنگ علاقهمند هستید، این ویدیو میتواند شروع خوبی برای آشنایی با این پروژه باشد.
دیدن پروژههایی از این جنس، علاوه بر جنبه فنی، میتواند قدمی برای شکلگیری و توسعه اکوسیستم نرمافزارهای Embedded در ایران باشد.
🎥 تماشای ویدیو: معرفی AhuraRTOS | اولین RTOS ایرانی برای سیستمهای Embedded
@Amin_Techlab
❤3👍3🔥3
🧠مفهوم Lifetime و Storage Duration در زبان C — بخش اول
یکی از مفاهیم مهم در زبان C، مخصوصاً در Embedded Systems، درک نحوه ایجاد و از بین رفتن Objectها در حافظه است.
سه مفهوم مهم در این زمینه داریم:
این سه مفهوم به هم مرتبط هستند، اما یکسان نیستند.
🔹 Storage Duration چیست؟
در استاندارد C چهار نوع Storage Duration داریم:
در این بخش دو مورد مهمتر را بررسی میکنیم.
🔹 1. Automatic Storage Duration
یک متغیر Local معمولی معمولاً Storage Duration از نوع
مثلاً:
Object مربوط به
بهصورت ساده:
در بسیاری از سیستمها، چنین متغیرهایی معمولاً روی Stack قرار میگیرند؛ البته استاندارد C محل فیزیکی ذخیرهسازی را مشخص نمیکند.
🔹 2. Static Storage Duration
حالا به این مثال توجه کنید:
اگر تابع را سه بار اجرا کنیم:
خروجی:
چرا
چون
یعنی Object مربوط به آن در طول اجرای برنامه وجود دارد و با خروج از تابع از بین نمیرود.
⚠️ یک نکته بسیار مهم
استاندارد C درباره Storage Duration صحبت میکند، نه الزاماً محل فیزیکی حافظه.
در یک سیستم Embedded، محل نهایی Object میتواند توسط Compiler و Linker تعیین شود.
🔥 Scope ≠ Lifetime
یکی از اشتباهات رایج این است که Scope و Lifetime را یکی بدانیم.
مثلاً:
نام
اما Object مربوط به آن:
بنابراین:
ادامه دارد ....
@Amin_Techlab
یکی از مفاهیم مهم در زبان C، مخصوصاً در Embedded Systems، درک نحوه ایجاد و از بین رفتن Objectها در حافظه است.
سه مفهوم مهم در این زمینه داریم:
Scope
Lifetime
Storage Duration
این سه مفهوم به هم مرتبط هستند، اما یکسان نیستند.
🔹 Storage Duration چیست؟
Storage Duration مشخص میکند که فضای ذخیرهسازی یک Object چه مدت وجود دارد.در استاندارد C چهار نوع Storage Duration داریم:
1. Automatic
2. Static
3. Allocated
4. Thread
در این بخش دو مورد مهمتر را بررسی میکنیم.
🔹 1. Automatic Storage Duration
یک متغیر Local معمولی معمولاً Storage Duration از نوع
Automatic دارد.مثلاً:
void test(void)
{
int value = 10;
printf("%d\n", value);
}
Object مربوط به
value هنگام ورود به Block ایجاد میشود و با خروج از Block، Lifetime آن پایان پیدا میکند.بهصورت ساده:
Enter Block
↓
Object Created
↓
Use Object
↓
Exit Block
↓
Lifetime Ends
در بسیاری از سیستمها، چنین متغیرهایی معمولاً روی Stack قرار میگیرند؛ البته استاندارد C محل فیزیکی ذخیرهسازی را مشخص نمیکند.
🔹 2. Static Storage Duration
حالا به این مثال توجه کنید:
void counter(void)
{
static int count = 0;
count++;
printf("%d\n", count);
}
اگر تابع را سه بار اجرا کنیم:
counter();
counter();
counter();
خروجی:
1
2
3
چرا
count هر بار از صفر شروع نمیشود؟چون
count دارای Static Storage Duration است.یعنی Object مربوط به آن در طول اجرای برنامه وجود دارد و با خروج از تابع از بین نمیرود.
Program Start
↓
count exists
↓
counter() → 1
↓
counter() → 2
↓
counter() → 3
↓
Program End
↓
count lifetime ends
⚠️ یک نکته بسیار مهم
static را نباید صرفاً به معنی «ذخیره شدن در یک قسمت خاص از RAM» در نظر گرفت.استاندارد C درباره Storage Duration صحبت میکند، نه الزاماً محل فیزیکی حافظه.
در یک سیستم Embedded، محل نهایی Object میتواند توسط Compiler و Linker تعیین شود.
🔥 Scope ≠ Lifetime
یکی از اشتباهات رایج این است که Scope و Lifetime را یکی بدانیم.
مثلاً:
void test(void)
{
static int counter = 0;
counter++;
}
نام
counter فقط داخل همین Block قابل دسترسی است:Scope
→ نام counter کجا قابل مشاهده است؟
اما Object مربوط به آن:
Static Storage Duration
→ در طول اجرای برنامه باقی میماند.
بنابراین:
Scope
→ محدوده قابل مشاهده بودن نام
Storage Duration
→ مدت وجود Storage
Lifetime
→ مدت وجود یک Object مشخص
ادامه دارد ....
@Amin_Techlab
❤2👾2
Amin'sTechLab
🧠مفهوم Lifetime و Storage Duration در زبان C — بخش اول یکی از مفاهیم مهم در زبان C، مخصوصاً در Embedded Systems، درک نحوه ایجاد و از بین رفتن Objectها در حافظه است. سه مفهوم مهم در این زمینه داریم: Scope Lifetime Storage Duration این سه مفهوم به هم مرتبط هستند،…
🧠 Lifetime و Storage Duration در زبان C — بخش دوم
در بخش اول با
حالا برویم سراغ دو مفهوم دیگر:
و ببینیم این موضوع چگونه میتواند باعث Bugهای خطرناک در C شود.
🔹 3. Allocated Storage Duration
وقتی با
مثلاً:
بهصورت مفهومی:
مشکل زمانی ایجاد میشود که
مثلاً:
اینجا با یک Memory Leak مواجه میشویم.
⚠️ چرا Dynamic Memory در Embedded مهم است؟
در سیستمهای Embedded و مخصوصاً RTOS، استفاده نادرست از
ایجاد کند.
به همین دلیل در بسیاری از سیستمهای Real-Time، Dynamic Memory Allocation یا محدود میشود یا با طراحی بسیار کنترلشده استفاده میشود.
🔹 4. Thread Storage Duration
در C11 نوع دیگری از Storage Duration وجود دارد:
مثلاً:
در این حالت هر Thread نسخه مخصوص خودش از Object را دارد.
یعنی:
این مفهوم در برنامههای Multithreaded و RTOS اهمیت پیدا میکند.
🔥 حالا یک Bug بسیار مهم
به این کد نگاه کنید:
این کد مشکل دارد.
چرا؟
چون
وقتی تابع تمام شود:
بنابراین Pointer برگشتی دیگر به یک Object معتبر اشاره نمیکند.
این وضعیت را Dangling Pointer مینامیم.
❌ کد خطرناک
نباید به Objectی که Lifetime آن تمام شده، دسترسی داشته باشیم.
✅ یک روش متفاوت
میتوان از یک Static Object استفاده کرد:
در این حالت
اما این روش هم باید با توجه به شرایط استفاده شود؛ مخصوصاً در برنامههای چندنخی، چون چند Thread میتوانند به یک Object مشترک دسترسی داشته باشند.
🧠 Stack vs Heap
یک نکته مهم:
این عبارتها را نباید با Storage Duration یکی بدانیم:
Storage Duration یک مفهوم استاندارد در زبان C است.
اما Stack و Heap بیشتر به نحوه پیادهسازی و مدیریت حافظه توسط سیستم/Compiler/Runtime مربوط هستند.
بهصورت معمول:
اما این mapping یک الزام مستقیم استاندارد C نیست.
🎯 جمعبندی نهایی
چهار Storage Duration اصلی در C:
و همیشه این سه مفهوم را از هم جدا کنید:
💡 اگر در C با
درک همین موضوع میتواند جلوی بسیاری از مشکلات جدی در C، Embedded Systems، STM32 و RTOS را بگیرد.
@Amin_Techlab
در بخش اول با
Automatic و Static Storage Duration و همچنین تفاوت Scope و Lifetime آشنا شدیم.حالا برویم سراغ دو مفهوم دیگر:
Allocated
Thread
و ببینیم این موضوع چگونه میتواند باعث Bugهای خطرناک در C شود.
🔹 3. Allocated Storage Duration
وقتی با
malloc() حافظهای را تخصیص میدهیم، Storage مربوط به Object تا زمانی که آزاد شود باقی میماند.مثلاً:
int *p = malloc(sizeof(int));
*p = 100;
free(p);
بهصورت مفهومی:
malloc()
↓
Storage Allocated
↓
Object exists
↓
Use Object
↓
free()
↓
Lifetime Ends
مشکل زمانی ایجاد میشود که
free() را فراموش کنیم.مثلاً:
int *p = malloc(sizeof(int));
*p = 100;
/* free(p) فراموش شده */
اینجا با یک Memory Leak مواجه میشویم.
⚠️ چرا Dynamic Memory در Embedded مهم است؟
در سیستمهای Embedded و مخصوصاً RTOS، استفاده نادرست از
malloc() و free() میتواند مشکلاتی مثل:Memory Leak
Memory Fragmentation
Allocation Failure
Unpredictable Timing
ایجاد کند.
به همین دلیل در بسیاری از سیستمهای Real-Time، Dynamic Memory Allocation یا محدود میشود یا با طراحی بسیار کنترلشده استفاده میشود.
🔹 4. Thread Storage Duration
در C11 نوع دیگری از Storage Duration وجود دارد:
_Thread_local
مثلاً:
_Thread_local int counter;
در این حالت هر Thread نسخه مخصوص خودش از Object را دارد.
یعنی:
Thread 1 → counter #1
Thread 2 → counter #2
Thread 3 → counter #3
این مفهوم در برنامههای Multithreaded و RTOS اهمیت پیدا میکند.
🔥 حالا یک Bug بسیار مهم
به این کد نگاه کنید:
int *get_value(void)
{
int value = 100;
return &value;
}
این کد مشکل دارد.
چرا؟
چون
value یک Local Variable با Automatic Storage Duration است.وقتی تابع تمام شود:
get_value()
↓
value created
↓
return
↓
function ends
↓
value lifetime ends
بنابراین Pointer برگشتی دیگر به یک Object معتبر اشاره نمیکند.
این وضعیت را Dangling Pointer مینامیم.
❌ کد خطرناک
int *get_value(void)
{
int value = 100;
return &value;
}
نباید به Objectی که Lifetime آن تمام شده، دسترسی داشته باشیم.
✅ یک روش متفاوت
میتوان از یک Static Object استفاده کرد:
int *get_value(void)
{
static int value = 100;
return &value;
}
در این حالت
value دارای Static Storage Duration است و بعد از خروج از تابع همچنان وجود دارد.اما این روش هم باید با توجه به شرایط استفاده شود؛ مخصوصاً در برنامههای چندنخی، چون چند Thread میتوانند به یک Object مشترک دسترسی داشته باشند.
🧠 Stack vs Heap
یک نکته مهم:
این عبارتها را نباید با Storage Duration یکی بدانیم:
Stack
Heap
Static Memory
Storage Duration یک مفهوم استاندارد در زبان C است.
اما Stack و Heap بیشتر به نحوه پیادهسازی و مدیریت حافظه توسط سیستم/Compiler/Runtime مربوط هستند.
بهصورت معمول:
Automatic Object
↓
غالباً Stack
malloc()
↓
Heap / Allocator
Static Object
↓
Static Storage Area
اما این mapping یک الزام مستقیم استاندارد C نیست.
🎯 جمعبندی نهایی
چهار Storage Duration اصلی در C:
┌─────────────────────────┐
│ Automatic │
│ طول عمر مرتبط با Block │
├─────────────────────────┤
│ Static │
│ طول اجرای برنامه │
├─────────────────────────┤
│ Allocated │
│ تا زمان deallocation │
├─────────────────────────┤
│ Thread │
│ مرتبط با Thread │
└─────────────────────────┘
و همیشه این سه مفهوم را از هم جدا کنید:
Scope
→ نام کجا قابل دسترسی است؟
Storage Duration
→ Storage چه مدت وجود دارد؟
Lifetime
→ Object چه مدت وجود دارد؟
💡 اگر در C با
Pointer، static، malloc()، free() یا متغیرهای Local کار میکنید، همیشه این سؤال را از خودتان بپرسید:«این Object چه زمانی ایجاد میشود و دقیقاً چه زمانی Lifetime آن تمام میشود؟»
درک همین موضوع میتواند جلوی بسیاری از مشکلات جدی در C، Embedded Systems، STM32 و RTOS را بگیرد.
@Amin_Techlab
❤5👾2
🧠 مفهوم Stack Overflow در زبان C — بخش اول
وقتی در زبان C یک تابع را فراخوانی میکنیم، برنامه برای مدیریت اجرای آن تابع به فضایی از حافظه به نام Stack نیاز دارد.
اما اگر این فضا بیش از ظرفیت خود مصرف شود، چه اتفاقی میافتد؟
💥 Stack Overflow
🔹 Stack چیست؟
Stack بخشی از حافظه RAM است که برای مدیریت اجرای توابع استفاده میشود.
در زمان اجرای یک تابع، اطلاعاتی مانند:
• متغیرهای Local
• پارامترهای تابع
• آدرس بازگشت
• برخی Registerها و اطلاعات موقتی
در Stack Frame مربوط به آن تابع قرار میگیرند.
مثلاً:
متغیر
🔥 Stack Overflow چگونه ایجاد میشود؟
یکی از رایجترین دلایل، Recursive Function بدون شرط توقف است:
تابع
در نتیجه:
هر فراخوانی جدید، یک Stack Frame جدید ایجاد میکند.
بنابراین Stack دائماً رشد میکند:
تا جایی که دیگر فضای کافی برای ایجاد Stack Frame جدید وجود نداشته باشد.
💥 نتیجه معمولاً Crash شدن برنامه است.
🔹 فقط Recursion مشکلساز نیست!
تعریف متغیرهای Local بسیار بزرگ نیز میتواند Stack را پر کند:
اینجا برنامه تقریباً 1MB فضای Stack درخواست میکند.
اگر Stack برنامه ظرفیت کافی نداشته باشد، احتمال بروز مشکل بسیار زیاد است.
⚠️ نکته مهم
Stack Overflow با Heap Overflow متفاوت است.
Stack بیشتر با اجرای توابع و متغیرهای Local سروکار دارد، در حالی که Heap برای حافظه Dynamic مانند:
است.
در بخش دوم میبینیم چرا این موضوع در STM32 و RTOS اهمیت بسیار بیشتری پیدا میکند و چطور میتوان مصرف Stack را بررسی کرد.
ادامه دارد...
@Amin_Techlab
وقتی در زبان C یک تابع را فراخوانی میکنیم، برنامه برای مدیریت اجرای آن تابع به فضایی از حافظه به نام Stack نیاز دارد.
اما اگر این فضا بیش از ظرفیت خود مصرف شود، چه اتفاقی میافتد؟
💥 Stack Overflow
🔹 Stack چیست؟
Stack بخشی از حافظه RAM است که برای مدیریت اجرای توابع استفاده میشود.
در زمان اجرای یک تابع، اطلاعاتی مانند:
• متغیرهای Local
• پارامترهای تابع
• آدرس بازگشت
• برخی Registerها و اطلاعات موقتی
در Stack Frame مربوط به آن تابع قرار میگیرند.
مثلاً:
void test(void)
{
int x = 10;
}
متغیر
x یک Local Variable است و در بسیاری از پیادهسازیها فضای آن از Stack تأمین میشود.🔥 Stack Overflow چگونه ایجاد میشود؟
یکی از رایجترین دلایل، Recursive Function بدون شرط توقف است:
void crash(void)
{
int buffer[1000];
crash();
}
تابع
crash() خودش را دوباره فراخوانی میکند.در نتیجه:
crash()
↓
crash()
↓
crash()
↓
crash()
↓
...
هر فراخوانی جدید، یک Stack Frame جدید ایجاد میکند.
بنابراین Stack دائماً رشد میکند:
┌──────────────┐
│ Frame #4 │
├──────────────┤
│ Frame #3 │
├──────────────┤
│ Frame #2 │
├──────────────┤
│ Frame #1 │
├──────────────┤
│ │
│ Free RAM │
└──────────────┘
تا جایی که دیگر فضای کافی برای ایجاد Stack Frame جدید وجود نداشته باشد.
💥 نتیجه معمولاً Crash شدن برنامه است.
🔹 فقط Recursion مشکلساز نیست!
تعریف متغیرهای Local بسیار بزرگ نیز میتواند Stack را پر کند:
void process(void)
{
char buffer[1024 * 1024];
}
اینجا برنامه تقریباً 1MB فضای Stack درخواست میکند.
اگر Stack برنامه ظرفیت کافی نداشته باشد، احتمال بروز مشکل بسیار زیاد است.
⚠️ نکته مهم
Stack Overflow با Heap Overflow متفاوت است.
Stack بیشتر با اجرای توابع و متغیرهای Local سروکار دارد، در حالی که Heap برای حافظه Dynamic مانند:
malloc()
calloc()
realloc()
free()
است.
در بخش دوم میبینیم چرا این موضوع در STM32 و RTOS اهمیت بسیار بیشتری پیدا میکند و چطور میتوان مصرف Stack را بررسی کرد.
ادامه دارد...
@Amin_Techlab
❤3👾2
⚙️ Stack Overflow در STM32 و RTOS — بخش دوم
در بخش اول دیدیم که Stack Overflow زمانی اتفاق میافتد که مصرف Stack از ظرفیت اختصاصیافته بیشتر شود.
اما در سیستمهای Embedded مثل STM32، این موضوع اهمیت بسیار بیشتری دارد.
چرا؟
چون منابعی مثل RAM بسیار محدود هستند.
🔹 Stack در STM32
فرض کنید برای یک Task در RTOS فقط:
در نظر گرفتهایم.
حالا داخل Task یک آرایه بزرگ تعریف کنیم:
همین یک آرایه بخش قابل توجهی از Stack را مصرف میکند.
اگر توابع دیگری هم فراخوانی شوند و آنها نیز Stack مصرف کنند، احتمال Overflow افزایش پیدا میکند.
🔥 مشکل فقط اندازه متغیرها نیست
این ساختار را در نظر بگیرید:
هر تابع میتواند Stack Frame خودش را ایجاد کند.
بنابراین حتی اگر هیچ آرایه بزرگی هم نداشته باشیم، عمق زیاد Call Stack میتواند باعث مصرف قابل توجه Stack شود.
⚠️ Recursion در Embedded
استفاده از Recursive Function در سیستمهای Embedded باید با احتیاط انجام شود:
این کد در نهایت Stack را مصرف کرده و باعث Crash میشود.
به همین دلیل در بسیاری از سیستمهای Embedded، استفاده از Recursion بدون تحلیل دقیق Stack Depth انتخاب مناسبی نیست.
🔬 Stack و RTOS
در RTOS معمولاً هر Task Stack مخصوص خودش را دارد:
بنابراین اگر فقط Stack یک Task تمام شود، ممکن است همان Task دچار مشکل شود.
این موضوع Debug کردن خطا را هم دشوار میکند؛ چون ممکن است برنامه در یک بخش کاملاً متفاوت Crash کند.
🛠 چگونه از Stack Overflow جلوگیری کنیم؟
✅ اندازه Stack هر Task را متناسب با نیاز تعیین کنید.
✅ آرایههای بزرگ را بیدلیل Local تعریف نکنید.
✅ از Recursive Function بدون Base Case استفاده نکنید.
✅ عمق Call Stack را در توابع پیچیده بررسی کنید.
✅ در RTOS میزان Stack مصرفشده هر Task را Monitor کنید.
✅ در زمان Debug، Stack Pointer و Call Stack را بررسی کنید.
🧠 یک نکته مهم
Stack Overflow و Stack Corruption را با هم اشتباه نگیریم.
گاهی یک Buffer کوچک به دلیل دسترسی خارج از محدوده میتواند حافظه اطراف خود را خراب کند:
این کد یک Out-of-Bounds Write است و میتواند باعث Stack Corruption شود.
یعنی همیشه Crash شدن برنامه به معنی Stack Overflow نیست.
🎯 جمعبندی
در سیستمهای Embedded، مدیریت Stack بخش مهمی از طراحی نرمافزار است.
خصوصاً وقتی با:
🔹 STM32
🔹 RTOS
🔹 Interrupt
🔹 Recursive Function
🔹 Bufferهای بزرگ
🔹 Call Stackهای عمیق
کار میکنیم.
یک Stack کوچک میتواند باعث Crash شود و یک Buffer کوچک با دسترسی اشتباه میتواند کل Stack را خراب کند.
پس در برنامهنویسی C فقط این مهم نیست که برنامه کار کند؛ باید بدانیم در سطح حافظه دقیقاً چه اتفاقی در حال رخ دادن است.
@Amin_Techlab
در بخش اول دیدیم که Stack Overflow زمانی اتفاق میافتد که مصرف Stack از ظرفیت اختصاصیافته بیشتر شود.
اما در سیستمهای Embedded مثل STM32، این موضوع اهمیت بسیار بیشتری دارد.
چرا؟
چون منابعی مثل RAM بسیار محدود هستند.
🔹 Stack در STM32
فرض کنید برای یک Task در RTOS فقط:
Stack Size = 2 KB
در نظر گرفتهایم.
حالا داخل Task یک آرایه بزرگ تعریف کنیم:
void task(void)
{
uint8_t data[1500];
process_data(data);
}
همین یک آرایه بخش قابل توجهی از Stack را مصرف میکند.
اگر توابع دیگری هم فراخوانی شوند و آنها نیز Stack مصرف کنند، احتمال Overflow افزایش پیدا میکند.
🔥 مشکل فقط اندازه متغیرها نیست
این ساختار را در نظر بگیرید:
Task
↓
function_A()
↓
function_B()
↓
function_C()
↓
function_D()
هر تابع میتواند Stack Frame خودش را ایجاد کند.
بنابراین حتی اگر هیچ آرایه بزرگی هم نداشته باشیم، عمق زیاد Call Stack میتواند باعث مصرف قابل توجه Stack شود.
⚠️ Recursion در Embedded
استفاده از Recursive Function در سیستمهای Embedded باید با احتیاط انجام شود:
void task(void)
{
task();
}
این کد در نهایت Stack را مصرف کرده و باعث Crash میشود.
به همین دلیل در بسیاری از سیستمهای Embedded، استفاده از Recursion بدون تحلیل دقیق Stack Depth انتخاب مناسبی نیست.
🔬 Stack و RTOS
در RTOS معمولاً هر Task Stack مخصوص خودش را دارد:
RAM
│
├── Task A Stack
│
├── Task B Stack
│
├── Task C Stack
│
├── Kernel
│
└── Heap / Global Data
بنابراین اگر فقط Stack یک Task تمام شود، ممکن است همان Task دچار مشکل شود.
این موضوع Debug کردن خطا را هم دشوار میکند؛ چون ممکن است برنامه در یک بخش کاملاً متفاوت Crash کند.
🛠 چگونه از Stack Overflow جلوگیری کنیم؟
✅ اندازه Stack هر Task را متناسب با نیاز تعیین کنید.
✅ آرایههای بزرگ را بیدلیل Local تعریف نکنید.
✅ از Recursive Function بدون Base Case استفاده نکنید.
✅ عمق Call Stack را در توابع پیچیده بررسی کنید.
✅ در RTOS میزان Stack مصرفشده هر Task را Monitor کنید.
✅ در زمان Debug، Stack Pointer و Call Stack را بررسی کنید.
🧠 یک نکته مهم
Stack Overflow و Stack Corruption را با هم اشتباه نگیریم.
گاهی یک Buffer کوچک به دلیل دسترسی خارج از محدوده میتواند حافظه اطراف خود را خراب کند:
uint8_t buffer[10];
buffer[20] = 0xFF;
این کد یک Out-of-Bounds Write است و میتواند باعث Stack Corruption شود.
یعنی همیشه Crash شدن برنامه به معنی Stack Overflow نیست.
🎯 جمعبندی
در سیستمهای Embedded، مدیریت Stack بخش مهمی از طراحی نرمافزار است.
خصوصاً وقتی با:
🔹 STM32
🔹 RTOS
🔹 Interrupt
🔹 Recursive Function
🔹 Bufferهای بزرگ
🔹 Call Stackهای عمیق
کار میکنیم.
یک Stack کوچک میتواند باعث Crash شود و یک Buffer کوچک با دسترسی اشتباه میتواند کل Stack را خراب کند.
پس در برنامهنویسی C فقط این مهم نیست که برنامه کار کند؛ باید بدانیم در سطح حافظه دقیقاً چه اتفاقی در حال رخ دادن است.
@Amin_Techlab
❤3👾2
🔹 مدیریت هوشمند فایلهای پروژه با ".gitignore"؛ این بار برعکس فکر کنیم!
معمولاً در Git به این شکل عمل میکنیم:
همه فایلها Track شوند و هر چیزی را که نمیخواهیم، داخل ".gitignore" قرار دهیم.
اما یک روش جالب دیگر هم وجود دارد! 😎
بیایید دقیقاً برعکس عمل کنیم: همهچیز را Ignore کنیم و فقط فایلهای موردنیاز را Explicitly مجاز کنیم.
❓ چرا این روش میتواند مفید باشد؟
در پروژهها معمولاً فایلها و پوشههایی ایجاد میشوند که نباید وارد Repository شوند؛ مثل:
📁 "node_modules/"
🗂️ ".DS_Store"
🔐 فایلهای Environment
📝 فایلهای موقت و تنظیمات Editor
📄 فایلهایی مثل "CLAUDE.md" و موارد مشابه
اگر مدیریت نشوند، ممکن است بهصورت ناخواسته وارد Commit شوند و Repository را شلوغ و نامرتب کنند.
💡 یک مثال کاربردی
فرض کنید یک پروژه Go داریم و فقط میخواهیم فایلهای ضروری در Git Track شوند:
*
!.gitignore
!*.go
!README.md
!go.mod
!go.sum
اینجا:
"*" → یعنی همهچیز Ignore شود. 🚫
و هر چیزی که با "!" شروع شود → از حالت Ignore خارج شده و اجازه Track شدن دارد. ✅
بنابراین در این مثال، فقط فایلهای Go و فایلهای مشخصشده اجازه ورود به Repository را دارند.
👍 مزایا
🔹 کنترل کامل روی فایلهایی که وارد Repository میشوند
🔹 جلوگیری از Commit شدن تصادفی فایلهای اضافی
🔹 Repository تمیزتر و قابلمدیریتتر
🔹 مناسب برای پروژههای کوچک و ساختارهای مشخص
👎 معایب و نکات مهم
🔸 مدیریت آن بهصورت دستی انجام میشود
🔸 با اضافه شدن فایلهای جدید باید ".gitignore" را بهروزرسانی کنید
🔸 برای پروژههای بزرگ و پیچیده ممکن است مدیریت این روش سختتر شود
🔍 یک دستور کاربردی Git
اگر نمیدانید چرا یک فایل توسط Git نادیده گرفته شده، این دستور را اجرا کنید:
این دستور به شما نشان میدهد کدام Rule در ".gitignore" باعث Ignore شدن فایل شده است. 🧐
💡 گاهی اوقات بهجای اینکه بگوییم «چه چیزهایی را Ignore کنم؟»، بهتر است بپرسیم:
«دقیقاً چه چیزهایی را میخواهم وارد Repository کنم؟»
@Amin_Techlab
معمولاً در Git به این شکل عمل میکنیم:
همه فایلها Track شوند و هر چیزی را که نمیخواهیم، داخل ".gitignore" قرار دهیم.
اما یک روش جالب دیگر هم وجود دارد! 😎
بیایید دقیقاً برعکس عمل کنیم: همهچیز را Ignore کنیم و فقط فایلهای موردنیاز را Explicitly مجاز کنیم.
❓ چرا این روش میتواند مفید باشد؟
در پروژهها معمولاً فایلها و پوشههایی ایجاد میشوند که نباید وارد Repository شوند؛ مثل:
📁 "node_modules/"
🗂️ ".DS_Store"
🔐 فایلهای Environment
📝 فایلهای موقت و تنظیمات Editor
📄 فایلهایی مثل "CLAUDE.md" و موارد مشابه
اگر مدیریت نشوند، ممکن است بهصورت ناخواسته وارد Commit شوند و Repository را شلوغ و نامرتب کنند.
💡 یک مثال کاربردی
فرض کنید یک پروژه Go داریم و فقط میخواهیم فایلهای ضروری در Git Track شوند:
*
!.gitignore
!*.go
!README.md
!go.mod
!go.sum
اینجا:
"*" → یعنی همهچیز Ignore شود. 🚫
و هر چیزی که با "!" شروع شود → از حالت Ignore خارج شده و اجازه Track شدن دارد. ✅
بنابراین در این مثال، فقط فایلهای Go و فایلهای مشخصشده اجازه ورود به Repository را دارند.
👍 مزایا
🔹 کنترل کامل روی فایلهایی که وارد Repository میشوند
🔹 جلوگیری از Commit شدن تصادفی فایلهای اضافی
🔹 Repository تمیزتر و قابلمدیریتتر
🔹 مناسب برای پروژههای کوچک و ساختارهای مشخص
👎 معایب و نکات مهم
🔸 مدیریت آن بهصورت دستی انجام میشود
🔸 با اضافه شدن فایلهای جدید باید ".gitignore" را بهروزرسانی کنید
🔸 برای پروژههای بزرگ و پیچیده ممکن است مدیریت این روش سختتر شود
🔍 یک دستور کاربردی Git
اگر نمیدانید چرا یک فایل توسط Git نادیده گرفته شده، این دستور را اجرا کنید:
git check-ignore -v path/to/file
این دستور به شما نشان میدهد کدام Rule در ".gitignore" باعث Ignore شدن فایل شده است. 🧐
💡 گاهی اوقات بهجای اینکه بگوییم «چه چیزهایی را Ignore کنم؟»، بهتر است بپرسیم:
«دقیقاً چه چیزهایی را میخواهم وارد Repository کنم؟»
@Amin_Techlab
👍4❤1🙏1👾1
Media is too big
VIEW IN TELEGRAM
CAN and CAN FD protocol
Browse our CAN and CAN FD transceiver
Source : https://www.ti.com/CAN
@Amin_Techlab
Browse our CAN and CAN FD transceiver
Source : https://www.ti.com/CAN
@Amin_Techlab
👍5❤2
مهاجرت به Ubuntu 26.10؛ Core Utilities به Rust کامل شد! 🦀
با Canonical در نسخه Ubuntu 26.10 مهاجرت ابزارهای پایه لینوکس به نسخههای مبتنی بر Rust را کامل میکند.
ابزارهایی مثل:
اکنون از پروژه uutils استفاده میکنند.
🔐 دلیل اصلی این تغییر، امنیت بیشتر و Memory Safety است. Rust بسیاری از خطاهای مرتبط با مدیریت حافظه را در زمان کامپایل شناسایی میکند.
در Ubuntu 26.04، دستورات
جالب اینکه هدف این مهاجرت، تغییر تجربه کاربر نیست؛ بلکه اجرای همان دستورات آشنا با یک زیرساخت امنتر است.
🦀 به نظر میرسد Rust در حال تبدیل شدن به بخش جدیتری از آینده Linux و Ubuntu است.
@Amin_Techlab
با Canonical در نسخه Ubuntu 26.10 مهاجرت ابزارهای پایه لینوکس به نسخههای مبتنی بر Rust را کامل میکند.
ابزارهایی مثل:
ls، cat، chmod، du، cp، mv و rmاکنون از پروژه uutils استفاده میکنند.
🔐 دلیل اصلی این تغییر، امنیت بیشتر و Memory Safety است. Rust بسیاری از خطاهای مرتبط با مدیریت حافظه را در زمان کامپایل شناسایی میکند.
در Ubuntu 26.04، دستورات
cp، mv و rm بهدلیل مشکلات امنیتی TOCTOU هنوز روی نسخه GNU بودند؛ این مشکلات اکنون برطرف شدهاند.جالب اینکه هدف این مهاجرت، تغییر تجربه کاربر نیست؛ بلکه اجرای همان دستورات آشنا با یک زیرساخت امنتر است.
🦀 به نظر میرسد Rust در حال تبدیل شدن به بخش جدیتری از آینده Linux و Ubuntu است.
@Amin_Techlab
❤3🔥1👾1
⚡️ ادیتوری متفاوت برای توسعهدهندهها Zed
اگه سرعت و روان بودن محیط کدنویسی برات مهمه، شاید وقتشه Zed رو بشناسی.
یک ادیتور مدرن که با Rust ساخته شده و از GPU برای رندر رابط کاربری استفاده میکنه.
اما سرعت تنها چیزی نیست که Zed برای ارائه داره... 👀
در ادامه ببینیم چه قابلیتهایی باعث شده Zed مورد توجه توسعهدهندهها قرار بگیره....
@Amin_Techlab
اگه سرعت و روان بودن محیط کدنویسی برات مهمه، شاید وقتشه Zed رو بشناسی.
یک ادیتور مدرن که با Rust ساخته شده و از GPU برای رندر رابط کاربری استفاده میکنه.
اما سرعت تنها چیزی نیست که Zed برای ارائه داره... 👀
در ادامه ببینیم چه قابلیتهایی باعث شده Zed مورد توجه توسعهدهندهها قرار بگیره....
@Amin_Techlab
🔥2❤1
🚀 فراتر از یک Code Editor – Zed
Zed فقط یک ادیتور سریع نیست بلکه تلاش کرده بخش زیادی از ابزارهای موردنیاز یک توسعهدهنده را در یک محیط یکپارچه قرار دهد.
هسته Zed با Rust توسعه داده شده و رابط کاربری آن بر پایه GPUI ساخته شده است؛ رویکردی که باعث شده تعامل با محیط ادیتور بسیار روان و سریع باشد.
🔹قابلیت Multi-buffer
با Multi-buffer میتوانید قسمتهایی از چند فایل مختلف را در یک محیط مشاهده و ویرایش کنید؛ بدون اینکه دائماً بین فایلها جابهجا شوید.
🔹 پشتیبانی قدرتمند از کد
Zed از Tree-sitter و LSP استفاده میکند و امکاناتی مانند Syntax Highlighting، تشخیص خطا، تحلیل کد و Code Actions را در اختیار توسعهدهنده قرار میدهد.
🔹 ابزارهای توسعه
Git، Git Worktree، Debugger مبتنی بر DAP، Terminal و Task Runner از دیگر امکاناتی هستند که مستقیماً در محیط Zed در دسترس قرار دارند.
🔹قابلیت Remote Development
برای توسعه روی سیستمهای دیگر نیز امکان استفاده از SSH و WSL وجود دارد.
🤝 همکاری Real-time
یکی از بخشهای جذاب Zed قابلیت همکاری همزمان است. چند نفر میتوانند روی یک پروژه کار کنند، تغییرات یکدیگر را ببینند و با Follow Mode موقعیت ویرایشگر همکارشان را دنبال کنند.
امکاناتی مانند Chat، Voice و Screen Sharing نیز برای همکاری تیمی در نظر گرفته شدهاند.
🤖 هوش مصنوعی و Agentها
Zed در بخش AI نیز محدود به یک سرویس خاص نیست.
پشتیبانی از MCP و ACP امکان استفاده از Agentهای مختلف را فراهم میکند و قابلیتهایی مانند Edit Prediction و مدیریت Context نیز برای تجربه بهتر کار با AI در نظر گرفته شدهاند.
🧩 افزونه و شخصیسازی
افزونههای Zed در محیط WebAssembly و Sandbox اجرا میشوند و برای کاربران علاقهمند به محیطهای Keyboard-driven، پشتیبانی از Vim و Helix نیز وجود دارد.
🖥 در نهایت...
Zed برای Windows، Linux و macOS در دسترس است و هسته اصلی آن Open Source است.
البته اکوسیستم Extensionهای آن هنوز به گستردگی VS Code نیست؛ اما ترکیب سرعت، معماری مدرن، ابزارهای توسعه، همکاری تیمی و قابلیتهای AI باعث شده Zed به گزینهای جدی برای امتحان کردن تبدیل شود.
@Amin_Techlab
Zed فقط یک ادیتور سریع نیست بلکه تلاش کرده بخش زیادی از ابزارهای موردنیاز یک توسعهدهنده را در یک محیط یکپارچه قرار دهد.
هسته Zed با Rust توسعه داده شده و رابط کاربری آن بر پایه GPUI ساخته شده است؛ رویکردی که باعث شده تعامل با محیط ادیتور بسیار روان و سریع باشد.
🔹قابلیت Multi-buffer
با Multi-buffer میتوانید قسمتهایی از چند فایل مختلف را در یک محیط مشاهده و ویرایش کنید؛ بدون اینکه دائماً بین فایلها جابهجا شوید.
🔹 پشتیبانی قدرتمند از کد
Zed از Tree-sitter و LSP استفاده میکند و امکاناتی مانند Syntax Highlighting، تشخیص خطا، تحلیل کد و Code Actions را در اختیار توسعهدهنده قرار میدهد.
🔹 ابزارهای توسعه
Git، Git Worktree، Debugger مبتنی بر DAP، Terminal و Task Runner از دیگر امکاناتی هستند که مستقیماً در محیط Zed در دسترس قرار دارند.
🔹قابلیت Remote Development
برای توسعه روی سیستمهای دیگر نیز امکان استفاده از SSH و WSL وجود دارد.
🤝 همکاری Real-time
یکی از بخشهای جذاب Zed قابلیت همکاری همزمان است. چند نفر میتوانند روی یک پروژه کار کنند، تغییرات یکدیگر را ببینند و با Follow Mode موقعیت ویرایشگر همکارشان را دنبال کنند.
امکاناتی مانند Chat، Voice و Screen Sharing نیز برای همکاری تیمی در نظر گرفته شدهاند.
🤖 هوش مصنوعی و Agentها
Zed در بخش AI نیز محدود به یک سرویس خاص نیست.
پشتیبانی از MCP و ACP امکان استفاده از Agentهای مختلف را فراهم میکند و قابلیتهایی مانند Edit Prediction و مدیریت Context نیز برای تجربه بهتر کار با AI در نظر گرفته شدهاند.
🧩 افزونه و شخصیسازی
افزونههای Zed در محیط WebAssembly و Sandbox اجرا میشوند و برای کاربران علاقهمند به محیطهای Keyboard-driven، پشتیبانی از Vim و Helix نیز وجود دارد.
🖥 در نهایت...
Zed برای Windows، Linux و macOS در دسترس است و هسته اصلی آن Open Source است.
البته اکوسیستم Extensionهای آن هنوز به گستردگی VS Code نیست؛ اما ترکیب سرعت، معماری مدرن، ابزارهای توسعه، همکاری تیمی و قابلیتهای AI باعث شده Zed به گزینهای جدی برای امتحان کردن تبدیل شود.
@Amin_Techlab
👾4👍1🔥1
🦅 زبان Cyrus یک مسیر متفاوت برای برنامهنویسی سیستمی
در اصل Cyrus یک زبان برنامهنویسی سیستمی مدرن است که روی کنترل بیشتر، انتزاع کمتر و عملکرد قابلپیشبینی تمرکز دارد.
در ادامه با این زبان آشنا میشویم ...
@Amin_Techlab
در اصل Cyrus یک زبان برنامهنویسی سیستمی مدرن است که روی کنترل بیشتر، انتزاع کمتر و عملکرد قابلپیشبینی تمرکز دارد.
در ادامه با این زبان آشنا میشویم ...
@Amin_Techlab
👾2❤1
Amin'sTechLab
🦅 زبان Cyrus یک مسیر متفاوت برای برنامهنویسی سیستمی در اصل Cyrus یک زبان برنامهنویسی سیستمی مدرن است که روی کنترل بیشتر، انتزاع کمتر و عملکرد قابلپیشبینی تمرکز دارد. در ادامه با این زبان آشنا میشویم ... @Amin_Techlab
زبان Cyrus یک زبان برنامهنویسی سیستمی با نگاه متفاوت
اگر با C، C++، Rust یا Zig کار کرده باشید، احتمالاً میدانید که در برنامهنویسی سیستمی همیشه یک سؤال مهم وجود دارد:
چقدر کنترل را به زبان و کامپایلر بدهیم و چقدر خودمان کنترل را در دست داشته باشیم؟
زبان Cyrus یک زبان برنامهنویسی سیستمی جدید است که پاسخ متفاوتی به این سؤال میدهد.
این زبان با تمرکز روی کنترل صریح، عملکرد قابل پیشبینی و حداقل انتزاع طراحی شده است. در Cyrus بسیاری از رفتارهایی که در زبانهای مدرن ممکن است بهصورت خودکار اتفاق بیفتند، عمداً شفاف و قابل مشاهده هستند.
🔹 ویژگیهای مهم Cyrus:
• مدیریت دستی حافظه و بدون Garbage Collector
• سیستم Type صریح و Static
• بدون تبدیلهای ضمنی نوع
• کامپایل Native و Ahead-of-Time
• استفاده از LLVM در زیرساخت کامپایل
• تعامل مستقیم با C و سازگاری با C ABI
• حداقل Runtime و Abstraction
• دارای Comptime برای اجرای بخشی از منطق در زمان کامپایل
• کنترل صریح روی Allocation، Pointer و Dispatch
• طراحی Procedural و نزدیک به مدل ماشین
یکی از نکات جالب Cyrus این است که هدفش جایگزین کردن Rust یا C نیست؛ بلکه تلاش میکند نقطهای متفاوت در فضای زبانهای سیستمی ایجاد کند.
اگر C برایتان بیش از حد قدیمی و محدود به نظر میرسد، اما مدلهایی مثل Borrow Checker در Rust برای پروژه شما ضروری نیستند، Cyrus تلاش میکند امکانات مدرنتری را بدون کنار گذاشتن کنترل سطح پایین ارائه کند.
مثلاً یک برنامه ساده در Cyrus میتواند به این شکل باشد:
البته باید توجه داشت که Cyrus هنوز یک پروژه در حال توسعه است و برای استفاده در محیطهای Production و پروژههای حساس توصیه نمیشود.
🧩 پروژه در حال توسعه قابلیتهایی مانند Self-hosting Compiler، کتابخانه استاندارد گستردهتر، APIهای Async، Networking و Package Ecosystem است.
🌐 وبسایت و مستندات رسمی:
cyrus-lang.ir
💻 GitHub:
Cyrus on GitHub
@Amin_Techlab
اگر با C، C++، Rust یا Zig کار کرده باشید، احتمالاً میدانید که در برنامهنویسی سیستمی همیشه یک سؤال مهم وجود دارد:
چقدر کنترل را به زبان و کامپایلر بدهیم و چقدر خودمان کنترل را در دست داشته باشیم؟
زبان Cyrus یک زبان برنامهنویسی سیستمی جدید است که پاسخ متفاوتی به این سؤال میدهد.
این زبان با تمرکز روی کنترل صریح، عملکرد قابل پیشبینی و حداقل انتزاع طراحی شده است. در Cyrus بسیاری از رفتارهایی که در زبانهای مدرن ممکن است بهصورت خودکار اتفاق بیفتند، عمداً شفاف و قابل مشاهده هستند.
🔹 ویژگیهای مهم Cyrus:
• مدیریت دستی حافظه و بدون Garbage Collector
• سیستم Type صریح و Static
• بدون تبدیلهای ضمنی نوع
• کامپایل Native و Ahead-of-Time
• استفاده از LLVM در زیرساخت کامپایل
• تعامل مستقیم با C و سازگاری با C ABI
• حداقل Runtime و Abstraction
• دارای Comptime برای اجرای بخشی از منطق در زمان کامپایل
• کنترل صریح روی Allocation، Pointer و Dispatch
• طراحی Procedural و نزدیک به مدل ماشین
یکی از نکات جالب Cyrus این است که هدفش جایگزین کردن Rust یا C نیست؛ بلکه تلاش میکند نقطهای متفاوت در فضای زبانهای سیستمی ایجاد کند.
اگر C برایتان بیش از حد قدیمی و محدود به نظر میرسد، اما مدلهایی مثل Borrow Checker در Rust برای پروژه شما ضروری نیستند، Cyrus تلاش میکند امکانات مدرنتری را بدون کنار گذاشتن کنترل سطح پایین ارائه کند.
مثلاً یک برنامه ساده در Cyrus میتواند به این شکل باشد:
import std::libc{printf};
fn main() {
printf("Hello, World!");
}البته باید توجه داشت که Cyrus هنوز یک پروژه در حال توسعه است و برای استفاده در محیطهای Production و پروژههای حساس توصیه نمیشود.
🧩 پروژه در حال توسعه قابلیتهایی مانند Self-hosting Compiler، کتابخانه استاندارد گستردهتر، APIهای Async، Networking و Package Ecosystem است.
🌐 وبسایت و مستندات رسمی:
cyrus-lang.ir
💻 GitHub:
Cyrus on GitHub
@Amin_Techlab
cyrus-lang.ir
Cyrus Programming Language
Cyrus is a high-performance systems programming language with explicit syntax and semantics, minimal abstraction and runtime, and manual memory management.
❤2👾2
هوش مصنوعی مخصوص مهندسهای الکترونیک ساختم!
تا حالا شده برای پیدا کردن جواب یک سؤال ساده در یک پروژه Embedded، بین Datasheet، Reference Manual، Source Code و PDFهای مختلف ساعتها جستجو کنی؟ 😵💫
من برای همین ایده، پروژه ElectroMind AI رو ساختم؛ یک دستیار هوش مصنوعی مخصوص مهندسی الکترونیک و Embedded Systems ⚡️
🔹 اجرای کاملاً Local و Offline
🔹 بدون نیاز به API و Cloud
🔹 پشتیبانی از RAG
🔹 کار با Datasheet و مستندات پروژه
🔹 پشتیبانی از Source Code
🔹 اجرای مدلهای GGUF / Local LLM
🔹 مناسب برای پروژههای STM32 و Embedded
ایده اصلی اینه که بهجای اینکه فقط از AI یک سؤال عمومی بپرسیم، اطلاعات و مستندات واقعی پروژه خودمون رو هم در اختیارش قرار بدیم.
🎥 توی این ویدیو ElectroMind AI رو معرفی کردم و درباره ایده، معماری و قابلیتهای پروژه صحبت کردم.
👇 مشاهده ویدیو در یوتیوب:
مشاهده ویدیو
💻 GitHub:
https://github.com/Amin98Hosseini/ElectroMindAi
🌐 Website:
https://amin98hosseini.github.io/ElectroMindAi/
اگر به ترکیب AI + Electronics + Embedded علاقه داری، این پروژه رو از دست نده.
@Amin_Techlab
تا حالا شده برای پیدا کردن جواب یک سؤال ساده در یک پروژه Embedded، بین Datasheet، Reference Manual، Source Code و PDFهای مختلف ساعتها جستجو کنی؟ 😵💫
من برای همین ایده، پروژه ElectroMind AI رو ساختم؛ یک دستیار هوش مصنوعی مخصوص مهندسی الکترونیک و Embedded Systems ⚡️
🔹 اجرای کاملاً Local و Offline
🔹 بدون نیاز به API و Cloud
🔹 پشتیبانی از RAG
🔹 کار با Datasheet و مستندات پروژه
🔹 پشتیبانی از Source Code
🔹 اجرای مدلهای GGUF / Local LLM
🔹 مناسب برای پروژههای STM32 و Embedded
ایده اصلی اینه که بهجای اینکه فقط از AI یک سؤال عمومی بپرسیم، اطلاعات و مستندات واقعی پروژه خودمون رو هم در اختیارش قرار بدیم.
🎥 توی این ویدیو ElectroMind AI رو معرفی کردم و درباره ایده، معماری و قابلیتهای پروژه صحبت کردم.
👇 مشاهده ویدیو در یوتیوب:
مشاهده ویدیو
💻 GitHub:
https://github.com/Amin98Hosseini/ElectroMindAi
🌐 Website:
https://amin98hosseini.github.io/ElectroMindAi/
اگر به ترکیب AI + Electronics + Embedded علاقه داری، این پروژه رو از دست نده.
@Amin_Techlab
❤5🔥2👾1
Amin'sTechLab
هوش مصنوعی مخصوص مهندسهای الکترونیک ساختم! تا حالا شده برای پیدا کردن جواب یک سؤال ساده در یک پروژه Embedded، بین Datasheet، Reference Manual، Source Code و PDFهای مختلف ساعتها جستجو کنی؟ 😵💫 من برای همین ایده، پروژه ElectroMind AI رو ساختم؛ یک دستیار هوش…
🚀 یک ارتقای بزرگ برای هوش مصنوعی تخصصی مهندسهای الکترونیک!
ElectroMind AI | Skill + Laya AI | قسمت ۲
در قسمت دوم توسعه ElectroMind AI، دو قابلیت مهم به پروژه اضافه شده:
🧩 Skill System
امکان اضافهکردن قابلیتهای تخصصی بهصورت ماژولار برای حوزههای Electronics، Firmware و Embedded Systems.
🧠 Laya AI
برای انتخاب و مدیریت هوشمند Contextهای مرتبط در کنار RAG و Local LLM.
⚡️ معماری جدید:
Local LLM + RAG + Skill + Laya AI + Project Context
هدف همچنان ساخت یک AI Assistant تخصصی برای مهندسان الکترونیک و Embedded Systems است؛ با معماریای که بتواند در آینده Skillهای بیشتری دریافت کند.
🎬 ویدیو قسمت دوم را ببینید و با روند توسعه پروژه همراه شوید.
مشاهده ویدیو اینجا کلیک کنید .
🔗 GitHub: ElectroMind AI
🌐 Website: ElectroMind AI Website
💫گاهی باید ادامه داد و قوی بود نه فقط برای خودمون بلکه برای عزیزترین کسایی که داریم و برامون با ارزش هستند و قوی بودن ما قوت قلب و خوش حالی اوناست . 😉
@Amin_Techlab
ElectroMind AI | Skill + Laya AI | قسمت ۲
در قسمت دوم توسعه ElectroMind AI، دو قابلیت مهم به پروژه اضافه شده:
🧩 Skill System
امکان اضافهکردن قابلیتهای تخصصی بهصورت ماژولار برای حوزههای Electronics، Firmware و Embedded Systems.
🧠 Laya AI
برای انتخاب و مدیریت هوشمند Contextهای مرتبط در کنار RAG و Local LLM.
⚡️ معماری جدید:
Local LLM + RAG + Skill + Laya AI + Project Context
هدف همچنان ساخت یک AI Assistant تخصصی برای مهندسان الکترونیک و Embedded Systems است؛ با معماریای که بتواند در آینده Skillهای بیشتری دریافت کند.
🎬 ویدیو قسمت دوم را ببینید و با روند توسعه پروژه همراه شوید.
مشاهده ویدیو اینجا کلیک کنید .
🔗 GitHub: ElectroMind AI
🌐 Website: ElectroMind AI Website
💫گاهی باید ادامه داد و قوی بود نه فقط برای خودمون بلکه برای عزیزترین کسایی که داریم و برامون با ارزش هستند و قوی بودن ما قوت قلب و خوش حالی اوناست . 😉
@Amin_Techlab
❤2👍2🔥2