প্রাথমিক প্রশ্ন
মাইক্রোকন্ট্রোলারগুলিতে বাধা হ্যান্ডলিং সম্পর্কে আমার একটি সাধারণ প্রশ্ন আছে। আমি এমএসপি ৪৩০ ব্যবহার করছি, তবে আমি মনে করি প্রশ্নটি অন্যান্য ইউসিগুলিতে প্রসারিত হতে পারে। আমি কোডের সাথে সাথে ঘন ঘন বিঘ্ন সক্ষম / অক্ষম করার জন্য একটি ভাল অনুশীলন কিনা তা জানতে চাই। আমি বোঝাতে চাইছি, আমার কাছে কোডের এমন একটি অংশ রয়েছে যা বাধাগুলির প্রতি সংবেদনশীল হবে না (বা আরও খারাপ, কোনও কারণে বাধা, শুনতে হবে না), এটি আরও ভাল:
- বিঘ্ন আগে বাধা নিষ্ক্রিয় করুন এবং তারপরে গুরুত্বপূর্ণ বিভাগের পরে তাদের পুনরায় সক্ষম করুন।
- সংশ্লিষ্ট আইএসআর-এর অভ্যন্তরে একটি পতাকা লাগান এবং (বাধা নিষ্ক্রিয় করার পরিবর্তে) পতাকাটিকে সমালোচনামূলক বিভাগের আগে মিথ্যাতে সেট করুন এবং একে একে সত্যে পুনরায় সেট করুন after আইএসআর কোড কার্যকর করা থেকে রোধ করতে।
- দুজনের কেউই নয়, তাই পরামর্শগুলি স্বাগত!
আপডেট: বাধা এবং রাষ্ট্রের চার্ট
আমি একটি নির্দিষ্ট পরিস্থিতি সরবরাহ করব। আসুন ধরে নেওয়া যাক আমরা একটি রাষ্ট্রীয় চার্ট প্রয়োগ করতে চাই, যা 4 টি ব্লক দ্বারা রচিত:
- স্থানান্তর / প্রভাব।
- প্রস্থান শর্ত
- প্রবেশের ক্রিয়াকলাপ।
- ক্রিয়াকলাপ করুন।
এক অধ্যাপক আমাদের এটাই বিশ্ববিদ্যালয়ে পড়িয়েছিলেন। সম্ভবত, এটি করার সর্বোত্তম উপায় নয় এই স্কিমটি অনুসরণ করে:
while(true) {
/* Transitions/Effects */
//----------------------------------------------------------------------
next_state = current_state;
switch (current_state)
{
case STATE_A:
if(EVENT1) {next_state = STATE_C}
if(d == THRESHOLD) {next_state = STATE_D; a++}
break;
case STATE_B:
// transitions and effects
break;
(...)
}
/* Exit activity -> only performed if I leave the state for a new one */
//----------------------------------------------------------------------
if (next_state != current_state)
{
switch(current_state)
{
case STATE_A:
// Exit activity of STATE_A
break;
case STATE_B:
// Exit activity of STATE_B
break;
(...)
}
}
/* Entry activity -> only performed the 1st time I enter a state */
//----------------------------------------------------------------------
if (next_state != current_state)
{
switch(next_state)
{
case STATE_A:
// Entry activity of STATE_A
break;
case STATE_B:
// Entry activity of STATE_B
break;
(...)
}
}
current_state = next_state;
/* Do activity */
//----------------------------------------------------------------------
switch (current_state)
{
case STATE_A:
// Do activity of STATE_A
break;
case STATE_B:
// Do activity of STATE_B
break;
(...)
}
}
আসুন আমরাও ধরে নিই যে, বলুন STATE_A
, আমি বাটনের সেট (ডিবাউস সিস্টেম ইত্যাদি) এর মধ্য থেকে আসা কোনও বাধার প্রতি সংবেদনশীল হতে চাই। যখন কেউ এই বোতামগুলির একটি টিপুন, একটি বাধা তৈরি করা হয় এবং ইনপুট পোর্ট সম্পর্কিত পতাকাটি একটি পরিবর্তনশীলতে অনুলিপি করা হয় buttonPressed
। যদি কোনওভাবে ডেবিউন 200 এমএসে সেট করা থাকে (ওয়াচডগ টাইমার, টাইমার, কাউন্টার, ...) আমরা নিশ্চিত যে 200 এমএসের buttonPressed
আগে কোনও নতুন মান দিয়ে আপডেট করা যাবে না। এটিই আমি আপনাকে জিজ্ঞাসা করছি (এবং নিজেকে :) অবশ্যই)
আমার কি ডিও ক্রিয়াকলাপে বাধা STATE_A
দেওয়ার এবং ছাড়ার আগে অক্ষম করার দরকার আছে?
/* Do activity */
//-------------------------------------
switch (current_state)
{
case STATE_A:
// Do activity of STATE_A
Enable_ButtonsInterrupt(); // and clear flags before it
// Do fancy stuff and ...
// ... wait until a button is pressed (e.g. LPM3 of the MSP430)
// Here I have my buttonPressed flag ready!
Disable_ButtonsInterrupt();
break;
case STATE_B:
// Do activity of STATE_B
break;
(...)
}
একটি উপায় যে আমি নিশ্চিত যে পরবর্তী পুনরাবৃত্তিতে এ পরবর্তী সময় আমি execxute ব্লক 1 (রূপান্তরটি / প্রভাব) আমি নিশ্চিত যে অবস্থার পরিবর্তনের বরাবর পরীক্ষা করা am পরবর্তী বিঘ্ন পূর্ববর্তী মূল্য আছে ওভাররাইট থেকে আসছে নেই am সালে buttonPressed
যে আমি প্রয়োজন (যদিও এটি অসম্ভব যে কারণ এটি ঘটতে পারে কারণ 250 এমএস অবশ্যই বয়ে যেতে পারে)।