متقلب – ما الذي سأراه في مصحح الأخطاء؟


مرحبًا !

لقد كنت أتعلم كيفية عمل المواد المتقلبة لأنني أستخدم وحدات التحكم الدقيقة وأحتاج جزئيًا إلى معرفة كيفية عملها. لقد تعلمت كيف تعمل مواقع الويب عندما يتعلق الأمر برمز المجمع الزائف. سأضيف هذه المعلومات لإظهار ما أعرفه وما أردت أن أتناوله.

لذا فإن المتغير يوقف المترجم عن تحسين المتغير الذي يعتقد أنه لن يتم تحديثه في ملخص كبير أو أن يتم تحسين العمليات الأخرى بواسطة المترجم.

شيء من هذا القبيل :

غير متطاير :

move the value of variable m into internal register A
label:
if A != 1 goto done
goto label
done:
carry on

لذلك المتغير m تتم قراءته مرة واحدة ولن يقرأ القيمة أبدًا m مرة أخرى على الرغم من m يمكن أن تغير قيمتها. ويعتقد أنه لن يتغير أبدا

متقلب :

label:<br />
move the value of variable 'm' to internal register A<br />
if A != 1 then go to done<br />
go to label<br />
done:

هنا مع المتقلبة سوف تقرأ في كل مرة ما هو المتغير m لديه داخل.

كيف يبدو الأمر مع ISR (مسار المقاطعة)؟
هذا مثال قرأته من مواقع الويب أيضًا والذي أخبرني كثيرًا عن كيفية عمله.

يقتبس:

* في الحلقة الرئيسية – قبل تنفيذ ISR مباشرة – لها القيمة “X” في السجل 1
* يبدأ ISR، ويحفظ ISR قيمة السجل 1 (X) في SRAM (المكدس؟)
* يستخدم ISR السجل 1 بقيمه الخاصة، ويحمل بـ abc، ويتغير لتعريف … أي شيء، وينفذ العمليات
* قبل العودة إلى main() فإنه يستعيد القيمة “X” في السجل1.

يتم حفظ قيمة المتغيرات في الذاكرة/ذاكرة الوصول العشوائي وما إلى ذلك حيث يتم تخزين العمليات في السجلات. لقد أوضح لي هذا بوضوح أن ISR يقوم فقط بتحديث قيمة المتغير في الذاكرة وليس في السجل لأن السجلات تعود إلى حالتها السابقة قبل التعديل.

رائع

الآن ما أردت معرفته هو الآن كيف يعمل التقلب وما إلى ذلك لأنني أعرف جزئيًا كيف يعمل. أريد أن أعرف كيف سأراه في مصحح الأخطاء.

دعونا نستخدم هذا المثال:

int A = 0;

int main()
{
	while(A != 1)
	{
	//Do something
	}
}

void ISR()

{
	A++;
}

هنا رمز بسيط بدون متطاير. أردت أن أعرف كيف سيتصرف المصحح.

int A = 0;

int main()
{
	while(A != 1)
	{
	//Do something
	}
}

void ISR()

{
	A++; <----- breakpoint
}

لقد قمت بتعيين نقطة توقف هنا.
يتم تحديث المتغير A من 0 إلى 1. لكن حلقة while لن تقرأ المتغير A، بل هي محسنة وستقرأ القيمة 0 من سجلها كما قلت في البداية.

حسنًا، تم تحديث المتغير A من 0 إلى 1 وسيُظهر مصحح الأخطاء قيمة A لتكون 1 وليس 0.

int A = 0;

int main()
{
	while(A != 1) <----- breakpoint
	{
	//Do something
	}
}

void ISR()

{
	A++;
}

لذا، بعد ISR، ينتقل مصحح الأخطاء الآن إلى النقطة الرئيسية ويتوقف مؤقتًا لأن هذه هي نقطة التوقف التالية.

ما قيمة A ستكون؟ هل سيظل “1” كما قلت في البداية كيف يعمل كل شيء؟ يجب أن يظل A 1 ويجب أن يسمح لي الوقت بالمرور لأنه على الرغم من أن A = 1 وفي حين تقول الحلقة A != 1 فإنه لا يزال يجب أن يمر لأنه يقرأ البيانات من السجل وليس من المتغير A لأنه ليس متطايرًا.

لماذا أحتاج إلى هذه المعرفة؟ بالنسبة للمستقبل، إذا نسيت وحدث شيء غريب، فهذا سيساعدني في معرفة ما إذا كنت قد نسيت شيئًا مثل ذلك. لماذا بدأت حلقة while بالرغم من عدم تطابق الشرط.

أعتقد أنك تفهم ما أحاول قوله هنا.

ما حاولت:

لم أكن أعرف كيف سيبدو الأمر لأن وحدة التحكم الدقيقة الخاصة بي لم تقم بتحسين المتغيرات غير المتطايرة كما لو كانت متطايرة، لذلك أسعى إلى المعرفة دون رؤيتها بشكل طبيعي؛D

الحل 1

أود أن أتصور أن التحسين يعتمد على المترجم. أنا على دراية بمترجم gcc والكود الوارد هنا؛

سي ++
int A = 0;

int main()
{
	while(A != 1) <----- breakpoint1
	{
	//Do something
	}
}

void ISR()

{
	A++; <----- breakpoint2
}

ستكون القيمة عند نقطة التوقف 2 0->1 وستحصل على القيمة عند نقطة التوقف 1 “تم تحسين القيمة” لأن القيمة كانت موجودة في السجل وتختفي القيمة بمجرد مغادرة الكمبيوتر لـ ISR.

سي ++
volatile int A = 0;

int main()
{
	while(A != 1) <----- breakpoint1
	{
	//Do something
	}
}

void ISR()

{
	A++; <----- breakpoint2
}

عند استخدام الكلمة الأساسية المتغيرة، ستكون القيمة عند نقطة التوقف 2 n->n+1 وستكون القيمة عند نقطة التوقف 1 n وستظهر القيمة في مصحح الأخطاء.

コメント

タイトルとURLをコピーしました