من یه پروژه با bluepill انجام دارم میدم و توی کدنویسیم از freeRTOS کمک گرفتم بر برنامه رو بر اساس اون دارم مینویسم.
در حال حاضر توی برنامم 4 تا تسک دارم که و دارم حافظه stack کم میارم یکی از دلایلش هم اینه که مثلا یه تسک صرفا برای خوندن یه gpio و بررسی وضعیتش ایجاد کردم.
اون gpio هم به flow meter وصله و باید صرفا لبه های پالس رو بشماره که بتونم حجم آب جابجا شده رو اندازه گیری کنم
حالا میخوام ببینم چطوری میتونم این تسک رو حذف کنم و با کمک وقفه این gpio رو بخونم که نیازی به تسک جدا نداشته باشه
سلام،
خب اول از همه اینکه طبق چیزی که گفتید بهترین روش به نظر همون استفاده از وقفه باشه و FreeRTOS و ایجاد تسک کار بهینهای نباشه. اما با این حال این که شما به مشکل حافظه stack برخوردید احتمالاً به خاطر عدم مدیریت صحیح حافظه و تخصیص غیر بهینهی stack به تسکهاتون بوده. مثلاً برای کاربرد خواندن GPIO شما نیاز به حافظهی زیادی ندارید. اما؛
در مورد استفاده از وقفه دقیقاً متوجه نشدم مشکل شما کجاست. شما میتونید خودتون و یا با استفاده از stm32cubemx پایههای مورد نظر رو به صورت وقفه تعریف کنید و حالت تریگ رو هم بذارید لبه بالا رونده (و یا پایین رونده، بسته به نیازتون) وقفهی سراسری رو هم فعال میکنید و از اون به بعد روتین وقفه هر زمان پایه تریگ بشه فراخوانی میشه. برای جزئیات بیشتر میتونید از آموزش همین مورد در سیسوگ استفاده کنید.
با استفاده از توابع LL: https://sisoog.com/2020/11/25/آموزش-stm32-با-توابع-ll-قسمت-هفتم-interrupt/
من فکر میکنم که وقفه ها تداخل داشته باشه با freeRTOS
من از وقفه یوآرت استفاده کردم ولی دیدم که بعد از یه بار فعال شدن وقفه یوآرت دیگه freeRTOS کارنکرد و هنگ کرد
البته برای GPIO رو تست نکردم هنوز
مثلا برای توقف هم میتونیم از hal_delay استفاده کنیم و کار میده اما روش درستش استفاده از osDelay هست
سلام
برای اینکه مشکل هنگ کردن تون با uart حل بشه باید Flag Intterup (پرچم وقفه ) رو موقع دریافت وقفه بخونید و سپس غیر فعال کنید.(اگر در فانکشن Call Back وقفه دریافتی سریال چیزی قرار ندید و خالی باشه میکرو کنترلر به Hardfualt میره و هنگ میکنه )