PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزش سیستم عامل rtx



alireza9900
09-07-2011, 21:00
سلام
دوستان تو این تاپیک پروژه ها و یا سوالات و مشکلاتی که در مورد سیستم عامل RTX دارید می تونید مطرح کنید.
چون این سیستم عامل فوق العاده قوی هست برای همین به نظرم اومد یه تاپیک براش ایجاد شه.
RTX سیستم عاملیه که با خود Keil ارائه میشه(البته باید پکیج RL-ARM رو نصب کنید) و خیلی قابلیت هارو می ده به برنامه نویس(خیلی هم کامله --> Mailbox, Semaphore,...)

پ.ن: از صفحه دوم، آموزش کار با این سیستم عامل آورده شده.
pdf مطالب : You can see links before reply

موفق باشید

shayanmelody
09-07-2011, 21:09
سلام دوست عزیز.
شما این سیستم عامل رو راه انداختی ؟
اگر آره اگه میشه یک مثال با اون سری از آرم هایی که تو پروتئوس هستند قرار بده.چون من میخواستم کار کنم نشد ! برنامه بدون اشکال کامپایل شد،اما اجرا نکرد.دیگه هم وقت نشد برم دنبالش.

با تشکر.

alireza9900
09-07-2011, 22:25
با پروتئوس تست نکردم ولی سعی می کنم یه پروژه بزنم بذارم، چشم

پ.ن: شما پروتئوس 7.8 رو نصب کردی؟ نمی دونم چرا نمی تونم سیو کنم دیزاین هارو !!!

alireza9900
10-07-2011, 14:16
من یه پروژه زدم ولی نمی دونم اجرا نشد تو پروتئوس!(من همین مثال رو روی برد زدم کار کرده!)
نمی دونم مشکل از کجاست
احتمالا پروتئوس یه مشکلی داره دیگه !!

shayanmelody
10-07-2011, 23:32
من یه پروژه زدم ولی نمی دونم اجرا نشد تو پروتئوس!(من همین مثال رو روی برد زدم کار کرده!)
نمی دونم مشکل از کجاست
احتمالا پروتئوس یه مشکلی داره دیگه !!

ممنون دوست عزیز بابت برنامه.
شما این برنامه رو با همین میکرو تو عمل تست کردی جواب گرفتی یا یکی دیگه ؟
متاسفانه برد منم خراب شده نمیتونم تست کنم.

alireza9900
11-07-2011, 01:54
همین برنامه رو دقیقا نه ولی اون برنامه دقیقا همین بود فقط به جای چاپ روی lcd کارکتری این مختصاتای یه سری دایره بود که حرکت می کردن(روی lcd n96).
برنامه RTX اش دقیقا همین بود ولی خب اون هدر lcd کاراکتریش باید عوض شه.

shayanmelody
11-07-2011, 18:52
شما از همون pdf که رو سایت خود کیل هست استفاده کردید یا از مثال ها ؟
چون این pdf خیلی جامع است و تمامی توابع سیستم عامل رو اومده توضیح داده .
من فکر میکنم اگر شما بتونید یک آموزش از نحوه کار با این سیستم عامل و کانفیگ های اولیه هدر های لازم و ... بزارید استقبال خیلی بیشتری بشه نسبت به الآن ! چون همونطور که خودتون میدونید این سیستم عامل رو میشه برای تمامی میکرو هایی که تو کیل هست استفاده کرد و نحوه کانفیگش هم نسبت به بقیه سیستم عامل ها (مثلا free rtos ) ساده تر میباشد.(البته جمله آخر نظر خودمه !)

kavir
11-07-2011, 19:51
سلام
تاپیک مهم شد

alireza9900
11-07-2011, 21:51
من نمی دونم کدوم pdf رو می گید ولی من از خود فایل help کیل استفاده کردم(الیته فک کنم با توضیحات شما اون pdf هم دقیقا همون باشه) --> C:\Program Files\Keil\ARM\Hlp\rlarm.chm
اوکی من یه پست در مورد راه اندازی اولیه + مثالی lcd n96 می ذارم تا آخر هفته

shayanmelody
11-07-2011, 22:41
لینک صفحه ای که من فایل ها رو دانلود کرده بودم رو گذاشتم.
RL-ARM Getting Started Guide Examples (You can see links before reply)

اینم لینک خود فایل pdf :
You can see links before reply

alireza9900
15-07-2011, 21:03
سلام
همون طور که قول داده بودم توی چند پست بعدی آموزش های اولیه سیستم عامل RTX رو میذارم.
فقط چون الان خیلی سرم شولوغه و برای خوارزمی کلی کار دارم(:unh:) فرصت نداشتم کل متن رو از اول خودم بنویسم، واسه همین دیشب که داشتم توی فروم eca می گشتم چشتم به یه تاپیک خوب خورد که توش آقای محمد حسینی آموزش راه اندازی RTX رو برای آرم های اتمل گذاشته بودن. واسه همین من مطالب اونجارو با یه کم تغییرات برای آرم های LPC آماده کردم.
دوستانی هم که برای آرم اتمل می خوان می تونن به پست اصلی مراجعه کنن.

پ.ن: پست بعدی کلا در مورد سیستم عامل ها هست
البته دوستانی که انگلیسیشون خوبه بهتر به رفرنس های خود Keil مراجعه کنن(فایل rlarm.chm در پوشه Hlp محل نصب)
همچنین لینکی که آقا شایان گذاشتن هم PDF اش خیلی عالیه و کامل همه مراحل رو با توضیح کامل داده و مثال هم داره

RL-ARM Getting Started Guide Examples (You can see links before reply)

alireza9900
15-07-2011, 21:10
اولین نکته ای که باید بهش اشاره بشه علت بالا بودن قدرت پردازشی هسته های ARM هست. در حالی که در میکروهای آرم سرعت تجهیزات جانبی پایین هست، پس سرعت پردازشی 100MHz به چه دردی می خوره؟؟
جواب این است: تو یه پروژه نسبتا حرفه ای و صنعتی، مسئله انجام یکی دو تا وظیفه (task) که نیست. وقتی قرار باشه میکرو تعداد زیادی سنسور و actuator (محرک) رو کنترل کنه، مسئله کارایی خودش رو نشون میده. اینجا به قدرت پردازش بالا نیاز داریم که بتونیم همزمان همه تسک ها رو فعال نگه داریم. پروژه ای رو درنظر بگیرین که قراره از 70 تا سنسور اطلاعات بگیریم پردازش کنیم و به 30 تا actuator فرمان بدیم. (یه پروژه صنعتی نسبتا ساده!!) میکروهای ARM بخاطر فرکانس بالا می تونن گزینه خوبی باشن. اما نوشتن همچین برنامه ای کار ساده ایه؟ توجه کنید که قرار نیست یه حلقه بنویسیم و شروع کنیم یکی یکی سنسورها رو بخونیم و اون لابه لا توابعی رو صدا کنیم و همه چی به خوبی و خوشی...
هر کدوم شرایط خاص خودشون رو دارن. مسئله زمان بندی تسک ها مطرح میشه. بعضا باید همزمان اجرا بشن و نتایح در یک زمان آماده باشه. ممکنه تسک ها رو هم تاثیر داشته باشن. مسئله وابستگی داده ها هست. اشتراک منابع. مسئله اولویت بندی. خیلی از تسک ها ممکنه مدتی کاری واسه انجام دادن نداشته باشن و یا منتظر یک رویداد باشن. با توجه به منابع محدودی که واسه وقفه داریم عملا نمیشه تو یه حلقه معمولی همچین برنامه نوشت و همه تسک ها رو کنترل کرد. اگرم اینطوری سیستم رو پیدا کنیم، مطمئنا به نصف اون کارایی که میشد برسیم نرسیدیم و این میکرو با قدرت پردازش بالا نتونسته کمک خاصی بهمون بکنه.
اینجاست که پای سیستم عامل (به مخصوص از نوع بی درنگ یا realtime) تو طراحی مون باز میشه. با وجود یک سیستم عامل می تونیم همه این تسک ها رو جدا از هم بدون هیچ نگرانی بنویسیم. سیستم عامل با توجه به طراحی ما، مدیریت اجرای تسک ها رو به عهده می گیره. اجرای همزمان تعداد زیاد تسک بدون ایجاد اختلال در عملکرد سیستم، احتیاج به فرکانس کلاک و کارایی بالا داره و اینجاست که میکروکنترلرهای ARM خودشون رو نشون میدن. ساده بگم مثل اینه که 20 تا mega16 رو بذارین کنار هم (با کمی کم لطفی!).
سیستم عامل مزایای دیگه ای هم داره. امکان تقسیم ساده وظایف در پروژه و انجام پروژه بصورت گروهی. ساده شدن عملیات خطایابی با تست تسک ها. امکان گسترش سیستم در مراحل بعد و خیلی دیگه بیشتر از این مجالش نیست!!

multitasking یا "عملکرد چند وظیفه ای" یعنی اینکه بتونیم چند کار رو همزمان انجام بدیم. کرنل (kernel) هسته اصلی هر سیستم عامل، این امکان رو برای سیستم عامل فراهم میکنه که چند برنامه جدا از هم (task) رو با هم اجرا کنه. multitasking این امکان رو به ما میده که برنامه ها یا پروژه های پیچیده رو به چند task ساده تبدیل کنیم که مدیریت و تغییر هرکدوم شون خیلی راحتره.
پردازنده های مرسوم که ما می شناسیم،تنها قابلبت اجرای یک دستور العمل رو در هر زمان (سیکل کلاک) دارن. یعنی به ظاهر میشه با خط به خط اجرا کردن دستورات فقط یک تسک در حال اجرا باشه. اما سیستم عامل با جابجایی سریع تسک ها برای پردازنده، به ظاهر نشون میده که همه درحال اجرا هستن.
You can see links before reply
scheduler یا زمانبند قسمتی از kernel که تصمیم میگیره در هر لحظه از زمان کدوم تسک باید اجرا بشه. scheduler میتونه یه task رو به حالت معلق در بیاره و درعوض تسک دیگه ای رو اجرا کنه. الگوریتم یه سیستم عامل multitask (نه realtime) اینه که به هر تسک میزان زمان پردازش برابر بده و اصطلاحا زمان پردازنده رو عادلانه(fairly) بین تسک ها تقسیم کنه.
این جابجایی تسک ها بدون اختیار هر تسک توسط scheduler انجام میشه. Round robin یکی از الگوریتم های معروف scheduler. این الگوریتم (که شکل قبل داره نمایشش میده) از این قراره که یه قطعه زمانی مشخص تعیین میشه (مثلا 10 میلی ثانیه) و به هر تسک به این اندازه زمان داده میشه تا پردازنده دستوراتش رو اجرا کنه. اگه اجرای تسک تموم نشه، scheduler اون تسک رو به حالت معلق در میاره و میره سراغ تسک بعد و به همین اندازه زمان پردازش در اختیارش میذاره. این رویه تکرار میشه و تسک ها بصورت چرخشی زمان پردازش از پردازنده میگیرن...
غیر از این، هر تسک هم میتونه خودش رو به حالت معلق در بیاره. فرض کنید یه task بخواد تاخیر ایجاد کنه. مثلا هر 100 میلی ثانیه اجرا بشه. تو این زمان تاخیر، خود تسک اعلام میکنه که عملیاتی برای پردازش نداره و زمان پردازش پردازنده در اختیار تسک دیگه ای قرار میگیره. حالت دیگه اینه که task بخواد با یکی از منابع یا امکانات جانبی (peripheral) پردازنده (مثل پورت سریال) کار کنه، که اگه توسط تسک دیگه ای اشغال باشه، باید خودش رو مسدود کنه و منتظر بمونه تا اون منبع آزاد بشه. حالت های دیگه ای هم هست که یه task خودش رو مسدود میکنه. مثلا منتظر یه وقفه خارجی یا دریافت پیام از تسک دیگه ای باشه و ...
تصویر زیر رو ببینید
You can see links before reply
در زمان 1 تسک 1 در حال اجراست
در زمان 2 کرنل زمان اجرا رو از تسک 1 میگیره و در عوض اجرای تسک 2 رو ادامه میده (زمان3)
تسک 2 در زمان اجرای خودش (زمان4) یکی از امکانات جانبی (peripheral) رو در احتیار خودش میگیره که با اون کار کنه.
در زمان 5 کرنل زمان پردازش تسک2 رو میگیره و تسک 3 رو ادامه میده(زمان6). توجه کنید که تسک هایی که به حالت معلق در اومدن، کارشون تموم نشده.
تسک 3 می خواد با همون peripheral تسک 2 کار کنه. اما چون این peripheral در اختیار تسک 2 هست، تسک 3 خودش رو مسدود میکنه (زمان 7). بنابراین دوباره تسک 1 ادامه داده میشه (زمان8) و این روند تکرار میشه تا جایی که تسک 2 دست از سر اون peripheral برداره (زمان9).
زمان بعدی که تسک 3 اجرا بشه (زمان10) اون peripheral مشغول نیست و تسک 3 میتونه باهاش کار کنه. همونطور که می بینید تسک 3 به اندازه تسک های دیگه زمان اجرا از کرنل گرفته...

RTOS : Real Time Operating System
سیستم های realtime برای پاسخ به رویدادهایی طراحی میشن که این رویدادها برای دریافت پاسخ، اصطلاحا یک ضرب العجل (deadline) دارن. یعنی تو زمان مشخصی حتما باید بهشون پاسخ داده بشه. برای این سیستم ها زمان انجام عمل مورد نظر دقیقا قابل محاسبه هست و نباید از بازه ای که محاسبه میشه تجاوز کنه.
بعد از multitasking خصوصیت بعدی یک سیستم عامل، realtime بودن. اساس کار scheduler سیستم عامل realtime مشابه multitasking اما با هدف متفاوت. هدف scheduler بلادرنگ اینه که deadline رو درنظر بگیره و تا قبل از اتمام فرصت مورد نظر برای یک تسک، عملیات تسک رو کامل کنه.
اینکار چطور ممکن میشه؟
خیلی ساده! برنامه نویس باید برای هر تسک یک اولویت (Priority) تعیین کنه. scheduler همیشه زمان پردازش رو به تسک با اولویت بالاتر میده و تا وقتی تسک با اولویت بالاتر آماده برای اجرا باشه، تسک اولویت پایین تر هیچ زمان پردازشی نمیگیره. در صورتی هم که چند تسک با اولویت برابر آماده اجرا باشن، زمان پردازش بینشون تقسیم میشه.
وقتی چندتا تسک با اولویت برابر تعریف میکنیم. زمان پردازش بینشون تقسیم میشه و سرعت اجرای هر کدوم نسبت به زمانی که به تنهایی اجرا بشن کم میشه. فرض کنید تسکی داریم که 500 میلی ثانیه طول میکشه اجرا بشه (به تنهایی) و تو پروژه ای که داریم هم حتما باید 500 میلی ثانیه باشه نه بیشتر. بنابراین به این تسک نسبت به بقیه تسک ها یک اولویت بالاتر میدیم و اینطوری مطمئنیم که در زمان اجرای این تسک، هیچ پردازش دیگه ای نداریم و تو همون 500 میلی ثانیه انجام میشه.

alireza9900
15-07-2011, 21:59
از سال 2005 که ARM، شرکت keil رو خرید، تمرکز نرم افزارهای keil رو محصولات ARM شد.
تعدادی از محصولات keil :
uVision IDE (میکرو ویژن) محیط توسعه و دیباگر و شبیه ساز برای محصولات مبتنی بر پردازنده های آرم هست.
ARM Compilation Tools شامل کامپایلر و اسمبلر و لینکر. (معمولا با uVision)
RL-ARM کتابخونه های realtime (سیستم عامل RTX، CAN، TCP/IP ، FLASH و ..)
MDK-ARM مجموعه همه موارد بالا میشه
یه نگاهی به این (You can see links before reply) صفحه بندازین.
برای اینکه بتونین از RTX و کلا کتابخونه بلادرنگ کیل(RL-ARM) استفاده کنین باید لیسانس MDK-ARM Professional رو داشته باشید که کرک رو من پیوست کردم(اگه آنتی ویروستون گفت ویروسه بزنین تو دهنش غیرفعالش کنید :دی من خودم الان اس ات فول آپدیت ویروس نمی شناستش ولی رو یه سیستم دیگه همین اس ات آپدیت نشده میگه ویروسه !!)
اون طور که من فهمیدم فک کنم از نسخه 4.16 به بعد دیگه کلا RL-ARM با MDK-ARM Professional یکی شد(حالا اصلا مهم نیست!)
برای دانلود آخرین نسخه MDK-ARM 4.21 به اینجا (You can see links before reply)برید(اگه فرم بود همین طوری پر کنید بره) این نسخه کامله کامله فقط باید لایسنس رو وارد کنید تا فول شه!(اگه برای کرک کردن مشکلی بود بگید، خجالت نکشید :hi:)
------------------------------------------------------------------------------------------
RTX در دو ورژن پیاده سازی شده :
ورژن ARM7/ARM9
ورژن Cortex M
Cortex M ها امکاناتی برای RTOS درنظر گرفتن. بخاطر همین سیستم عامل با عملکرد بهتری دارن. اما از نظر نحوه کارکرد برای ما تقریبا فرقی نمیکنه.
برای راه اندازی RTX در یک پروژه مراحل زیر رو دنبال کنید:

پروژه جدید ایجاد کنید. از منوی Project – Options (باید قبلش target پروژه رو انتخاب کنید) یا رو پنجره Project رو target راست کلیک و options رو انتخاب کنید. تو پنجره باز شده در تب target قسمت operating system ، گزینه RTX Kernel رو انخاب کنید.
فایل پیکربندی (config) سیستم عامل رو با توجه به میکروکنترلر از پوشه Keil/ARM/Startup تو پوشه پروژه کپی و به پروژه keil اضافه کنید. مثلا برای سری LPC23xx فایل RTX_Conf_LPC23xx.c در پوشه Keil/ARM/Startup/Philips . بعدا در مورد تنظیمات این فایل توضیح میدم.
تنظیمات مربوط به وقفه های نرم افزاری تو فایل اسمبلی startup باید تغییر کنه. (همون فایل اسمبلی که خود keil به پروژه اضافه میکنه. مثلا LPC23xx.s برای فیلیپس و...).
خط SWI_Handler B SWI_Handler رو تو این فایل حذف کنید(اولش ; بذارید) و بجاش این دستور رو اضافه کنید:
IMPORT SWI_Handler
اول این دستور باید به tab یا فاصله بزنید. خلاصه قسمتی از کد که اینطوریه :



Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler

باید به این تغییر داده بشه(کد با ; کامنت شده) :



IMPORT SWI_Handler
Undef_Handler B Undef_Handler
;SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler


علت اینکار: توی آرم های 7 و 9 سیستم برای صدا کردن RTOS از دستورات وقفه نرم افزاری(SWI) استفاده می کنه. وقتی startup اولیه توسط کیل به پروژه اضافه میشه بردار این وقفه ها میره توی یه حلقه بسته واسه اینکار واسه سیستم عامل مشکل ایجاد میکنه.
این به این علته که یه بخشی از RTX توی مد privileged supervisor(دسترسی بالا) اجرا میشه و با SWI کار میکنه واسه همین ما باید اون خط رو حذف کنیم و خط گفته شده رو جایگزین کنیم. البته این کار برای هسته های Cortex نیازی نیست.
ضمنا برای استفاده از سیستم عامل باید فایل rtl.h رو هم تو فایل main پروژه include کنید.
این یه مثال ساده برای LPC2378:



#include <LPC23xx.h>
#include <RTL.h>

__task void task1(void);
__task void task2(void);

int main()
{
IO0DIR = 0x00000003;

os_sys_init(task1);

while (1) {} // ino nezarinam farghi nemikone chon asan barname be inja nemirese !
return 0;
}

__task void task1(void)
{
int i = 0;
os_tsk_create(task2, 1);
while (1)
{
os_dly_wait(50);
if (i == 0)
{
IO0SET = 0x00000001;
i = 1;
}
else
{
IO0CLR = 0x00000001;
i = 0;
}
}
}

__task void task2(void)
{
int i = 0;
while (1)
{
os_dly_wait(25);
if (i == 0)
{
IO0SET = 0x00000002;
i = 1;
}
else
{
IO0CLR = 0x00000002;
i = 0;
}
}
}


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

alireza9900
15-07-2011, 23:01
تنظیمات فایل کانفیگ:
فایل config که به پروژه اضافه کردین رو تو محیط uVision باز کنید. پایین ادیتور روی Configuration Wizard کلیک کنید. اینطوری می تونین بدون درگیر شدن با کدها، تنظیمات رو اتجام بدین.



You can see links before reply


در بخش Task configuration ، جلوی Number of concurrent running tasks باید تعداد تسک ها مشخص بشه.
قسمت Task Stack size مربوط به حافظه استک اختصاص داده شده به هر تسک هست و هر چه برنامه بزرگتر شه باید این مقدارو بیشتر کنید(با توجه به پروژتون و در واقع باید تست کنید بهینه ترین حالت رو پیدا کنید --> اگه کمتر از نیاز برنامه باشه RTX هنگ می کنه) اگر در مورد خود Stack سوالی هست بپرسین پیشتر توضیح بدم.
در بخش Tick Timer Configuration تنظیمات زمانی انجام میشه. کرنل نیاز به یک سخت افزار تایمر داره که دائم طی بازه زمانی مشخصی توسط اون تایمر صدا زده بشه تا مدیریت تسک ها و اعمال سیستم عامل رو انجام بده. تایمر با وقفه دادن مکرر در فاصله زمانی مشخصی که تعیین می کنیم، اصطلاحا Tick رو ایجاد میکنه و با هر Tick تابع مدیریت سیستم صدا زده میشه. زمان مشخص شده برای Tick خیلی مهمه. تمام توابع سیستم عاملی که به نوعی با زمان در ارتباط هستن، با ضریبی از زمان Tick کار میکنن.
در قسمت Hardware timer می تونین یکی از تایمرها رو انتخاب کنید. جلوی Timer clock value باید فرکانس کلاکی که به تایمر وارد میشه رو تعیین کنید. Timer tick value مدت زمان Tickرو تعیین میکنه. مثلا 10000 میکرو ثانیه (10 میلی ثانیه).
در بخش System configuration اگه گزینه Round Robin task switching انتخاب شده باشه، طبق الگوریتم Round Robin، تسک ها بصورت چرخشی سوییچ میشن. جلوی Round Robin timout باید مشخص کنید که به هر تسک به اندازه چند Tick فرصت پردازش داده بشه. مثلا اگه 5 باشه، و زمان هر Tick هم 10 میلی ثانیه باشه، به هر تسک در هر بار 50 میلی ثانیه فرصت پردازش داده خواهد شد. این همون قطعه زمانی که تو پست مربوط به multitask و scheduler گفتم. همونطور که می بینید scheduler یکی از همون قسمت هایی که با Tick کار میکنه.
هرچقدر زمان Tick کمتر باشه، سیستم عامل با دقت و سرعت بیشتری کار میکنه. اما به همون اندازه که زمان Tick رو کم می کنید، توابع سیستم عاملی بیشتر صدا زده میشن، میزان بیشتری از زمان پردازش رو سیستم عامل میگیره. تو هلپ کیل پیشنهاد کرده زمان Tick بین 1 تا 100 میلی ثانیه باشه. بستگی به سخت افزار و میکرویی که استفاده میکنین داره...
اگه Round Robin رو غیر فعال کنین، جابجایی تسک ها بصورت خودکار (در اون بازه زمانی مشخص) انجام نمیشه و فقط دستورات مدیریتی که تو تسک ها می نویسین روند اجرا رو مشخص میکنه.

alireza9900
15-07-2011, 23:42
از این قسمت وارد برنامه نویسی می شیم
با یه مثال شروع می کنم:



#include <LPC23xx.h>
#include <RTL.h>

OS_TID tsk_ID1, tsk_ID2;

__task void task_init(void);
__task void task1(void);
__task void task2(void);

void blink1(void);
void blink2(void);

int main()
{
os_sys_init(task_init);

while(1) {}
return 0;
}

__task void task_init(void)
{
//initialization ports for led
IO0DIR = 0x00000003;

tsk_ID1 = os_tsk_create(task1, 1); // priority:1
tsk_ID2 = os_tsk_create(task2, 1); // priority:1

os_tsk_delete_self(); // necessary
}

__task void task1(void)
{
int i = 0;
while(1)
{
for (i = 0; i < 0x7ffff; i++); //process

blink1(); // roshan ya khamush kardan led1
}
}

__task void task2(void)
{
int i = 0;
while(1)
{
for (i = 0; i < 0x8ffff; i++); //process

blink2(); // roshan ya khamush kardan led2
}
}


برای تعریف تسک، از تابعی با مقدار برگشتی از نوع void و مشخصه __task استفاده می کنیم. هر تسک باید به شکل تابعی با حلقه بی پابان باشه.


__task void task1(void);
__task void task1(void)
{
//initialization
while(1){
//task process
}
}

تابع os_sys_init سیستم عامل رو پس از انجام مقداردهی های اولیه، فعال میکنه. این تابع یک آرگومان ورودی برای مشخص کردن اولین تسک برای اجرا داره. یعنی با اجرای این تابع، سیستم عامل فقط یک تسک رو میشناسه. این تسک بطور خودکار اولویت 1 (کمترین اولویت) رو میگیره. دستور بعد از os_sys_init اجرا نمیشه. درواقع بعد از این تابع، فقط تسک ها هستن که اجرا میشن و برنامه به خط بعد از os_sys_init برنمی گرده. پس برای معرفی بقیه تسک ها به سیستم عامل، باید تو تسک اول اقدام کنیم. معرفی تسک ها توسط تابع os_tsk_create انجام میشه. آرگومان اول تابع، نام تسک و آرگومان دوم اولویت که میتونه بین 1 تا 254 باشه. اعداد بزرگتر اولویت بیشتری دارن. اولویت 0 و 255 رزرو شده هستن و نباید استفاده کنیم. خروجی این تایع یک شماره مشخصه از نوع OS_TID برای تسک ایجاد شده که می تونیم ذخیره کنیم. برای بعضی از توابع سیستم عامل باید از شماره تسک برای مشخص کردن تسک استفاده کنیم. بد نیست یه نگاهی به پروتوتایپ این دو تابع بندازید:


void os_sys_init (void (*task)(void) ); /* Task to start */


OS_TID os_tsk_create (
void (*task)(void), /* Task to create */
U8 priority ); /* Task priority (1-254) */





معمولا تسک اول برای مقداردهی اولیه سیستم و معرفی تسک ها برنامه نویسی میشه. همونطور که می بینید تسکی به نام task_init برای این کار تعریف کردم. اگه دقت کنید این تسک به شکل حلقه بی نهایت نیست و کارش تموم میشه و به پایان تابع میرسه. برای همچین تسک هایی و هر تسکی که عملیاتش تحت شرایطی تموم میشه حتما باید در پایان از تابع os_tsk_delete_self استفاده کنید تا سیستم عامل این تسک رو حذف کنه. اگه این کارو نکنید سیستم هنگ میکنه.
تابع دیگه ای هست به نام os_tsk_delete . این تابع می تونه با گرفتن شماره مشخصه هرتسک (از نوع OS_TID) اونو از سیستم حذف کنه (همین یک پارامتر رو داره). یعنی میشه از تو یه تسک، تسک دیگه ای رو حذف کرد. ID هر تسک، خروجی تابع create اونه. تو کدی که می بینید tsk_ID1 و tsk_ID2 شماره مشخصه task1 و task2 هستن.

alireza9900
15-07-2011, 23:46
خب برنامه پست قبل رو ادامه میدیم. برین تو فایل config و تیک گزینه round robin task switching رو حذف کنید. پروژه رو کامپایل کنید و نتیجه رو ببینین.
فقط تسک اول اجرا میشه! (led دوم چشمک نمیزنه). scheduler سیستم عامل دیگه به شکل round robin عمل نمیکنه. می دونیم که با round robin بعد از هر قطعه زمانی مشخص شده سوییچ تسک انجام میشه. و چون این قطعه زمانی خیلی کوتاه هست، سیستم به ظاهر همه تسک ها رو موازی و همزمان اجرا میکنه.
بدون round robin باید چیکار کرد؟
Cooperative Multitasking
میشه "مشارکتی" ترجمه کرد.
این همون چیزیه که سیستم عامل های اولیه به این شکل عمل میکردن. روند سوییچ تسک ها توسط خود تسک ها مشخص میشه. یعنی خود تسک باید اعلام کنه که فرصت رو در اختیار تسک دیگه قرار بده. دیگه تو برنامه ای که نوشتیم وسط اون حلقه for که مثلا عملیات پردازش رو شبیه سازی میکرد، سوییچ تسک انجام نمیشه. باید بین عملیات تسک به سیستم عامل اعلام کنید زمان پردازش رو در اختیار تسک دیگه ای قرار بده. این کار توسط دستور os_tsk_pass انجام میشه. من هر کدوم از اون حلقه های for رو به چند قسمت تقسیم کردم و وسط اونا به سیستم عامل اعلام کردم که بره سراغ تسک بعد.


__task void task1(void)
{
int i = 0;
while(1){
for (i = 0; i < 0x4ffff; i++); //first portion of process
os_tsk_pass();
for (i = 0; i < 0x4ffff; i++); //second portion of process
os_tsk_pass();
for (i = 0; i < 0x4ffff; i++); //third portion of process
os_tsk_pass();
for (i = 0; i < 0x4ffff; i++); //fourth portion of process

blink1();
}
}

__task void task2(void)
{
int i = 0;
while(1){
for (i = 0; i < 0x5ffff; i++); //first portion of process
os_tsk_pass();
for (i = 0; i < 0x5ffff; i++); //second portion of process
os_tsk_pass();
for (i = 0; i < 0x5ffff; i++); //third portion of process
os_tsk_pass();
for (i = 0; i < 0x5ffff; i++); //fourth portion of process

blink2();
}
}
ما همیشه از round robin استفاده می کنیم. اما در این حالت هم میشه این تابع رو صدا کرد و سوییچ تسک انجام داد (قبل از اینکه قطعه زمانی تسک تموم بشه). اگه این تابع رو صدا بزنین و تسک بعدی اولویت کمتری داشته باشه (یعنی تسک هم اولویت با تسک جاری آماده اجرا نباشه)، سوییچ تسک انجام نمیشه. این تابع همیشه بین تسک های هم اولویت سوییچ میکنه. خب اگه تسک بعد اولویت بیشتری داشته باشه چی؟؟!
این سیستم عامل یه سیستم عامل بلا درنگه (realtime). یعنی هیچ وقت امکان نداره تسک با اولویت بیشتری آماده اجرا باشه و تسک با اولویت کمتری درحال اجرا باشه.

Preemptive multitasking
روش cooperative دیگه جواب گوی سیستم های پیچیده و مخصوصا realtime نبود. این شد که سیستم عامل ها preemptive شدن. یعنی در حالت عادی فقط منتظر دستوری مثل os_tsk_pass نمیشن. و همینطور در حالت round robin منتظر اینتراپت تایمر scheduler نمیشن (که بعد از اون قطعه زمانی سوییچ تسک انجام بشه). در روش Preemptive سیستم عامل به رویدادها پاسخ میده. یعنی هروقت رویدادی اتفاق افتاد که تسک با اولویت بالاتری آماده اجرا شد، بی معطلی سوییچ انجام میشه و اون تسک اجرا میشه. البته این فقط برای تسک های اولویت بالاتر نیست. تسک هایی که با اولویت برابر هم که تو صف اجرای تسک ها هستن اگه بعد از رویدادی آماده اجرا بشن ممکنه درست بعد از تسک جاری زمان پردازش بگیرن. توجه کنید که preemptive کامل شده cooperative. یعنی در این حالت هم os_tsk_pass و round robin عمل میکنن. این سیستم عامل از Preemptive تبعیت میکنه.

مطالعه بیشتر:
Computer multitasking - Wikipedia, the free encyclopedia (You can see links before reply)

alireza9900
16-07-2011, 00:21
این پست در مورد توابع تاخیر سیستم عامله. موقع استفاده از سیستم عامل باید از این توابع برای ایجاد تاخیر ایجاد کنین. این بحث در ادامه بحث روند های اجرای تسک ها و preemptive multitasking. البته نمیشه گفت توابع تاخیر دقیقا به سیستم عامل های preemptive مربوط میشه.
برای اینکه دقیقا زمان بندی رو ببینین باید برنامه رو پروگرم کنین و در عمل ببینین. در این مورد شبیه ساز اصلا دقیق عمل نمیکنه...

تابع os_dly_wait سیستم عامل، یک ورودی داره که تعداد tick برای ایجاد یه تاخیر رو مشخص می کنه. با مثال توضیح بدم راحتره. برنامه زیر رو ببینین:




#include <LPC23xx.h>
#include <RTL.h>

OS_TID tsk_ID1, tsk_ID2, tsk_ID3;

__task void task_init(void);
__task void task1(void);
__task void task2(void);
__task void task3(void);

int main()
{
os_sys_init(task_init);

while(1) {}
return 0;
}

__task void task_init(void)
{
/*
* initialization ports for led
*/

tsk_ID1 = os_tsk_create(task1, 1); // priority:1
tsk_ID2 = os_tsk_create(task2, 1); // priority:1
tsk_ID3 = os_tsk_create(task3, 2); // priority:2

os_tsk_delete_self(); // necessary
}

__task void task1(void)
{
int i = 0;
while (1)
{
for (i = 0; i < 0x5ffff; i++); //first portion of process
for (i = 0; i < 0x5ffff; i++); //second portion of process

// Blink //
}
}

__task void task2(void)
{
int i = 0;
while (1)
{
for (i = 0; i < 0x6ffff; i++); //first portion of process
for (i = 0; i < 0x6ffff; i++); //second portion of process

// Blink //
}
}

__task void task3(void)
{
while (1)
{
os_dly_wait(50);
// Blink //
}
}


Task3 رو اضافه کردم که اولویتش 2 هست. یعنی از task1 و task2 اولویت بیشتری داره. تو این تسک فقط عمل چشمک زدن انجام میشه. با شروع به کار سیستم عامل، task3 که بالاترین اولویت رو داره اجرا میشه. در ابتدای این تسک تابع os_dly_wait با ورودی 50 فراخوانی میشه. یعنی می خوام به اندازه 50 تیک تو اجرای این تسک تاخیر ایجاد کنم. با توجه به اینکه زمان هر تیک رو 10 میلی ثانیه مشخص کردم، این تاخیر میشه 500 میلی ثانیه. خب بعد از اجرای این تابع، سیستم عامل این تسک رو به حالت معلق در میاره تا زمان تاخیرش تموم بشه و برگرده تسک رو ادامه بده. نکته مهم اینه که تو این زمان وقت پردازنده تلف نمیشه. سیستم عامل میره تسک های با اولویت بیشتر رو اجرا میکنه. یعنی تو این زمان task1 و task2 که اولویت برابری دارن بطور همزمان اجرا میشن. به محض اینکه زمان تاخیر برای task3 تموم شد، ادامه این تسک بدون مزاحمت هیچ تسک دیگه ای اجرا میشه. دستور بعدش اجرا میشه و دوباره به wait میرسه... اگه دقت کنین عمل چشمک زدن توسط task3 خیلی منظم انجام میشه. این بخاطر اینه که اولویت بالاتری داره و به محض اینکه زمان تاخیرش به اتمام برسه، فورا اجرا میشه.
task3 رو تغییر بدین:



__task void task3(void)
{
int i = 0;
while (1)
{
os_dly_wait(50);
for (i = 0; i < 0x9ffff; i++); //process
// Blink //
}
}

واضحه که بخاطر حلقه for زمان تاخیر بیشتر میشه. فرض کنید می خوایم تسکی تعریف کنیم که به طور متناوب طی زمان دقیقی اجرا بشه. تو بحث های کنترلی همچین مواردی زیاد پیش میاد که عملی در زمان های دقیقی اجرا بشه. همین task3 با وجود حلقه for. می خوایم هربار که حلقه تسک (while) دوباره می خواد اجرا بشه 500 میلی ثانیه از شروع اجرای دفعه قبل زمان گذشته باشه. یعنی عملی می خوایم که هر 500 میلی ثانیه اجرا بشه (صرف نظر از اینکه اجرای خودش چقدر طول میکشه). ما نمی دونیم پردازش تو تسک (حلقه for) چقدر طول میکشه. بستگی به شرایط داره و موقعیت داره. ممکنه یه بار 200 میلی ثانیه طول بکشه یه بار دیگه 100 میلی ثانیه. اگه مطمئن بودیم که مثلا 100 میلی ثانیه طول میکشه، تاخیر اول تسک رو 40 (400 میلی ثانیه) تعریف میکردیم. توجه کنید که تاخیر این حلقه for رو میشه حساب کرد. اما اینو من همینطوری نوشتم. در عمل کد واقعی که برای تسک می نویسین با توجه به شرطها و ورودی ها ممکنه به شکل های مختلف اجرا بشه. ضمنا اگه تسک های هم اولویت هم داشته باشیم دیگه بدتر...
خب راه حل :
توی سیستم عامل ها (مخصوصا realtime) روش بسیار مهمی دیگه ای برای ایجاد تاخیر وجود داره. در این روش هر بار که به تابع تاخیر رسیده بشه، مدت زمان گذشته شده از فراخوانی بار قبل تابع محاسبه میشه و از تاخیر جدید کم میشه. مثلا اگه زمان تناوب رو 500 میلی ثانیه تعریف کرده باشیم و 100 میلی ثانیه از تاخیر بار قبل گذشته باشه، با رسیدن به تابع تاخیر، 400 میلی ثانیه تاخیر ایجاد میشه.
کد تسک باید اینطوری نوشته بشه:



__task void task3(void)
{
int i = 0;
os_itv_set(50);
while (1)
{
os_itv_wait();
for (i = 0; i < 0x9ffff; i++); //process
// Blink //
}
}

تابع os_itv_set زمان تناوب رو مشخص میکنه و os_itv_wait هم تاخیر تناوبی رو ایجاد میکنه.
حالا اگه اجرای تسک بیشتر از زمان تاخیر اجرای مجدد تسک طول بکشه چه اتفاقی میوفته؟؟
اولا که برنامه نباید اینطوری نوشته شه!!! منطقی نیست دیگه!!
اما خب اگه اشکالی پیش بیاد و اینطوری بشه، تسک دوباره اجرا نمیشه. تابع تسک فقط یک بار اجرا میشه. برنامه طبق روال عادی اجرا میشه و بعد از اینکه به تابع تاخیر رسید، هیچ تاخیری ایجاد نمیشه. مثل یه دستوری عادی ازش رد میشه.

alireza9900
16-07-2011, 00:50
رویدادها
این پست به تعیین رویدادها و اینکه چطوری تسک ها می تونن اجرای هم رو کنترل کنند، اختصاص داره. (preemptive)
طبق معمول با مثال توضیح میدم. فرض کنید تسکی داریم که برای اجرا شدنش باید چندتا تسک دیگه کامل یا تا حدودی اجرا شده باشن. مثلا به داده های نیاز داره که توسط چندتا تسک دیگه تامین میشه. یا اینکه زمینه اجرای این تسک رو، چندتا تسک دیگه آماده کنن. به دلیل اینکه ممکنه شرایط مختلفی پیش بیاد ما نمی تونیم دقیق مشخص کنیم که اون تسک ها کی به مرحله ای میرسن که زمینه برای اجرای تسک مورد نظر آماده بشه.
هر تسک یک پرچم (flag) 16 بیتی برای تعیین رویدادها داره. هر بیت یک رویداد. فرض کنید task3 به مرحله ای از اجرا که رسید که باید منتظر 2 تا رویداد بمونه بعد ادامه بده. این تسک با اشاره به 2 تا از بیت های پرچمش به سیستم عامل اعلام میکنه که منتظره این دو پرچم فعال بشن و بعد ادامه بده. این 2 تا رویداد توسط دو تسک دیگه به نام های task1 و task2 تامین میشن. پس تو هر کدوم از تسک های 1 و 2 باید در قسمت مورد نظر این دو پرچم فعال شده و رویداد خودشون رو اعلام کنن. به محض اینکه هر دو پرجم فعال شدن، task3 روند اجرای خودش رو ادامه میده.



#include <LPC23xx.h>
#include <RTL.h>

OS_TID tsk_ID1, tsk_ID2, tsk_ID3;

__task void task_init(void);
__task void task1(void);
__task void task2(void);
__task void task3(void);

int main()
{
os_sys_init(task_init);

while(1) {}
return 0;
}

__task void task_init(void)
{
/*
* initialization ports for led
**/

tsk_ID1 = os_tsk_create(task1, 1); //priority:1
tsk_ID2 = os_tsk_create(task2, 1); //priority:1
tsk_ID3 = os_tsk_create(task3, 2); //priority:2

os_tsk_delete_self(); //necessary
}

__task void task1(void)
{
int i = 0;
while(1)
{
for (i = 0; i < 0x5ffff; i++); //process
os_evt_set(0x1, tsk_ID3);
}
}

__task void task2(void)
{
int i = 0;
while(1)
{
for (i = 0; i < 0x6ffff; i++); //process
os_evt_set(0x2, tsk_ID3);
}
}


__task void task3(void)
{
while(1)
{
os_evt_wait_and(0x3, 0xffff); //wait for bit 1 and 2 forever
// Blink //
}
}


در ابتدای اجرای خودش توسط تابع os_evt_wait_and اعلام میکنه که منتظر بیت شماره 0 و 1 پرچم میمونه. پارامتر اول الگوی بیت های مورد نظر تابع رو مشخص میکنه (حداکثر 16 بیت). 0x3 یعنی دو بیت اول. پارامتر دوم timeout رو مشخص میکنه. یعنی اندازه زمانی که تسک منتظر اتفاق افتادن این رویدادها باشه. بعد از گذشت این زمان، بدون توجه به رویدادها تسک ادامه پیدا میکنه. این پارامتر هم 16 بیتی به غیر از 0xffff. مقدار 0xffff یعنی بی نهایت (تابع اونقدر منتظر میمونه تا رویدادها صورت بگیرن). خب بعد از اجرای این تابع، تسک به حالت معلق درمیاد. task1 و task2 ادامه داده میشن تا هر کدوم به دستور os_evt_set برسن. اینجا همونجایی که توسط این تسک ها اعلام رویداد میشه. پارامتر دوم این تابع شماره ID تسکی که می خوایم بیت های پرچمش رو یک کنیم. پارامتر اول بیت های مورد نظر برای فعال شدن رو مشخص میکنه. همونطور می بینید task1 بیت شماره 0 و task2 بیت شماره 1 از پرچم task3 رو فعال میکنه. بعد از فعال شدن هر دو بیت، task3 دوباره فعال میشه، تابع wait تسک3 همه بیت های پرچم رو صفر میکنه (برای دفعه بعد) و از تابع خارج میشه تا تسک ادامه پیدا کنه.
تابع wait رویداد یک مقدار برگشتی هم داره (برای وقتی که timeout غیر از 0xffff باشه) اگه مقدار برگشتی OS_R_EVT باشه یعنی با فعال شدن پرچم ها (رویداد) از تابع گذشته شده و اگه OS_R_TMO باشه یعنی زمان timeout تموم و از تابع خارج شده. با توجه به این مقدار برگشتی میشه تصمیم گیری مناسب کرد.

تابع مشابه دیگه ای به نام os_evt_wait_or وجود داره که فقط منتظر یکی از بیت های مشخص شده پرچم میمونه. یعنی لازم نیست همه بیت های مشخص شده برای پرچم یک بشن تا از تابع گذشته بشه. فقط یکی از بیت ها کافیه. برای اینکه بفهمیم کدوم یکی از بیت ها (کدوم رویداد) باعث فعال شدن تسک شده، از تابع os_evt_get استفاده میکنیم. خروجی این تابع مقدار 16 بیتی که بیت رویداد مورد نظر رو یک کرده.

یه نکته مهم اینکه تو توابع وقفه irq (نه fiq) از تابع isr_evt_set برای فعال کردن پرچم ها استفاده میشه (نه تابع os_evt_set)

می خوام نقش این توابع تعیین رویداد رو بیشتر درک کنید
فکر کتید اگه این توابع نبودن باید چیکار میکردین؟؟
...
...
میشه چندتا متغیر سراسری تعریف کرد. مقدارشون صفر بشه. تو تابعی که قراره wait بخوره، این متغیر ها رو تو حلقه چک میکنیم. تا موقعی که صفر هستن از حلقه گذشته نشه. مقدار این متغیرها هم تو تسک هایی که رویداد رو تولید میکنن یک میشه...
خب بنظرتون اشکالش چیه؟
اگه task3 که می خواد منتظر رویداد باشه، اولویتش از تسک های دیگه بیشتر باشه (مثل مثال بالا)، تا موقعی که داره دستوراتش (حلقه چک کردن متغیر) اجرا میشه، اصلا اجازه اجرا شدن تسک های دیگه رو نمیده!! (یعنی برنامه همین جا قفل میشه)
اگه این تسک با تسک های دیگه هم اولویت باشه، اجازه اجرا به اونا هم داده میشه. اما خب زمان پردازش به task3 هم داده میشه. یعنی پردازش بیخود. تلف کردن وقت پردازنده. در حالی که اگه از تابع تعیین رویداد سیستم عامل استفاده کنیم، دیگه سراغ task3 نمیاد(تسک به حالت معلق درمیاد) تا وقتی که رویدادها صورت بگیرن.

alireza9900
16-07-2011, 01:10
سلام
تا اینجا بیشتر مباحث مقدماتی و متوسط کار با RTX گفته شد. شما با این اطلاعات خیلی کارا می تونید بکنید در حال حاضر!
ولی هنوز بخش های مهم دیگه ای موندن که اگه خدا بخواد در آینده در موردشون صحبت می کنم. ولی خب الان که با مقدمات آشنا شدید خیلی راحت تر می تونید به رفرنس های خود Keil در این باره مراجعه کنید.

تا اینجا هر سوالی هست اگه بتونم جواب بدم در خدمتم:shj:

پ.ن: دوستان اگه از هر قسمت استفاده کردین یه تشکر کوچولو هم بزنید براش(ثواب داره :دی)

موفق باشید :cry::gop:

kavir
16-07-2011, 19:11
سلام
کارت عالی بود:wink:
در آخر همه مطالب به صورت یک مقاله در می آوریم

agape
17-07-2011, 21:56
آقای alireza9900 (You can see links before reply) ادامه بده که کارت حرف نداره

alireza9900
18-07-2011, 00:25
چشم هر وقت بتونم مطلب جدید می ذارم
البته اون تاپیک PDA (You can see links before reply) هم که زدم تا چند وقت دیگه که بردش رو بزنم یه کار کامل با آرم هست که سیستم عاملشم RTX هست اونجاهم فایلای پروژه رو میذارم و می تونه خودش یه آموزش خوب باشه.
:gop:

h11
05-08-2011, 22:50
با سلام خدمت دوستان،كسي در مورد سيستم عامل vx work چيزي ميدونه؟

kavir
05-08-2011, 23:53
با سلام خدمت دوستان،كسي در مورد سيستم عامل vx work چيزي ميدونه؟
سلام
اینجا پورت کردنش با LPC2106
TNKernel real-time system (You can see links before reply)
توی NXP هم توضیحات کاملش هست البته راه اندازی با LPC32

mzarkoob
09-08-2011, 16:09
پ.ن: دوستان اگه از هر قسمت استفاده کردین یه تشکر کوچولو هم بزنید براش(ثواب داره :دی)




با سلام وخسته نباشد خدمت آقا علیرضا
بابت این مطالب آموزشی بسیار بسیار تشکر. به نظر من که باید طوری تنظیم بشه که تا وقتی دگمه تشکر زده نشه این مطالب قابل رویت نباشه!!!! ( تو یه سایتی همین طوری بود ...!) . من هم پیگیر این مطالب هستم و تازه به اهمیت این کار برای پروژه های سنگین، پی بردم و برام سوال بود که یه میکرو پسقلی چطوری باید این همه کارو انجام بده!:mrgreen:

alisaeed
09-08-2011, 22:43
سلام آغا خسته نباشید
میدونم این پست مربوط به rtx هست اما 1 سوال در مورد سیستم عامل FreeRTOS داشتم کسی تا حالا باهاش کار کرده؟آخه rtx فقط توی keil قابل استفاده است من میخواستم توی محیط eclips برنامه بنویسم.کسی از دوستان اگه میتونه راهنمایی کنه خیلی ممنون میشم.

alireza9900
09-08-2011, 23:28
توی انجمن در مورد FreeORTS بحث شده و دوستان هم راه اندازی کردن.
یه سرچ بکنید پیدا می کنید.

موفق باشید

megahamed22
21-08-2011, 12:59
سلام
برای پروگرم کردن سیستم عامل rtx بروی arm باید از پروگرامر ulink استفاده کرد یا با samba هم می شه
اگه بشه اساتید یک آموزشی در این زمینه بدهید ممنون می شم

alireza9900
21-08-2011, 13:05
هیچ فرقی نمی کنه خوب!
شما یه فایل هگز یا باینری داری تهش که با هر پروگرمری می تونی بریزی روی میکرو

mzarkoob
03-11-2011, 10:27
با سلام
من داشتم روی rtx یه بررسی می کردم ولی برای کامپایل برنامه در تایپیک 13 و ... که مثال آورده شده به دستور IO0DIR خطا میده! و اگهFIO0DIR بشه درست میشه. دلیل خاصی داره؟
در ضمن این کرک در ضمیمه 13 دانلود نمیشه. من کیلم Keil_MDK4.2 هست. برای استفاده از این مد به غیر از کرک فعال سازی خودش چیز دیگری لازم داره؟

alireza9900
03-11-2011, 17:03
من کیلم Keil_MDK4.2 هست. برای استفاده از این مد به غیر از کرک فعال سازی خودش چیز دیگری لازم داره؟
درست یادم نمی یاد برای MDK 4.2 باید بسته rl_arm جداگانه نصب می شد یا خیر(از 4.21 به بعد ولی مطمئنم که نیاز به بسته اضافی نیست)
ولی اگه در محل نصب کیل فولد RL/RTX و همینطور فایل های RV31/LIB/RTX_*.lib هست فکر نکنم نیازی به بسته اضافی باشه.

در ضمن این کرک در ضمیمه 13 دانلود نمیشه.
دوباره ضمیمه کردم

mzarkoob
04-11-2011, 23:40
خب برنامه پست قبل رو ادامه میدیم. برین تو فایل config و تیک گزینه round robin task switching رو حذف کنید. پروژه رو کامپایل کنید و نتیجه رو ببینین.
فقط تسک اول اجرا میشه! (led دوم چشمک نمیزنه).
ببخشید من تو این قسمت گیر کردم. اگه ممکنه یه راهنمایی بکنید حل بشه!
بعد از اینکه برنامه مثال الی در پست 13 را اصلاح کردم با شبیه سازی در خود کیل چیزی مشاهده نمیشه هر دو پایه p0.0 و p0.1 بدون پالسه! (ضمیمه اول)
برنامه پست 15 هم همین طوره،میگه blink1 ,2 را نمیشناسه و یه چیزی هم که جاش بذارم مثل قبلی کاری انجام نمی ده.
البته من روی برد نریختم و فقط شبیه سازی خود کیل را میگم

alireza9900
04-11-2011, 23:54
در این زمینه اصلا نمیشه روی شبیه ساز اتکا کرد
فقط روی برد تست کنید
کلا منم هیچ وقت نتونستم از شبیه ساز کیل در این زمینه جواب بگیرم(ولی شبیه سازی سخت افزاری مثلا با jlink خوب جواب می ده)

mzarkoob
16-11-2011, 23:38
این RTX هم چیز باحالیه!! من برنامه پست 15 (You can see links before reply) را تعمیم دادم برای 8 تا task که led های روی برد را هر کدام با یک زمان مشخص از کم به زیاد ، خاموش روشن کنه و روی برد کار میکنه، چون جا یه مثال آماده را خالی دیدم ضمیمه کردم.
حتما تست کنید:0013:


ولی هنوز بخش های مهم دیگه ای موندن که اگه خدا بخواد در آینده در موردشون صحبت می کنم.

ما بیصبرانه منتظر هستیم که این آینده از راه برسه... ولی نمی دونم چرا نمیرسه:mrgreen:

alireza9900
17-11-2011, 12:11
این RTX هم چیز باحالیه!! من برنامه پست 15 (You can see links before reply) را تعمیم دادم برای 8 تا task که led های روی برد را خاموش روشن کنه و روی برد کار میکنه، چون جا یه مثال آماده را خالی دیدم ضمیمه کردم.


ما بیصبرانه منتظر هستیم که این آینده از راه برسه... ولی نمی دونم چرا نمیرسه:mrgreen:
ممنون که این تاپیک رو دارین بهش جون می دین:hi:
در مورد ادامه هم خودمم خیلی دوست دارم ولی الان من سوم هستم و از همین الان دوستان(خانواده، مشاورای عیزیز و...lov: :unh::cry:) فشار میارن که بخونید برای کنکور:(؛ برای همین شرمنده دوستان هم هستم ادامش ندادم
درکل بهترین منبع یادگیریش همون pdf ای که لینکش رو گذاشتم و خود رفرنس کیل هستش(هلپ کیل)

همگی موفق باشیم

arm-mohsen-avr
18-03-2012, 22:39
با سلام :hi:
لطفا اگه میشه کرک RL-ARM برای RTX رو بزارید وقتی که برنامه رو کامپایل می کنم خطای لایسانس می ده

File_Explorer.axf: Error: L9937E: RL-ARM is not allowed with this license
باتشکر:0013:

sadmonew
18-03-2012, 22:56
با سلام :hi:
لطفا اگه میشه کرک rl-arm برای rtx رو بزارید وقتی که برنامه رو کامپایل می کنم خطای لایسانس می ده

file_explorer.axf: Error: L9937e: Rl-arm is not allowed with this licenseباتشکر:0013:
سلام مهندس

با همون كركي كه داريد يه لايسنس براي rl-arm هم تعريف كنيد.
لطفا عكسو نگاه كنيد.

pumper
19-03-2012, 00:10
سلام اگه ممکنه در مورد توابع وقفهسخت افزارهای مختلف میکرو و نحوه استفادشون هم یه توضیح بدین.
مثلا اگه بخوایم ارتباط سریال داشته باشیم یا از dma استفاده کنیم.
ممنون

pswin
26-03-2012, 13:53
سلام
من از هدر بودر eca (2368 و 1768 استفاده ميكنم و به دو تا مشكل برخوردم:

1. فايل كانفيگ براي 1768 وجود نداره
2. توي 2368 هم زمانبندي انجام نمي گيره. يعني بعد از init تسك اول اجرا ميشه و بعد از اون هيچ چيز ديگه اي اجرا نميشه و جتي تسك اول هم به حالت تعليق در مياد

mihman
03-04-2012, 14:11
Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler





IMPORT SWI_Handler
Undef_Handler B Undef_Handler
; SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler


سلام.من این تغییرات را انجام دادم.ولی به هنگام کامپایل برنامه خطاهای زیر را میگیره :

Build target 'Target 1'
assembling LPC2300.s...
linking...
RTX.axf: Error: L6218E: Undefined symbol os_error (referred from rt_hal.o).
RTX.axf: Error: L6218E: Undefined symbol os_irq_ack_lock (referred from rt_hal.o).
RTX.axf: Error: L6218E: Undefined symbol os_stackinfo (referred from rt_hal.o).
RTX.axf: Error: L6218E: Undefined symbol tsk_unlock (referred from rt_hal.o).
RTX.axf: Error: L6218E: Undefined symbol os_fifo (referred from rt_system.o).
RTX.axf: Error: L6218E: Undefined symbol os_tmr_force_irq (referred from rt_system.o).
RTX.axf: Error: L6218E: Undefined symbol os_tmr_inspect_cnt (referred from rt_system.o).
RTX.axf: Error: L6218E: Undefined symbol os_tmr_inspect_ovf (referred from rt_system.o).
RTX.axf: Error: L6218E: Undefined symbol m_tmr (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol mp_stk (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol mp_stk_size (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol mp_tcb (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol mp_tcb_size (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol mp_tmr_size (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol os_active_TCB (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol os_fifo_size (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol os_idle_demon (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol os_maxtaskrun (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol os_tmr_init (referred from rt_task.o).
RTX.axf: Error: L6218E: Undefined symbol __SWI_5 (referred from SWI_Table.o).
RTX.axf: Error: L6218E: Undefined symbol os_tmr_call (referred from rt_timer.o).
RTX.axf: Error: L6218E: Undefined symbol os_rrobin (referred from rt_robin.o).
RTX.axf: Not enough information to list image symbols.
RTX.axf: Finished: 1 information, 0 warning and 22 error messages.
Target not created

جالب اینجاست که اگه تغییرات فوق را انجام ندم،دیگه خطا نمیگیره.کسی میدونه مشکل از کجاست؟

sadmonew
03-04-2012, 16:29
سلام مهندس:hi:
لطفا فايل پروژه اي كه تغييرات رو توش اعمال كردين اينجا بذارين.
نميشه بدون بررسي كردن چيزي گفت. البته فعلا

mihman
03-04-2012, 21:57
ممنون

sadmonew
03-04-2012, 22:11
ممنون
سلام دوست من
اين فايلي كه گذاشتين، اون تغييرات رو توش اعمال كردين؟

mihman
03-04-2012, 23:06
سلام دوست من
اين فايلي كه گذاشتين، اون تغييرات رو توش اعمال كردين؟

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

avr.mohsen
01-07-2012, 18:35
خدمت اساتید عزیز سلام عرض می کنم.:hi:
در این برنامه که پیوست کردم
وقفه رابط سریال را فعال کردم وقتی کاراکتری دریافت کرد
تسک READKEY که اولویتش هم از همه بالاتر است کارش را ادامه بده و کاراکتر دریافتی را ارسال کند.
مشکل:
1.وقتی برنامه اجرا می شود (میکرو ریست می شود) تا زمانی که کاراکتری از رابط سریال دریافت نکرده مشکلی وجود ندارد و LEDها چشمک می زند ولی زمانی که کاراکتری ارسال می شود سیستم هنگ می کند.و کاراکتر هم ارسال نمی کند.
سوال:
1.اصلا در سیستم عامل RTX روش پیاده سازی وقفه چیست درست این کار را کرده ام.

hesam1
01-07-2012, 23:11
سلام دوستان
کجا میشه یه آموزش جامع و کامل از این سیستم عامل پیدا کرد؟
آیا آموزش فارسی غیر از این مطالب ارائه شده وجود داره؟
اگه کسی چیز خوبی در اختیار داره لطف کنه همین جا برای همه آپلود کنه!

avr.mohsen
02-07-2012, 18:36
بازم سلام
چون کسی جواب نداد خودم اشتباهم رو متوجه شدم می گم که مابقی حواسشونو جمع کنند اشتباه من را تکرار نکنند.
استفاده از دستور
os_evt_set
به جای دستور
isr_evt_set
در وقفه ها:018::018::018:

vivid
14-07-2012, 15:53
سلام به همگی
ضمن تشکر از اموزشهای دوستای عزیز
اگه ممکنه در باره اینکه چرا برنامه که به os_sys_init(task_init); تومثال 8led میرسه هنگ میکنه و به اولین تسک هم نمیره یه توضیحی بدید ممنون
اینم بگم بردم همون lpc2378 eke2 هستش
با بوت لودر usb هم پروگرم میکنم

hariri2
13-08-2012, 17:08
سلام
من از هدر بودر eca (2368 و 1768 استفاده ميكنم و به دو تا مشكل برخوردم:

1. فايل كانفيگ براي 1768 وجود نداره
2. توي 2368 هم زمانبندي انجام نمي گيره. يعني بعد از init تسك اول اجرا ميشه و بعد از اون هيچ چيز ديگه اي اجرا نميشه و جتي تسك اول هم به حالت تعليق در مياد

1.برای کانفیگ1768 system_LPC17xx.c و RTX_Conf_CM.c

2.از چه کدی استفاده کردید؟

hariri2
13-08-2012, 18:05
سلام به همگی
اگه ممکنه در باره اینکه چرا برنامه که به os_sys_init(task_init); تومثال 8led میرسه هنگ میکنه و به اولین تسک هم نمیره یه توضیحی بدید ممنون
با بوت لودر usb هم پروگرم میکنم

مقدار task stack را زیاد کنید شاید درست شد
.

Ramin_Ghn
16-10-2012, 01:01
سلام

RL_ARM کرک شده ورژن 4.13 :

rlarm413.rar (You can see links before reply)

kheiri.saeid
09-11-2012, 17:38
درست یادم نمی یاد برای MDK 4.2 باید بسته rl_arm جداگانه نصب می شد یا خیر(از 4.21 به بعد ولی مطمئنم که نیاز به بسته اضافی نیست)
ولی اگه در محل نصب کیل فولد RL/RTX و همینطور فایل های RV31/LIB/RTX_*.lib هست فکر نکنم نیازی به بسته اضافی باشه.

دوباره ضمیمه کردم


سلام
من فایل keygen را ندارمو متاسفانه لینک مورد نظر در پست شما کار نمیکنه، اگه امکانش هست مجدداً آپلود کنید یا اگر به ایمیل من بفرستید ممنونتون میشم.
kheiri.saeid@gmail.com

cheshmayebaru
12-12-2012, 23:40
این سیستم عامل برای avr هم استفاده میشه

mansoory
18-12-2012, 16:29
حیف...
واقعا حیف که این آموزش رها شد...
این یکی از قشنگترین آموزشهای این انجمن بوده. کار alireza9900 واقعا درسته و انشای خیلی روان و زبان ساده ای که بکار برده تحسین برانگیزه. کاش ادامه پیدامیکرد...

M3R
08-01-2013, 19:04
سلام.
اين برنامه رو نوشتم ولي نميدونم چرا فقط تسک1 اجرا ميشه !! تو تابع init هر تسکي رو که اول مينويسم فقط همون تسک اجرا ميشه :( مشکل از چيه؟


#include <lpc23xx.h>
#include <rtl.h>
OS_TID tsk_ID1,tsk_ID2;
__task void task1 (void);
__task void task2 (void);
__task void init (void);
int main(){

os_sys_init(init);


while(1){

}
}
__task void init (void){

IODIR0=0X03;
IOSET0=0;
os_tsk_create (task1,1);
os_tsk_create (task2,1);
os_tsk_delete_self();
}

__task void task1 (void){

int i=0;

while(1){

os_dly_wait (25);
if (i==0){
IOSET0=0x01;
i=1;
}
else{
IOCLR0=0x01;
i=0;
}

}
}
__task void task2 (void){
int f=0;
while(1){
os_dly_wait (50);
if (f==0){
IOSET0=(1<<1);
f=1;
}
else{
IOCLR0=(1<<1);
f=0;
}
}
}

sadmonew
08-01-2013, 20:17
سلام مهندس
احتمالا مشکل به خاطر این پیش میاد که اولویت اجرای هر دو تسک رو 1 گذاشتین منظورم تو این دو تا خط:


os_tsk_create (task1,1);
os_tsk_create (task2,1);

roohlla
08-01-2013, 23:25
توی تنظیمات rtx یه قسمت وجود داره به نام تنظیمات زمان بندی . احتمال خیلی زیاد تنظیم اون قسمت رو از فایل کانفیگ rtx اشتباه وارد کردید . یه حالت مدیریت تسک توی سیسم عامل ها وجود داره به pre-emptive multi tasking اسپلش رو نمیدونم درست باشه یا نه . اگه اون حالت فعال باشه اون مشکلی که گفتید به وجود میاد . در این حالت شما با دستور os_task_pass باید دستور ایدل شدن تسک جاری یا انتقال به تسک بعدی رو صادر کنی .

roohlla
08-01-2013, 23:33
در ضمن اولویت تسک ها باید یکسان باشه وگرنه تا زمانی که تسک با اولویت بالا تر در حالت اکتیوه تسک با اولویت پایین تر اجرا نمیشه .

roohlla
08-01-2013, 23:42
در ضمن اولویت تسک ها باید یکسان باشه وگرنه تا زمانی که تسک با اولویت بالا تر در حالت اکتیوه تسک با اولویت پایین تر اجرا نمیشه .

roohlla
08-01-2013, 23:53
در ضمن اولویت تسک ها باید یکسان باشه وگرنه تا زمانی که تسک با اولویت بالا تر در حالت اکتیوه تسک با اولویت پایین تر اجرا نمیشه .

M3R
10-01-2013, 00:34
سلام
مشکلم حل شد!
همینطور که تو شکل زیر نشون دادم تو قسمت کانفیگ rtx اون قسمت که زرد رنگ هست رو 2 بود برای همین 2 تا تسک رو بیشتر اجرا نمیکرد و ماکزیممش هم 88 هست که تو شکل میبینید

pswin
10-01-2013, 02:22
فكر كنم تعداد تسك به ميزان sram بستگي داشته باشه. يعني اگر ميزان پشته هر تسك رو كم كني. تعدادش افزايش پيدا كنه.متاسفانه داخل مشخصات 1768 زده كه 64 كيلو رم داره اما ظاهرا تنها 32 كيلوي اون در دسترس هست و مابقي براي دستگاه ها هست ( يا شايد هم من اشتباه مي كنم).

نمي دونم چرا ميزان رم اين ميكرو كنترلرها اينقدر كمه!. مثلا چي مي شد يه چيزي حدود 512 كيلو رم داشت؟! (البته به غير از بحث قيمت)

M3R
12-01-2013, 01:56
سلام.
چطور میتونم یه متغییر تعریف کنم که بتونم تو تمام تسکها ازش استفاده کنم یا یه متغییر رو به عنوان خروجی یه تسک بگیرم؟؟
میخوام یه تسک داشته باشم برای خوندن adc و بعد این مقدار خونده شده رو تو یه تسک دیگه استفاده کنم

roohlla
12-01-2013, 04:58
برای این کار شما دو راه داری ، یه راه حرفه ای و برای برنامه های بزرگ و یه راه غیر حرفه ای و برای برنامه های کوچیک .
من اول راه غیر حرفه ای رو میگم :
شما میاید توی برنامه و قبل از تابع main متغیری جهانی تعریف میکنید . این متغیر در همه جای برنامه ، حتی در تسک ها قابل دسترسه .
دوم راه حرفه ای :
شما میاید و از قابلیت mailbox سیستم عامل استفاده میکنید . با این قابلیت شما میاید یه میل باکس تعریف کرده و اطلاعات رو به ای میل باکس ارسال و از اون دریافت میکنید . برای جزئیات بیشتر در این مورد به رفرنس منوال مراجعه کنید .

M3R
15-01-2013, 01:34
سلام.
کسی با mailbox سیستم عامل RTX کار کرده؟؟
چند تا مثال رو اجرا کردم ولی نمیدونم چرا موقع دریافت با دستور os_mbx_wait گیر میکنه!!
این همون مثالی هست که تست کردم
You can see links before reply

mansoory
12-03-2013, 15:42
سلام.
کسی با mailbox سیستم عامل RTX کار کرده؟؟
چند تا مثال رو اجرا کردم ولی نمیدونم چرا موقع دریافت با دستور os_mbx_wait گیر میکنه!!
این همون مثالی هست که تست کردم
You can see links before reply

سلام.
بله. مشکل رو پیدا کردم.
باید این دستور باید در اولین تسک (و نه در تابع main ) و پیش از اولین استفاده از mailbox قرار بگیره:

os_mbx_init(MsgBox, sizeof(MsgBox));

شما این دستور رو در تسک send قرار داده اید و تا اینجا درست بوده. ولی os_dly_wait که قبل از این دستوره کار رو خراب کرده و موجب شده که تسک recieve اجرا بشه که توی اون تسک از mailbox خونده اید. به همین دلیل توی حالت wait_mbx میمونه.
دستور تاخیر رو به بعد از os_mbx_init انتقال بدید درست میشه
موفق باشید

Dr.ROOSTA
04-04-2013, 18:37
سلام به همه دوستان ؛ بخصوص استاد منصوری عزیز و عرض خسته نیاشید به همتون.
اقا یسری تاپیک تو سایت ecaهست در مورد rtx . خیلی روونه و واضح . اینم یه فایل که can رو با این سیستم عامل پیاده سازی کرده.

hamid_reza
02-07-2013, 13:41
سلام آقا علیرضا
واقعا" عالی بود.حرف نداره!
ممنون

rezasede
20-07-2013, 15:49
سلام
ممنون از آموزش هاتون
این مقاله کل اموزش های داده شده:

mzarkoob
06-11-2013, 10:07
حیف...
واقعا حیف که این آموزش رها شد...
این یکی از قشنگترین آموزشهای این انجمن بوده. کار alireza9900 واقعا درسته و انشای خیلی روان و زبان ساده ای که بکار برده تحسین برانگیزه. کاش ادامه پیدامیکرد...
بله واقعا !
در سمپل های خود کیل چند مثال هست که از rtx استفاده کرده برای انجام چند کار معمولی مثلا چشمک زن و .. :sa:! ولی باز در سمپل هاس stm در پوشه MCBSTM32 تنوعش بیشتره. و در کل علاقه عجیبی به سمپل چشمک زن داشتند انکار کار مهمی غیر این نیست:mrgreen:. مثالی که یه کار درست حسابی انجام بده نگذاشته. مثلا یه برنامه دارید که به صورت معمول داره کارای زیر را باهم انجام میده:
-کار معمولش اینه مثلا یه تایمر را فعال کرده داره روی یه پایه به صورت سخت افزاری خودش پالس میده یا از ADC هر چی خوند رو LCD نشون میده. یا رو یه پای هایی داره PWM میده یا هر کار دیگه ای ...
-اگه یه وقفه خارجی اومد میره یه چیزی رو یه جایی مثلا lcd یا uart نشون میده که وقفه اومده.
- اگه یه چیزی روی پورت سریال اومد با توجه به اینکه وقفه uart فعاله میره در زیروال وقفه و کاراکتر دریافت می کنه و اگر اینتر زده شد رشته کامل شده قابل استفاده هست و مثلا این رشته را روی sd ذخیره میکنه یا هر کار دیگه در آنجا انجام میده
- هر چند ثانیه یک بار یه کار دیگه بکنه مثلا هر سه ثانیه یک بار روی پورت سریال یه چیزی بفر سته
خوب همان طور که گفته شد این کارا به صورت معمول در یک برنامه قابل انجام است و در برنامه اصلی کارای اصلی داره انجام میشه و به کمک وقفه ها، باقی وظایف قابل انجامه. حالا سوال اینه که یه همچین برنامه هایی که ما قبلا به کمک وقفه ها انجام می دادیم در این RTX به چه صورت انجام میشه؟
در مثالها به غیر از دستورات گفته شده از چند دستور دیگه هم استفاده شده است :

OS_MUT mut_GLCD; /* Mutex to controll GLCD access */
os_mut_init(mut_GLCD);
os_mut_wait(mut_GLCD, 0xffff);

mzarkoob
19-11-2013, 19:11
در این برنامه (You can see links before reply) که پیوست کردم
وقفه رابط سریال را فعال کردم وقتی کاراکتری دریافت کرد
تسک READKEY که اولویتش هم از همه بالاتر است کارش را ادامه بده و کاراکتر دریافتی را ارسال کند.
مشکل:
1.وقتی برنامه اجرا می شود (میکرو ریست می شود) تا زمانی که کاراکتری از رابط سریال دریافت نکرده مشکلی وجود ندارد و LEDها چشمک می زند ولی زمانی که کاراکتری ارسال می شود سیستم هنگ می کند.و کاراکتر هم ارسال نمی کند.
سوال:
1.اصلا در سیستم عامل RTX روش پیاده سازی وقفه چیست درست این کار را کرده ام.


چون کسی جواب نداد خودم اشتباهم رو متوجه شدم می گم که مابقی حواسشونو جمع کنند اشتباه من را تکرار نکنند.
استفاده از دستور
os_evt_set
به جای دستور
isr_evt_set
در وقفه ها:018::018::018:
در این برنامه که ضمیمه شده

void USART1_IRQHandler (void) {
volatile unsigned int IIR;
char data;
IIR = USART1->SR;
if (IIR & USART_SR_RXNE) { /* read interrupt */
USART1->SR &= ~USART_SR_RXNE; /* clear interrupt */

data=(USART1->DR & 0x1FF);
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
};
os_evt_set (0x0001, t_readkey); /* send event to task 'task' */
}
که از همون دستور os_evt_set در وقفه استفاده شده! برعکس نگفتید!؟

رویدادها
یه نکته مهم اینکه تو توابع وقفه irq (نه fiq) از تابع isr_evt_set برای فعال کردن پرچم ها استفاده میشه (نه تابع os_evt_set)

arvin2009
02-02-2014, 21:59
سلام به همه دوستان
اقا من اومدم با ین سیستم عامل کار کنم همون ول کار وایستادم.من برای lpc1768 میخوام ولی توی پوشه ptx فایلی کانفیگ برای 17xx نیست. اینو میگم RTX_Conf_LPC23xx.c حالا باید چکار کنم.دوستان کسی رو 1768 کار کرده ؟


جواب با همین هدر LPC23XX راه اندازی شد.فقط LPC17XX.H به هدر اظافه شود

مهدی غلامی
01-08-2014, 19:16
کاشکی با cmsis rtos هم مقاله بدی....

yraeisi
07-08-2014, 19:37
فیلم آموزش emWin با LPC1788

شامل مثال های مختلف جهت راه اندازی emWin به طور مستقل و به همراه سیستم عامل RTX و راه اندازی تاچ


تاپیک ویژه راهنمای خریداران فیلم :
You can see links before reply (You can see links before reply)

mobile.j.jafa
10-03-2016, 21:52
سلام دوستان من یک مشکل دارم این برنامه کار نمی کنه
اگه کسی از دوستان کمک کنه ممنون می شم



#include <LPC23xx.H>
#include <rtl.h>

OS_TID tsk_ID1, tsk_ID2;
__task void task_init(void);
__task void task1(void);
__task void task2(void);
void blink1(void);
void blink2(void);

int main()
{

os_sys_init(task_init);

while(1){}
return 0;
}

__task void task_init(void)
{
IODIR0 =0x3;
IOSET0 = 0x3;
tsk_ID1 = os_tsk_create(task1, 1); //priority:1
tsk_ID2 = os_tsk_create(task2, 1); //priority:1

os_tsk_delete_self(); //necessary
}

__task void task1(void)
{
int i = 0;
while(1){
for (i = 0; i < 0x7ffff; i++);//process

blink1();
}
}

__task void task2(void)
{
int i = 0;
while(1){
for (i = 0; i < 0x8ffff; i++);//process

blink2();
}
}

void blink1(void)
{
IODIR0 =0x3;
IOSET0 = 0x3;
}

void blink2(void)
{
IODIR0 =0x3;
IOSET0 = 0x3;
}

SMSM
01-06-2017, 06:22
با سلام و عرض خسته نباشید.
اقا ایا می شود در سیستم rtx در یک تسک بیاییم و از مقدار موجود در متغیری که در یک تسک دیگر است، استفاده کنیم؟ اگر اره، روش ان به چه صورت می باشد؟ در صورت امکان راهنمایی ام بفرمایید. با تشکر

mzarkoob
01-06-2017, 11:36
سلام
الان دقیقا یادم نیست ولی فکر کنم با Mailbox میشه این کارو کرد.

SMSM
01-06-2017, 16:32
ممنون اقا مهدی. توضیحات بیشتر این مورد را از کجا می توانم پیدا کنم؟

mzarkoob
01-06-2017, 16:59
یک پی دی اف هست در کیل برای شرح rl همین طور
\C:\Keil\ARM\Hlp فایل rlarm
و به طور جداگانه در نت هم
Mailbox را سرچ کنید

SMSM
02-06-2017, 03:32
ممنون

mzarkoob
04-06-2017, 20:28
در سمپل can برای rl کیل از rtx استفاده کرده که Mailbox هم استفاده کرد. البته کمی پیچیده هست.

miladelec
11-06-2017, 21:19
سلام دوستان.
من برای کنترلر LPC1788 یه برنامه ساده نوشتم که یه ماژول gps از طریق وقفه UART هر ثانیه یک بار اطلاعات میفرسته و کنترلر در روتین وقفه evt تسک اول رو فعال میکنه. و داخل تسک اول هم تابع خواندن و دیکد کردن دیتای NMEA اجرا می شه. ولی هر کاری می کنم جواب نمیده و تسک ها اجرا نمی شن. اگر وقفه رو غیر فعال کنم تسکها اجرا می شن ولی وقتی وقفه اومد دگ هیچ تسکی اجرا نمی شه. البته بدون RTX وقفه و تابع دریافت رو چک کردم کامل کار میکنه. الان می خوام تسک هارو اضافه کنم جواب نمیده. اینم کدش :


OS_TID task_ID1,task_ID2,task_ID3;
/////////////////////////////////////////////
void gds3(char serport){
char str[1000];
int i=0,m=0,n=1;

while(n==1){
str[i]=UARTGetChar(serport);
if(strstr(str,"ANTS"))
m=1;
if(str[i]==13 & m==1)
n=0;
if(str[i]!=13 & str[i]!=10)
i++;
}
GUI_Text(8,300,str,Green,Black);

}
//////////////////////////////////////////////////
__task void task1(void){

os_evt_wait_or(0x0001,0xffff);

while(1){
gds3(UART_0);

}
////////////////////////////////////////////////////
__task void task2(void){
while(1){

}
}
/////////////////////////////////////////////////////
__task void task3(void){
while(1){

}
}
/////////////////////////////////////////////////////
__task void task_init(void){

task_ID1=os_tsk_create(task1,1);
task_ID2=os_tsk_create(task2,1);
task_ID3=os_tsk_create(task3,1);

os_tsk_delete_self();
}
////////////////////////////////////////////////////
void UART0_Init2(){
UART_CFG_Type UART0_CFG;
UART_FIFO_CFG_Type UART0_FIFO_CGF;
UART0_CFG.Parity=UART_PARITY_NONE;
UART0_CFG.Baud_rate=115200;
UART0_CFG.Databits=UART_DATABIT_8;
UART0_CFG.Stopbits=UART_STOPBIT_1;

UART_FIFOConfigStructInit(&UART0_FIFO_CGF);
UART_FIFOConfig(UART_0,&UART0_FIFO_CGF);

PINSEL_ConfigPin(0,2,1);
PINSEL_ConfigPin(0,3,1);

UART_Init(UART_0, &UART0_CFG);
UART_TxCmd(UART_0,ENABLE);
UART_IntConfig(UART_0,UART_INTCFG_RBR,ENABLE);

NVIC_EnableIRQ(UART0_IRQn);
NVIC_SetPriority(UART0_IRQn,10);
}
///////////////////////////////////////////////////////
void UART0_IRQHandler(void){

isr_evt_set(0x0001,task_ID1);
}
/////////////////////////////////////////////////////
int main(void){

SDRAM_32M_16BIT_Init();
GLCD_Init();
GLCD_Clear(Black);
UART0_Init2();
Delay(5000);
os_sys_init(task_init);
while(1){

}
return 0;
}

SMSM
11-06-2017, 21:20
سلام. اقا من وقتی از usart استفاده می کنم، وقتی یک task دارم هیچ مشکلی نیست و داده مورد نظرم را پشت سر هم برایم ارسال می کند به کامپیوتر ام. ولی وقتی یک task دیگر هم اضافه می کنم، usart می اید چند بار این کار را انجام می دهد و دیگر این کار را انجام نمی دهد:baad::unh:. استاتید محترم برای رفع این مشکل چی کار کنم؟:( یک راهنمایی کوچک هم بفرمایید ممنونتان می شوم.
با تشکر:hi:

mzarkoob
11-06-2017, 22:37
سلام
خیلی فرصت نکردم برنامتون را ببینم چی به چی هست ولی در استفاده از rtx به نحوه پیاده سازی مفاهیمی که وجود دارد باید خیلی دقت کرد. زیرا مثالهای موجود بیشتر در حد blikly هست و با همین مفهوم نحوه استفاده از توابع انجام شده که بایستی برای کاربرد مورد نظر توسعه داده شود.
من فکر می کنم جداگانه در سمپل هایی مرحله به مرحله این موارد را تست کنید تا به نحوه پیاده سازی آن تسلط پیدا کنید. دانستن نحوه عملکرد توابع rtx به درک مفهوم آن فرق دارد. در فیلم پیشرفته 1788 (You can see links before reply)در قسمت rtx هم سعی شده چنین کاری انجام شود.
این تابع

UARTGetChar
چطور دیتا را ازسریال میگیرد!؟ اگر با وقفه هست پس فقط در زیرروال وقفه رودیداد را فعال کرده اید؟ پس کجا دیتا میگیره؟
من دیدم از تابع

GUI_Text(8,300,str,Green,Black);


استفاده شده . چه تضمینی هست در زمان اجرای این تابع زمان تسک تمام نشده باشد؟ برای همین است که از mutex استفاده می شود....

SMSM
12-06-2017, 02:18
سلام .ممنون. لطفا در صورت امکان لینک فیلم را هم قرار دهید با تشکر.

mzarkoob
12-06-2017, 11:18
در امضام لینک مجموعه فیلم های آموزشی فروشگاه هست!

SMSM
12-06-2017, 20:17
ممنون.

SMSM
18-06-2017, 03:44
سلام. اقا اگر در یک تسک، بین os_mut_wait(mutex,0xffff); و os_mut_release(mutex); یک تاخیر مثلا os_dly_wait(40); اتفاق بافتد، در این زمان تاخیر، سویچ بین تسک ها انجام می شود(در واقع از این تسک می رویم در یک تسک دیگر)؟
یا نه در همان خط منتظر می ماند که تاخیر تمام شود؟ و به تسک دیگری نمی رود. تا به os_mut_release(mutex); برسد و بعد سویچ بین تسک ها انجام می شود؟ من یک مقدار سر این قضیه گیج شدم. :(:unh: اساتید محترم در صورت امکان یک راهنمایی کوچک بفرماید. با تشکر:hi:

mzarkoob
18-06-2017, 04:30
خوب چرا در عمل تست نمی کنید که چه اتفاقی می افتد!؟
مگر چه کاری می خواهید بکنید که لازم شده این گونه عمل کنید؟

SMSM
18-06-2017, 15:09
در عمل همه چی خوب کار می کند ولی برای مدتی!!!!!!!!!!!!!!!!!!!!!!!!!! یعنی در واقع بعد از مدتی یهو سیستم عامل هنگ می کند:baad:. و دیگر متغیر ها تغییر نمی کنند. :unh:
به نظرتان مشکل می تواند از کجا باشد؟ از دوستان کسی به این مشکل بر خورده است ؟ اقا یک کلمه هم کمک بفرمایید ممنونتان می شوم.:hi:
کاری که دارم انجام می دهم مربوط به ناوبری کوادروتور است. (پایان نامه ام). و نمی دانم چرا این سیستم عامل یهو ما را ضایع می کند.:( جان من کمک کنید.

mrm
19-06-2017, 11:49
کلا وقتی سیستم منتظر گرفتن یک ماتکس هست اون تسک به حالت wait میره تا زمانی که ماتکس رو بگیره . وقتی تسک ماتکس رو گرفت اون تسک به حالت "اجرا" در میاد.
حالا که تسک به حالت اجرا در اومده سوییچ تسک اتفاق میافته ولی بقیه تسک ها یی که منتظر دریافت ماتکس هستند در حالت wait میمونند.
اگر شما از Delay سیستم عامل استفاده کنید باز این تسک در حالت wait قرار میگیره و بقیه تسک هایی که در حالت Wait برای ماتکس نیستند اجرا میشوند.
شما باید ببینید وقتی سیستم هنگ میکنه منظور چی هست!!!
اگر hard fault باشه دسترسی به حافظه غیر مجاز رخ داده ( مثلا اشاره گری که وجود نداره ) یا شاید هم Stack overflow رخ داده که باز هم اون رو میشه فهمید
و اخرین احتمال هم عدو تنظیم درست اینتراپت ها میتونه باشه.

SMSM
20-06-2017, 16:24
با تشکر از پاسخ شما اقای (خانم) mrm.
مشکل در این بود که من os_itv_set() استفاده کرده بودم برای خواندن خروجی کالمن فیلتر ام برای زاویه های رول و پیچ و یاو. امدم انها را حذف کردم و با معادل ان os_dly_wait این کار را انجام دادم. و مشکل من حل شد. دیگر هنگ نمی کند:o. در واقع منظور از هنگ این بود که در یک تسک مثلا تسک مربوط به زاویه رول کالمن فیلتر، ناگهان بعد از مثلا یک دقیقه دیگر زوایه رول تغییر نمی کرد و سیستم در اخرین زاویه ای که خوانده بود گیر می کرد. که با ان تغییری که دادم مشکل حل شده است.
از ماتکس برای usart استفاده می کنم. (اقای مهدی زرکوب پیشنهاد دادند. دستشان درد نکند:wink:.)
اقا (خانم) mrm بابت اطلاعاتی که قرار دادید مممنونتان هستم. واقعا این ها را نمی دانستم. باز هم ممنون.:hi:

یک سوال میزان stack یک تسک را از کجا می شود خیلی راحت محاسبه کرد؟ خود کیل گزینه ای ندارد که قطعه کدی را که نوشته ایم میزان stack ان را نشان دهد؟

mzarkoob
20-06-2017, 16:33
خوب به سلامتی
برای همینه که گفتم :
مگر چه کاری می خواهید بکنید که لازم شده این گونه عمل کنید. یعنی چه عملیات مخاسباتی در تسک می خواهید انجام دهید نه برای انجام مربوط به ناوبری کوادروتور

mrm
21-06-2017, 16:09
ببینید کیل در فایل های خروجی که بهتون میده یه فایل به نام پروژه با پسوند html بهتون میده که تمام توابع رو به صورت جدا مقادیر استک رو داخلشون نوشته.
یان فکر کنم راحت ترین راه باشه.

SMSM
21-06-2017, 21:44
واقعا ممنونتان هستم. خیلی عالی بود. دستتان درد نکند. ممنون. :wink::wink::wink::wink::wink::wink::wink::wink::w ink::wink::wink::wink::wink::wink::wink::wink::win k::wink::wink::wink::wink::wink::wink::wink::wink: :wink::wink::wink::wink::wink::wink::wink::wink::w ink::wink::wink::wink::wink::wink::wink::wink::win k::wink::wink::wink::wink::wink::wink::wink::wink: :wink::wink::wink::wink::wink::wink::wink::wink::w ink::wink::wink::wink::wink::wink::wink::wink::win k::wink::wink::wink::wink::wink::wink:
روشتان خیلی باحال بود. انشا الله بتوان جبران کنم. :hi:فقط برای من فایلش پسوندش htm بود.:0013:

- - - Updated - - -

با تشکر از اقا (خانم) mrm

mzarkoob
22-06-2017, 21:34
جبران آن وقت است پیشرفت که کردید و دیدید در فروم سوالی پرسیده شد که می توانید پاسخ دهید، نگویید من چرا باید جواب سوال دیگران را بدهم؟ بروند وقت بذارند پیدا کنند! ولی وقتی خودم سوال می کنم میگویم چرا کسی نمیاد جواب من را بدهد !؟
Telegram: Contact @armeducation (You can see links before reply)

hamedrg
15-12-2017, 12:10
سلام به دوستان عزیز. یه برنامه برای راه اندازی adc میکرو در cmsis rtos keil نوشتم که از وقفه استفاده میشه . ولی گویا برای استفاده از وقفه در سیستم عامل باید تنظیماتی انجام بشه کسی میتونه راهنمایی کنه.

mzarkoob
15-12-2017, 13:06
در trx توابعی جدا در زیرروال وقفه استفاده می شود که اول آن isr است مثلا : isr_evt_set

omid_2132
05-03-2018, 14:51
میشه یکی راهنمایی کنه که وقفه ها رو چطور با سیستم عامل مچ کنیم.
مثلا وقتی برنامه بر مبنای سیستم عامل rtx میره به وقفه rtc مشکل پیش میاد.اساس و الگوریتم استفاده از وقفه ها تو سیستم عامل چه جوریه؟(با فرض اینکه تو پروژه م اصلا از delay ها استفاده نکردم.)

mzarkoob
05-03-2018, 15:14
اگر سمپلی باشد که انجام شده باشد این موضوع روشن تر می شود.
بالاخره وقفه هم در میکرو وجود دارد و نمی شود که نباشد. ولی در وقفه فقط می توان یک رویداد را فعال کرد که تسک دیگری منتظر این رویداد باشد.
در سمپل can برای rl کیل تحت rtx از Mailbox استفاده کرده است.