سلام دوستان
یه تابع دارم که داخلش توی یه حلقه while منتظر دریافت ورودی میمونه. میخام با وقفه 0 و قبل از دریافت ورودی از این تابع بیام بیرون و یه تابع دیگر رو فراخوانی کنم.
مشکل اینجاست که بعد از تموم شدن تابع دوم، دوباره بر میگرده با آدرس بازگشت (همون حلقه منتظر دریافت ورودی).
یه سری سرچ کردم که میشه با دستور
به آدرس دسترسی داشت ولی اصلا نتونستم باهاش کار کنم
1- چه جوری میشه بعد از فراخوانی یه وقفه آدرس بازگشت و حذف کرد؟
2- یا اینکه آدرس بازگشت تو کدوم رجیستر ذخیره میشه؟دسترسی بهش هست؟
3- با غیرفعال کردن وقفه از داخل روتین وقفه میشه آدرس بازگشت رو حذف کرد؟
ATMega32 A
Atmel Studio
زبان سی کامپایلر AVR GCC
یه تابع دارم که داخلش توی یه حلقه while منتظر دریافت ورودی میمونه. میخام با وقفه 0 و قبل از دریافت ورودی از این تابع بیام بیرون و یه تابع دیگر رو فراخوانی کنم.
مشکل اینجاست که بعد از تموم شدن تابع دوم، دوباره بر میگرده با آدرس بازگشت (همون حلقه منتظر دریافت ورودی).
یه سری سرچ کردم که میشه با دستور
کد:
__builtin_return_address void *pc0 = __builtin_return_address(0); void *pc1 = __builtin_return_address(1); void *pc2 = __builtin_return_address(2); void *pc3 = __builtin_return_address(3);
1- چه جوری میشه بعد از فراخوانی یه وقفه آدرس بازگشت و حذف کرد؟
2- یا اینکه آدرس بازگشت تو کدوم رجیستر ذخیره میشه؟دسترسی بهش هست؟
3- با غیرفعال کردن وقفه از داخل روتین وقفه میشه آدرس بازگشت رو حذف کرد؟
ATMega32 A
Atmel Studio
زبان سی کامپایلر AVR GCC
کد:
void func1(); int Get_Input(); int func2(); void Process(int p); ISR(INT0_vect) { // need to remove returned address here by reti() or changing register values func1(); } void func1() { int p; while(1) { if(condition1) { p = Get_input(); } if(condition2) { p =func2(); } Process(p); } } int Get_input() { int input = -1; while(input != -1) { input = Get_Input(); } return input; } void Process(int p){} void func2() { condition1 = true; // here need Empty return Stack func1(); . . . func2(); } int main(void) { while(1)func1(); }
دیدگاه