TI MSP430 مصدر المقاطعة
-
26-09-2019 - |
سؤال
أعلم أنه عند العمل مع MSP430F2619 و CCSV4 من TI ، يمكنني الحصول على أكثر من مقاطعة واحدة لاستخدام نفس معالج المقاطعة مع رمز يبدو مثل هذا:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
سؤالي هو ، عندما أجد نفسي في تلك المقاطعة ، هل هناك طريقة لمعرفة أي من هذه المقاطعات التي حصلت عليها هنا؟
المحلول
الإجابة العامة على سؤالك هي لا توجد طريقة مباشرة للكشف عن المقاطعة التي يتم استدعاؤها حاليًا. ومع ذلك ، فإن كل مقاطعة لها علامة مقاطعة خاصة بها حتى تتمكن من التحقق من كل علامة في المقاطعة. يجب عليك والعلم مع تمكين التأكد من أنك تتعامل مع المقاطعة التي تم استدعاؤها بالفعل. أيضًا مع أجهزة ضبط الوقت الموجودة على MSP430 ، يوجد ناقل Taiv يمكن أن يخبرك بما يجب التعامل معه في معالج A1. القضية 0 من Taiv هي أنه لم يكن هناك أي مقاطعة لمعالج A1 ، لذلك في هذه الحالة ، يمكنك افتراض أنه معالج A0.
سأفعل شيئًا مثل ما يلي.
#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
switch (TAIV) // Efficient switch-implementation
{
case TAIV_NONE: // TACCR0 TIMERA0_VECTOR
break;
case TAIV_TACCR1: // TACCR1 TIMERA1_VECTOR
break;
case TAIV_TACCR2: // TACCR2 TIMERA1_VECTOR
break;
case TBIV_TBIFG: // Timer_A3 overflow TIMERA1_VECTOR
break;
default;
break;
}
ServiceWatchdogTimer();
}
نصائح أخرى
ليست حقًا إجابة "جيدة" ولكن لماذا لا تجعل من معالجات المقاطعة منفصلة تسمي نفس الوظيفة؟
شيء مثل
__interrupt void Timer_A0_handler (void){
Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
Timer_Handler(1);
}
void Timer_Handler(int which){
if(which==1){
...
}else{
...
}
...
ServiceWatchdogTimer();
}
أنظر إلى دليل مستخدم عائلة MSP430x1xx, ، يبدو أن الجهاز لا يحافظ على سجل حالة المقاطعة مع هذه المعلومات مباشرة. ستحتاج إما إلى وجود 2 متجهات منفصلة من المقاطعات حتى تتمكن من تحديد الفرق مباشرة ، أو ستحتاج إلى الاستعلام عن كلا الجهازين لمعرفة أي خدمة.
إذا كنت تستخدم متجهين مقاطعتين ، فيمكنهم بالتأكيد الاتصال أو القفز (إذا كنت تستخدم التجميع) إلى نفس الروتين لأداء الجزء الأكبر من العمل كما في الجواب الذي قدمه إيرلز.
لاحظ أن الشريحة تحتوي على جدول متجه مقاطعة بالفعل ، لذلك للقيام بما تتحدث عنه في التعليق الذي أدليت به في إجابة أخرى ، عليك فقط توجيه إدخالات متجه المقاطعة للمقاطعات "غير المستخدمة" إلى الروتين الذي يلقي خطا.