এই পর্বে যা শিখবেন
- Watt, joule, mAh আর Wh-এর পার্থক্য, আর ব্যাটারির আয়ু হিসাব করা
- Dynamic ও static power-এর সূত্র দিয়ে DVFS-এর লাভ হিসাব, race-to-idle বনাম ধীরে চলার energy তুলনা, আর EDP ও perf/W দিয়ে নকশা বাছাই
- Clock gating, power gating, C-state, TDP, dark silicon আর big.LITTLE কেন আছে
- Microcontroller, microprocessor আর SoC-এর পার্থক্য, memory map, আর GPIO-timer-PWM-ADC-serial bus register দিয়ে কীভাবে চলে
- Real-time-এর deadline ও WCET, আর duty cycling দিয়ে একটি sensor node-কে মাসের পর মাস ব্যাটারিতে চালানো
১ · Power আর energy — watt, joule আর ব্যাটারির mAh
এ পর্যন্ত এই কোর্সে আমরা প্রায় সবসময় একটি প্রশ্ন করেছি: কত দ্রুত? পর্ব ০৩-এ (পারফরম্যান্স মাপা) CPU time, CPI আর Amdahl. কিন্তু আজকের বেশিরভাগ কম্পিউটার — ফোন, ঘড়ি, রাউটার, মোটরসাইকেলের ECU, মাঠে বসানো sensor — আরেকটি প্রশ্নে বাঁধা: কত বিদ্যুৎ খরচ হবে, আর তাপ কোথায় যাবে? Data center-এও বিদ্যুৎ বিল আর ঠান্ডা রাখার খরচ বড় হিসাব। পর্ব ০২-এ (ইতিহাস আর প্রবণতা) দেখেছেন, ২০০৫ সালের আশেপাশে power wall-এর কারণেই clock বাড়া থেমেছিল। এই পর্বে সেই ইতিহাস আর না বলে আমরা হিসাবের হাতিয়ার হাতে নেব।
প্রথমে দুটি শব্দ আলাদা করা জরুরি, কারণ এখানেই সবচেয়ে বেশি গোলমাল হয়।
- Power (ক্ষমতা): প্রতি সেকেন্ডে কতটা শক্তি খরচ হচ্ছে। একক watt (W). Chip কতটা গরম হবে, power supply আর পাখা কত বড় লাগবে — power ঠিক করে।
- Energy (শক্তি): মোট কতটা শক্তি খরচ হলো। একক joule (J); ১ J = ১ W × ১ সেকেন্ড। ব্যাটারি কতক্ষণ চলবে, বিদ্যুৎ বিল কত আসবে — energy ঠিক করে।
রিকশাভাড়া ভাবুন। একজন রিকশাওয়ালা প্রতি মিনিটে কত টাকা নেন — সেটি “power”. পুরো যাত্রায় মোট কত টাকা দিলেন — সেটি “energy”. দ্রুতগামী রিকশা মিনিটপ্রতি বেশি নিতে পারে, কিন্তু অর্ধেক সময়ে পৌঁছালে মোট ভাড়া কমও হতে পারে। Chip-এর জগতে ঠিক এই প্রশ্নটিই race-to-idle-এর মূল প্রশ্ন (অংশ ৪)।
ব্যাটারির গায়ে লেখা mAh আসলে কী
ব্যাটারির গায়ে সাধারণত লেখা থাকে mAh (milliampere-hour) — কত current কত ঘণ্টা দিতে পারবে। কিন্তু mAh একা energy নয়; voltage দিয়ে গুণ করলে তবে energy. তাই দুটি ভিন্ন voltage-এর ব্যাটারির mAh সরাসরি তুলনা করা যায় না। ব্যাটারির ধারণক্ষমতা:
- ফোন: ৫০০০ mAh, nominal ৩.৮৫ V (ধরা যাক) → ৫০০০ × ৩.৮৫ ÷ ১০০০ = ১৯.২৫ Wh = ১৯.২৫ × ৩৬০০ = ৬৯,৩০০ J. ফোন গড়ে ১.৫ W খরচ করলে আয়ু ≈ ১৯.২৫ ÷ ১.৫ ≈ ১২.৮ ঘণ্টা।
- Power bank: গায়ে “১০০০০ mAh” — কিন্তু এটি ভেতরের ৩.৭ V cell-এর হিসাব: ৩৭ Wh. USB-তে ৫ V দিতে গিয়ে রূপান্তরে কিছু শক্তি তাপ হয়; দক্ষতা ৮৫% ধরলে বাইরে আসে ৩১.৪৫ Wh, যা ৫ V-এ মাত্র ৩১.৪৫ ÷ ৫ ≈ ৬২৯০ mAh. তাই ১৯.২৫ Wh-এর ফোন প্রায় ৩১.৪৫ ÷ ১৯.২৫ ≈ ১.৬ বার ভরা যায় (ফোনের charging-এর ক্ষতি ধরলে আরও কম), দুবার নয়।
প্রচলিত ভুল: “এই chip-এর power ৫ W, ওটার ১০ W, তাই প্রথমটি ব্যাটারি বাঁচায়।” প্রথমটি যদি একই কাজ ৩ গুণ সময়ে করে, তার energy ১৫ J, দ্বিতীয়টির ১০ J. ব্যাটারি বাঁচাতে প্রশ্ন হলো প্রতিটি কাজের energy, power নয়। তবে তাপ আর পাখার প্রশ্নে power-ই আসল।
২ · Dynamic power আর static power — chip কোথায় বিদ্যুৎ খায়
পর্ব ০৮-এ (Logic gate আর transistor) দেখেছেন, CMOS gate-এর output উল্টালে তার পেছনের ছোট capacitance charge বা discharge হয়। সেই খরচটিই dynamic power:
এখানে C = chip-এর মোট switching capacitance, V = supply voltage, f = clock frequency, আর α = activity factor — প্রতি cycle-এ গড়ে কোন ভগ্নাংশ capacitance আসলে উল্টায়। Idle থাকা ALU-র α প্রায় শূন্য, ভারী গুণের loop-এ বেশি। Clock-এর তার নিজে প্রতি cycle-এ দুবার উল্টায়, তাই clock network-এর α সবচেয়ে বেশি — এ কারণেই chip-এর power-এর বড় একটি অংশ শুধু clock বিতরণে যায় বলে ধরা হয় (নকশাভেদে ভিন্ন)।
হাতে-কলমে: V আর f দুটিই ১৫% কমালে
α = ০.১৫, C = ২০ nF, V = ১.০ V, f = ২ GHz হলে P = 0.15 × 20×10−9 × 1.02 × 2×109 = ৬ W. এখন V = ০.৮৫ V, f = ১.৭ GHz:
- V² অনুপাত = ০.৮৫² = ০.৭২২৫
- f অনুপাত = ০.৮৫
- মোট = ০.৭২২৫ × ০.৮৫ = ০.৮৫³ = ০.৬১৪১ → P ≈ ৬ × ০.৬১৪১ ≈ ৩.৬৮ W — প্রায় ৩৯% কম, অথচ গতি কমেছে মাত্র ১৫% হারে।
আরও একটি সূক্ষ্ম কথা: একটি নির্দিষ্ট কাজের cycle সংখ্যা একই থাকলে energy প্রতি কাজে কমে শুধু V²-এর অনুপাতে (০.৭২২৫), কারণ f কমলে সময় বাড়ে আর দুটি কাটাকাটি হয়। অর্থাৎ শুধু f কমালে (V একই রেখে) power কমে, কিন্তু কাজপ্রতি dynamic energy একটুও কমে না — উল্টো leakage-এর সময় বাড়ে। এটিই অংশ ৪-এর মূল শিক্ষা।
Static power — বন্ধ থেকেও খরচ
বন্ধ transistor-ও পুরোপুরি বন্ধ নয় — সামান্য current চুইয়ে যায়: leakage. এর power মোটামুটি Pstatic ≈ V × Ileak, আর এটি clock চলুক বা না চলুক, circuit-এ voltage থাকলেই খরচ হয়। কেন ছোট transistor-এ এটি বেড়েছে? Voltage কমাতে গিয়ে threshold voltage-ও কমাতে হয়েছিল (পর্ব ০২), আর subthreshold leakage threshold কমার সাথে প্রায় সূচকীয়ভাবে বাড়ে; খুব পাতলা gate oxide-এর ভেতর দিয়েও current চুইয়ে যায়। ২০০০-এর দশকের মাঝামাঝি কিছু process-এ leakage মোট power-এর উল্লেখযোগ্য অংশ হয়ে উঠেছিল বলে ব্যাপকভাবে বর্ণিত; পরে high-k gate আর FinFET-এর মতো কাঠামো এটি অনেকটা, তবে পুরোপুরি নয়, সামলেছে। গরম chip আরও বেশি leak করে।
মোট power = dynamic (কাজ করলে) + static (চালু থাকলেই)। Dynamic কমাতে V, f আর α কমান; static কমাতে অংশটির voltage-ই কেটে দিন (power gating, অংশ ৫)। আর দুটির টানাপোড়েন থেকেই আসে “কত দ্রুত চালাব” প্রশ্নের উত্তর।
৩ · প্রতিটি কাজের energy — হিসাব সস্তা, ডেটা আনা-নেওয়া দামি
Power-এর বদলে প্রতিটি operation-এর energy ভাবলে একটি চমকপ্রদ ছবি পাওয়া যায়। Stanford-এর Mark Horowitz ২০১৪ সালে ISSCC সম্মেলনে “Computing's energy problem” নামে একটি বক্তৃতায় প্রায় ৪৫ nm প্রযুক্তির জন্য অনুমিত সংখ্যার একটি টেবিল দেখান, যা পরে বহু বইয়ে আর বক্তৃতায় উদ্ধৃত হয়েছে। নিচের মানগুলো সেই ধরনের টেবিলের মোটামুটি মাত্রা (order of magnitude) — নির্দিষ্ট chip বা আজকের process-এ সংখ্যা ভিন্ন, কিন্তু অনুপাতের গল্প মোটামুটি একই থাকে বলে ধরা হয়।
| কাজ (৩২-bit) | মোটামুটি energy | ৩২-bit integer যোগের তুলনায় |
|---|---|---|
| Integer যোগ | ~০.১ pJ | ১ গুণ |
| Floating-point গুণ | কয়েক pJ | কয়েক ডজন গুণ |
| ছোট SRAM cache (কয়েক KiB) থেকে পড়া | ~১০ pJ-এর ঘরে | প্রায় ১০০ গুণ |
| বড় on-chip SRAM (~১ MiB) থেকে পড়া | ~১০০ pJ-এর ঘরে | প্রায় ১০০০ গুণ |
| Chip-এর বাইরের DRAM থেকে পড়া | ~১–২ nJ (১০০০–২০০০ pJ) | প্রায় ১০,০০০ গুণ বা বেশি |
শিক্ষা পরিষ্কার: একটি যোগের চেয়ে তার সংখ্যাটি DRAM থেকে আনতে হাজার হাজার গুণ বেশি energy লাগে। তাই cache (পর্ব ৪৪, মেমরি হায়ারার্কি) energy-ও বাঁচায়, আর GPU ও AI accelerator (পর্ব ৫৫, GPU আর AI accelerator) একবার আনা ডেটা বহুবার ব্যবহারের জন্য নকশা করা। সাধারণ CPU core-এ instruction আনা, decode আর register file পড়ার “প্রশাসনিক” খরচও আসল যোগের চেয়ে অনেক বেশি।
রেস্তোরাঁর রান্নাঘর ভাবুন। চুলায় ডিম ভাজতে লাগে কয়েক সেকেন্ড (হিসাব)। কিন্তু ডিম যদি পাশের তাকে থাকে (cache), আনতে কয়েক সেকেন্ড; গুদামঘরে থাকলে (DRAM) কয়েক মিনিট; আর বাজার থেকে আনতে হলে (disk বা network) আধা ঘণ্টা। দক্ষ বাবুর্চি তাই রান্নার গতি নয়, জিনিস আনার যাত্রা কমানোর চেষ্টা করেন — একবারে বেশি করে এনে পাশে রাখেন।
৪ · DVFS — voltage-frequency-র জোড়া, race-to-idle বনাম ধীরে-সুস্থে
পর্ব ১৮-এ (Timing আর clock) দেখেছেন, clock-এর period critical path-এর delay-র চেয়ে বড় হতে হয়। আর transistor-এর গতি voltage-এর ওপর নির্ভর করে — voltage কমালে gate ধীর হয়। তাই voltage আর frequency স্বাধীন নয়: প্রতিটি frequency-র জন্য একটি সর্বনিম্ন নিরাপদ voltage আছে। DVFS (dynamic voltage and frequency scaling) মানে চলার সময়ে কাজের চাপ বুঝে এই জোড়া বদলানো। প্রতিটি অনুমোদিত জোড়াকে ACPI-র ভাষায় বলে P-state: P0 সবচেয়ে দ্রুত (সবচেয়ে বেশি voltage), P1, P2 … ক্রমে ধীর আর কম voltage.
কে বদলায়? সাধারণত OS-এর একটি “governor” কাজের চাপ (utilization) দেখে সিদ্ধান্ত নেয়, আর chip-এর power-management firmware বা hardware নিরাপদে voltage regulator আর clock বদলায়। আধুনিক অনেক CPU-তে hardware নিজেই আরও দ্রুত এই সিদ্ধান্ত নেয় (নাম আর খুঁটিনাটি নির্মাতাভেদে)। Software-এর দিক, governor আর Android-এর নীতি OS কোর্সের ব্যাটারির হিসাব — DVFS, governor, big.LITTLE অংশে আছে।
নিচের stepper-এ একটি core-এর কয়েকটি মুহূর্ত। Dynamic power পূর্ণ চাপে হিসাব করা, αC = ৩ nF ধরে (অনুমিত মান):
1t = 0 ms : ভিডিও export, load 95%2t = 40 ms : export শেষ, browsing, load 40%3t = 80 ms : শুধু গান চলছে, load 10%4t = 120 ms : স্ক্রিন বন্ধ, কোনো কাজ নেই5t = 160 ms : notification, হঠাৎ কাজ
| অবস্থা | |
| f | |
| V | |
| Pdyn (পূর্ণ চাপে) | |
| P0-এর তুলনায় |
- পূর্ণ চাপ — P0. ভিডিও export-এ core প্রায় পুরো সময় ব্যস্ত। Governor সবচেয়ে দ্রুত জোড়া রাখে: ২.০ GHz, ১.০০ V. Pdyn = 3 nF × 1.00² × 2.0 GHz = ৬.০০ W.
- চাপ কমল — P1. Browsing-এ core-এর কাজ ৪০%. পুরো গতির দরকার নেই, তাই ১.৪ GHz, ০.৮৫ V. নামার সময় আগে frequency কমে, তারপর voltage — যাতে কোনো মুহূর্তে voltage সেই frequency-র জন্য কম না হয়। Pdyn = 3 × 0.7225 × 1.4 = ৩.০৩ W, P0-এর প্রায় অর্ধেক (০.৫১×), অথচ গতি ৭০% রয়ে গেছে।
- খুব হালকা কাজ — P2. শুধু গান decode: ০.৮ GHz, ০.৭০ V. Pdyn = 3 × 0.49 × 0.8 = ১.১৮ W — P0-এর ০.২০ গুণ, অথচ গতি ৪০% রয়ে গেছে। Voltage-এর বর্গই এখানে বড় লাভ আনছে।
- কোনো কাজ নেই — ঘুম। P-state-এর নিচের ধাপ আর নেই; এখন core-কে C-state-এ পাঠানো হয় — clock বন্ধ (clock gating), আর গভীর অবস্থায় voltage-ও কেটে দেওয়া (power gating), তাই leakage-ও প্রায় শূন্য। দাম: জাগতে সময় লাগে (অংশ ৫)।
- হঠাৎ কাজ — আবার P0. Notification এলে interrupt core-কে জাগায় (পর্ব ৫২)। ওঠার সময় ক্রম উল্টো: আগে voltage বাড়ানো, স্থির হওয়া পর্যন্ত অপেক্ষা, তারপর frequency. এই বদলে মাইক্রোসেকেন্ড থেকে কয়েকশো মাইক্রোসেকেন্ডের মতো সময় লাগতে পারে (নকশাভেদে) — তাই খুব ঘন ঘন বদলানোও লোকসান।
Race-to-idle বনাম ধীরে-সুস্থে — energy-র তুলনা
একটি কাজে ২×109 cycle লাগে, আর ২ সেকেন্ডের মধ্যে শেষ করতে হবে। দুটি পথ: (ক) race-to-idle — ২ GHz-এ ১ সেকেন্ডে শেষ করে বাকি ১ সেকেন্ড গভীর ঘুম; (খ) ধীরে-সুস্থে — ১ GHz-এ পুরো ২ সেকেন্ড, তবে কম voltage-এ। কোনটি কম energy খরচ করে? উত্তর নির্ভর করে অনুমানের ওপর, তাই নিচের calculator অনুমানগুলো স্পষ্ট লিখে হিসাব করে: αC = ৩ nF, leakage voltage-এর সমানুপাতিক (সরলীকরণ), ঘুমের power ০.০৫ W.
// Dynamic power + DVFS energy: race-to-idle vs slow-and-steady. ALL values are ASSUMED teaching numbers.
const dyn = (a, C, V, f) => a * C * V * V * f; // P_dyn = alpha * C * V^2 * f (watts)
const a = 0.15, C = 20e-9; // activity factor, switched capacitance (F)
const p0 = dyn(a, C, 1.0, 2e9), p1 = dyn(a, C, 0.85, 1.7e9);
console.log(`P_dyn at 1.00 V, 2.0 GHz = ${p0.toFixed(3)} W`);
console.log(`P_dyn at 0.85 V, 1.7 GHz = ${p1.toFixed(3)} W (x${(p1 / p0).toFixed(4)})`);
// A job of 2e9 cycles must finish inside a 2 s window. Leakage ~ proportional to V (assumed).
const cycles = 2e9, win = 2, aC = 3e-9, idleW = 0.05; // aC = alpha*C; idle = deep sleep power
const plan = (name, V, f, leakAt1V) => {
const t = cycles / f, pd = aC * V * V * f, ps = leakAt1V * V;
const eRun = (pd + ps) * t, eIdle = idleW * (win - t);
return { name, V, f, t, pd, ps, eRun, eIdle, E: eRun + eIdle };
};
for (const leak of [1.0, 3.0]) {
console.log(`\nleakage = ${leak} W at 1.0 V, idle (sleep) = ${idleW} W, window = ${win} s`);
console.log("plan V f(GHz) t(s) Pdyn(W) Pstat(W) E_run E_idle E_total(J)");
for (const p of [plan("race (fast, sleep)", 1.0, 2e9, leak),
plan("pace (slow, low V)", 0.75, 1e9, leak),
plan("slow, V stuck 1.0", 1.0, 1e9, leak)]) {
console.log(p.name.padEnd(19) + p.V.toFixed(2).padStart(6) + (p.f / 1e9).toFixed(1).padStart(8) +
p.t.toFixed(1).padStart(6) + p.pd.toFixed(3).padStart(9) + p.ps.toFixed(2).padStart(9) +
p.eRun.toFixed(3).padStart(7) + p.eIdle.toFixed(3).padStart(8) + p.E.toFixed(3).padStart(12));
}
}আউটপুট (নির্ধারিত — সব মান অনুমিত):
P_dyn at 1.00 V, 2.0 GHz = 6.000 W
P_dyn at 0.85 V, 1.7 GHz = 3.685 W (x0.6141)
leakage = 1 W at 1.0 V, idle (sleep) = 0.05 W, window = 2 s
plan V f(GHz) t(s) Pdyn(W) Pstat(W) E_run E_idle E_total(J)
race (fast, sleep) 1.00 2.0 1.0 6.000 1.00 7.000 0.050 7.050
pace (slow, low V) 0.75 1.0 2.0 1.687 0.75 4.875 0.000 4.875
slow, V stuck 1.0 1.00 1.0 2.0 3.000 1.00 8.000 0.000 8.000
leakage = 3 W at 1.0 V, idle (sleep) = 0.05 W, window = 2 s
plan V f(GHz) t(s) Pdyn(W) Pstat(W) E_run E_idle E_total(J)
race (fast, sleep) 1.00 2.0 1.0 6.000 3.00 9.000 0.050 9.050
pace (slow, low V) 0.75 1.0 2.0 1.687 2.25 7.875 0.000 7.875
slow, V stuck 1.0 1.00 1.0 2.0 3.000 3.00 12.000 0.000 12.000
প্রথম দুই লাইন অংশ ২-এর হাতের হিসাব: ৬ W থেকে ৩.৬৮৫ W, অনুপাত ০.৬১৪১ = ০.৮৫³. তারপর প্রথম টেবিলে (leakage ১ W): race-এ চলার energy (৬ + ১) × ১ = ৭ J, ঘুমে ০.০৫ J, মোট ৭.০৫ J. ধীরে-সুস্থে ০.৭৫ V-এ dynamic power ১.৬৮৭৫ W (আউটপুটে গোল করে 1.687), leakage ০.৭৫ W, দুই সেকেন্ডে মোট ৪.৮৭৫ J — এখানে ধীরে চলা জেতে, কারণ voltage নামানো গেছে আর প্রতি cycle-এর energy V²-এর অনুপাতে কমেছে। কিন্তু তৃতীয় সারিতে voltage ১.০ V-এই আটকে (অনেক chip-এ নিচু frequency-তে voltage-এর একটি “floor” থাকে): dynamic energy একই ৬ J, আর leakage দ্বিগুণ সময় চলে — মোট ৮ J, race-এর চেয়ে খারাপ। দ্বিতীয় টেবিলে leakage তিন গুণ: ৯.০৫, ৭.৮৭৫ আর ১২ J — leakage যত বেশি, voltage না কমিয়ে ধীরে চলার শাস্তি তত বড়।
Voltage নামানো গেলে ধীরে চলা লাভজনক; শুধু frequency নামানো গেলে দ্রুত শেষ করে ঘুমানো ভালো। বাস্তবে সিদ্ধান্তে আরও আসে স্ক্রিন, RAM আর radio-র মতো অংশের power, যা core ধীর হলেও চালু থাকে — সেগুলো যোগ করলে race-to-idle প্রায়ই বেশি আকর্ষণীয় হয়।
৫ · Gating, ঘুম, তাপ আর ভিন্ন-স্বভাবের core — আর energy মাপার মাপকাঠি
Clock gating আর power gating
Clock gating
যে অংশের এই মুহূর্তে কাজ নেই, তার clock সাময়িক বন্ধ (clock gating). Flip-flop আর clock-এর তার আর উল্টায় না, তাই α প্রায় শূন্য — dynamic power বাঁচে। প্রায় তাৎক্ষণিক চালু-বন্ধ, কিন্তু voltage থাকে বলে leakage চলতেই থাকে।
dynamic কমায়, দ্রুতPower gating
অংশটির supply-ই বড় একটি “sleep transistor” দিয়ে কেটে দেওয়া (power gating). Leakage-ও প্রায় শূন্য। দাম: register আর cache-এর বিষয়বস্তু হারায় (আগে সরিয়ে রাখতে হয়), আর আবার চালু করতে বেশি সময় ও কিছু energy লাগে।
static-ও কমায়, ধীরC-state — ঘুমের বিভিন্ন গভীরতা
কাজ না থাকলে core ঘুমায়, আর ঘুমেরও স্তর আছে — x86/ACPI-র ভাষায় C-state. C0 মানে জেগে কাজ করছে; C1-এ instruction চালানো থামে আর clock gated (RISC-V-এ এর কাছাকাছি কাজ করে wfi — “wait for interrupt” instruction, ARM-এও WFI); আরও গভীর অবস্থায় (নাম আর সংখ্যা chip-ভেদে, যেমন C6) core-এর voltage কাটা হয় আর তার আগে নিজস্ব cache-এর dirty ডেটা নিচের স্তরে লিখে দেওয়া হয়। নিয়ম মোটামুটি সর্বজনীন: যত গভীর ঘুম, তত কম power, কিন্তু তত বেশি জাগার সময় আর ঢোকা-বেরোনোর energy. তাই খুব অল্প সময়ের বিরতিতে গভীর ঘুম লোকসান — OS-এর idle governor আন্দাজ করে, পরের interrupt কত দূরে।
তাপ, TDP আর dark silicon
Chip-এর সব power শেষ পর্যন্ত তাপ। TDP (thermal design power) মোটামুটি বলে, chip-কে ঠান্ডা রাখার ব্যবস্থা (heatsink, পাখা) দীর্ঘ সময় ধরে কত W তাপ সরাতে পারার মতো করে নকশা করতে হবে। এটি সর্বোচ্চ power নয়: অনেক chip অল্প সময় TDP-র ওপরে “boost” করে, আর নির্মাতাভেদে সংজ্ঞাও পুরো এক নয়। তাপমাত্রা সীমা ছুঁলে hardware নিজেই frequency কমায় — thermal throttling; গরমের দিনে ফোনে গেম ধীর হওয়ার এটি একটি সম্ভাব্য কারণ। এই তাপ-সীমার জন্যই সব transistor একসাথে পূর্ণ গতিতে চালানো যায় না — পর্ব ০২-এর dark silicon.
ভিন্ন-স্বভাবের core — big.LITTLE আর P+E
একটি বড় out-of-order core (পর্ব ৪০) প্রতি instruction-এ অনেক বেশি energy খরচ করে — বড় instruction window, বেশি port, বেশি অনুমানভিত্তিক কাজ। ছোট in-order core ধীর, কিন্তু প্রতি কাজে অনেক কম energy নেয়। Heterogeneous core-এর ধারণা: একই chip-এ দুই ধরনের core, আর OS কাজ বুঝে বসায়। ARM ২০১১ সালে এর নাম দেয় big.LITTLE; প্রায় সব আধুনিক ফোনের SoC-তে এমন মিশ্রণ আছে, আর ২০২১ সালের দিকে Intel-এর ডেস্কটপ-ল্যাপটপ chip-এও “P-core” (performance) আর “E-core” (efficiency) এসেছে। ছোট কাজ (notification, পেছনের sync) ছোট core-এ, ভারী কাজ বড় core-এ।
Energy-এর মাপকাঠি — perf/W আর EDP
দুটি নকশা তুলনা করতে কয়েকটি মাপকাঠি চলে:
- Perf/W: প্রতি watt-এ গতি = (কাজ/সেকেন্ড) ÷ W = কাজ প্রতি joule — অর্থাৎ প্রতি কাজের energy-র উল্টো।
- EDP (energy-delay product): E × D. শুধু energy দেখলে খুব ধীর নকশাও “ভালো” মনে হতে পারে; EDP গতিকেও সমান গুরুত্ব দেয়। কম EDP ভালো। গতিকে আরও গুরুত্ব দিতে ED²P = E × D².
উদাহরণ: একটি কাজ বড় core-এ ৪ W-এ ১ সেকেন্ড, ছোট core-এ ১ W-এ ৩ সেকেন্ড।
| Core | E = P × t | Perf/W (কাজ/J) | EDP (J·s) | ED²P (J·s²) |
|---|---|---|---|---|
| বড় (৪ W, ১ s) | ৪ J | ০.২৫ | ৪ | ৪ |
| ছোট (১ W, ৩ s) | ৩ J | ০.৩৩ | ৯ | ২৭ |
শুধু energy বা perf/W দেখলে ছোট core জেতে (৩ J < ৪ J); EDP বা ED²P দেখলে বড় core অনেক এগিয়ে। কোন মাপকাঠি ঠিক? ব্যবহারকারী অপেক্ষা করছেন কি না, তার ওপর নির্ভর করে — পেছনের sync-এ energy, স্ক্রিনে আঙুল ছোঁয়ার সাড়ায় গতি। অংশ ৪-এর উদাহরণেও একই: race-এর EDP ৭.০৫ × ১ = ৭.০৫, ধীরে চলার ৪.৮৭৫ × ২ = ৯.৭৫ — energy-তে যে জেতে, EDP-তে সে হারে।
৬ · Embedded system আর microcontroller — এক chip-এ পুরো কম্পিউটার
Embedded system হলো অন্য একটি যন্ত্রের ভেতরে বসানো কম্পিউটার, যার কাজ নির্দিষ্ট: ওয়াশিং মেশিনের নিয়ন্ত্রক, মাইক্রোওয়েভের টাইমার, IPS বা সোলার charge controller, গাড়ির ABS, ডিজিটাল মিটার, রাউটার। এদের সাধারণ বৈশিষ্ট্য:
- নির্দিষ্ট কাজ: সাধারণত একটি firmware বছরের পর বছর একই কাজ করে; ব্যবহারকারী নতুন অ্যাপ বসান না।
- সময়ের শর্ত (real-time): মোটরের নিয়ন্ত্রণ বা airbag-এ উত্তর দেরিতে এলে তা ভুল উত্তরের সমান (অংশ ৮)।
- কম power: অনেকে ব্যাটারি বা সৌরশক্তিতে চলে, কেউ কেউ বছরের পর বছর।
- দাম: লাখ লাখ ইউনিট বানানো হয়, তাই প্রতি chip-এ সামান্য দামের পার্থক্যও বড়।
- নির্ভরযোগ্যতা: কেউ পাশে বসে restart করবে না — তাপ, কম্পন, বিদ্যুতের ওঠানামায়ও চলতে হবে (watchdog, অংশ ৭)।
Microcontroller, microprocessor আর SoC
| বিষয় | Microcontroller (MCU) | Microprocessor (MPU) | SoC |
|---|---|---|---|
| Chip-এ কী | CPU + flash + SRAM + peripheral, সব এক chip-এ | মূলত CPU core আর cache; RAM, storage বাইরে | কয়েকটি CPU core + GPU + NPU + modem + অনেক block, RAM সাধারণত বাইরে বা একই package-এ |
| মেমরি | কয়েক KiB থেকে কয়েক MiB, chip-এর ভেতরে | বাইরের GB-মাপের DRAM | বাইরের GB-মাপের DRAM |
| Clock | কয়েক MHz থেকে কয়েকশো MHz | GHz-এর ঘরে | GHz-এর ঘরে |
| MMU আর OS | সাধারণত MMU নেই; bare-metal বা RTOS | MMU আছে; Linux, Windows | MMU আছে; Android, iOS, Linux |
| উদাহরণ | Arduino-র AVR, ARM Cortex-M chip, ESP32 | ডেস্কটপের x86 CPU | ফোনের chip, Raspberry Pi-র chip |
সীমারেখা আজ ঝাপসা — অনেক MCU-তেই Wi-Fi radio আছে, আর SoC শব্দটি ছোট chip-এর জন্যও ব্যবহৃত হয়। মূল পার্থক্য দর্শনে: microcontroller নিজের ভেতরেই সম্পূর্ণ, কম দামে কম power-এ একটি কাজের জন্য; microprocessor বাইরের অনেক chip-এর ওপর নির্ভরশীল সাধারণ-উদ্দেশ্যের গতিশীল CPU; আর SoC সেই পুরো বোর্ডকে এক chip-এ গুটিয়ে আনে।
একটি microcontroller-এর memory map
MCU-তে সাধারণত virtual memory নেই — CPU-র ঠিকানাই physical ঠিকানা, আর ঠিকানা-জগৎ ভাগ করা থাকে অঞ্চলে: কোথাও flash (প্রোগ্রাম), কোথাও SRAM (ভ্যারিয়েবল, stack), কোথাও peripheral-এর register. পর্ব ৫১-এ (I/O আর bus) যে memory-mapped I/O দেখেছেন, MCU-তে তা-ই সবকিছু: একটি LED জ্বালানো মানে একটি নির্দিষ্ট ঠিকানায় store. নিচের map একটি কাল্পনিক উদাহরণ — বাস্তব chip-এর ঠিকানা তার datasheet বা reference manual-এ থাকে:
| ঠিকানা (উদাহরণ) | অঞ্চল | আকার | কী থাকে |
|---|---|---|---|
| 0x0000_0000 – 0x0003_FFFF | Flash | ২৫৬ KiB | প্রোগ্রাম, ধ্রুবক, শুরুতে interrupt vector টেবিল |
| 0x2000_0000 – 0x2000_FFFF | SRAM | ৬৪ KiB | global ভ্যারিয়েবল, heap, stack |
| 0x4001_0000 | Timer 0 | ১ KiB | COUNT, CMP, CTRL, FLAG register |
| 0x4001_2000 | ADC | ১ KiB | channel বাছাই, start, ফলাফল |
| 0x4001_3000 | UART 0 | ১ KiB | DATA, STATUS, BAUD register |
| 0x4002_0000 | GPIO | ১ KiB | MODE, OUT, IN, SET, CLR, PULL |
ARM Cortex-M পরিবারে এমন বিন্যাসের একটি মানক কাঠামো architecture-এই বাঁধা বলে জানা যায়: মোটামুটি 0x0000_0000 থেকে code, 0x2000_0000 থেকে SRAM, 0x4000_0000 থেকে peripheral, আর 0xE000_0000 থেকে system অঞ্চল (interrupt controller NVIC আর SysTick timer). প্রতিটি অঞ্চলের ভেতরে কী কোথায়, তা chip-নির্মাতা ঠিক করেন। RISC-V MCU-তে এমন বাঁধাধরা map নেই — প্রতিটি chip নিজের map দেয়।
জনপ্রিয় কিছু পরিবার (সংক্ষেপে)
- ARM Cortex-M: ৩২-bit, অনেক নির্মাতা লাইসেন্স নিয়ে বানান; ছোট M0/M0+ থেকে DSP আর floating point-সহ M4, M7 পর্যন্ত। আজকের MCU বাজারের বড় অংশ বলে ব্যাপকভাবে ধরা হয়।
- RISC-V MCU: খোলা ISA হওয়ায় লাইসেন্স-খরচ ছাড়া core বানানো যায়; সাম্প্রতিক বছরগুলোতে বেশ কিছু নির্মাতা RISC-V-ভিত্তিক MCU এনেছেন (যেমন ESP32-এর কিছু নতুন সংস্করণ)।
- AVR: ৮-bit; Arduino Uno-র ATmega328P সবচেয়ে পরিচিত — ১৬ MHz, ৩২ KiB flash, ২ KiB SRAM. শেখার জন্য আজও খুব জনপ্রিয়।
- ESP32: Wi-Fi আর Bluetooth-সহ সস্তা MCU; মূল সংস্করণে দুটি Xtensa core, পরের কিছু সংস্করণে RISC-V. শখের IoT প্রজেক্টে খুব প্রচলিত।
৭ · Peripheral — GPIO, timer-PWM, ADC, serial bus আর watchdog
MCU-র আসল শক্তি তার peripheral — বাইরের দুনিয়ার সাথে কথা বলার ছোট ছোট hardware block, প্রতিটি কয়েকটি register দিয়ে নিয়ন্ত্রিত। Software register-এ লেখে, hardware নিজে বাকিটা করে — CPU-কে প্রতিটি বিট হাতে নাড়তে হয় না।
GPIO — সাধারণ-কাজের pin
GPIO (general-purpose input/output) pin হয় output (LED, relay চালানো) বা input (বোতাম পড়া)। সাধারণ register: MODE বা DIR (প্রতিটি বিট একটি pin-এর দিক), OUT (output latch), IN (pin-এর বর্তমান মান), আর PULL — ভেতরের pull-up বা pull-down চালু করা, যাতে বোতাম খোলা থাকলে input ভেসে না থাকে। পর্ব ০৬-এর bit manipulation (ডেটার বিট-রূপ) এখানেই প্রতিদিনের কাজ: OUT |= (1u << 5) pin ৫ জ্বালায়, OUT &= ~(1u << 5) নেভায়।
একটি সমস্যা: |= আসলে পড়া-বদলানো-লেখা (read-modify-write) — তিনটি ধাপ। মাঝখানে একটি interrupt একই register-এর অন্য বিট বদলালে সেই বদল হারিয়ে যেতে পারে। তাই অনেক MCU-তে আলাদা SET আর CLR register থাকে: সেখানে ১ লিখলে শুধু সেই বিট সেট বা মোছা হয়, বাকিগুলো অপরিবর্তিত — একটি store-এই কাজ, ভাগাভাগির সমস্যা নেই। নিচে একটি বাস্তব ধাঁচের blink প্রোগ্রাম (উদাহরণ, ওপরের কাল্পনিক map ধরে; এখানে চালানো যায় না — আসল board লাগে):
#include <stdint.h>
#define GPIO_BASE 0x40020000u /* example map only */
#define GPIO_MODE (*(volatile uint32_t *)(GPIO_BASE + 0x00))
#define GPIO_SET (*(volatile uint32_t *)(GPIO_BASE + 0x0C)) /* write 1 = set bit */
#define GPIO_CLR (*(volatile uint32_t *)(GPIO_BASE + 0x10)) /* write 1 = clear bit */
#define LED (1u << 5)
static void delay(volatile uint32_t n) { while (n--) { } } /* busy wait: wastes energy */
int main(void) {
GPIO_MODE |= LED; /* pin 5 = output (read-modify-write, done once) */
for (;;) {
GPIO_SET = LED; /* single store, no read needed */
delay(400000);
GPIO_CLR = LED;
delay(400000);
}
}এখানে volatile জরুরি: না থাকলে compiler store-গুলো বাদ দিতে বা একত্র করতে পারে (C কোর্সের Embedded C পর্বে বিস্তারিত)। আর delay() loop শক্তির অপচয় — CPU পুরো গতিতে অকারণে ঘোরে। ভালো নকশায় timer সময় গোনে, CPU ঘুমায়। নিচের simulation সেই ধারণা দেখায় — সাধারণ মেমরিতে একটি নকল GPIO আর timer register block, আর timer-এর event-এ চলা একটি ছোট state machine:
// SIMULATION: fake GPIO + timer registers in ordinary memory (no real hardware is touched)
#include <stdio.h>
#include <stdint.h>
typedef struct { volatile uint32_t MODE, OUT, IN; } gpio_regs; /* MODE bit = 1: output pin */
typedef struct { volatile uint32_t COUNT, CMP, FLAG; } timer_regs; /* FLAG bit 0: compare match */
static gpio_regs fake_gpio; static timer_regs fake_tim; /* real MCU: ((gpio_regs *)0x40020000u) */
#define GPIO (&fake_gpio)
#define TIM (&fake_tim)
#define BIT(n) (1u << (n))
#define SET(r, m) ((r) |= (m))
#define CLR(r, m) ((r) &= ~(m))
#define LED 5u /* LED on pin 5 */
enum { ON_TICKS = 2, OFF_TICKS = 3 };
static void hw_tick(void) { /* what the timer hardware does by itself every tick */
TIM->COUNT = TIM->COUNT + 1;
if (TIM->COUNT >= TIM->CMP) { TIM->COUNT = 0; SET(TIM->FLAG, BIT(0)); }
}
int main(void) {
SET(GPIO->MODE, BIT(LED)); /* configure pin 5 as output */
TIM->CMP = OFF_TICKS; /* start in the OFF state */
for (int tick = 1; tick <= 12; tick++) {
hw_tick();
int event = (TIM->FLAG & BIT(0)) != 0;
if (event) { /* state machine: OFF -> ON -> OFF ... */
CLR(TIM->FLAG, BIT(0)); /* acknowledge the flag */
if (GPIO->OUT & BIT(LED)) { CLR(GPIO->OUT, BIT(LED)); TIM->CMP = OFF_TICKS; }
else { SET(GPIO->OUT, BIT(LED)); TIM->CMP = ON_TICKS; }
}
printf("tick %2d COUNT=%u CMP=%u OUT=0x%02X LED %s%s\n", tick, (unsigned)TIM->COUNT,
(unsigned)TIM->CMP, (unsigned)GPIO->OUT, (GPIO->OUT & BIT(LED)) ? "ON " : "off",
event ? " <- timer event" : "");
}
printf("duty = %d/%d = %d%%\n", ON_TICKS, ON_TICKS + OFF_TICKS, 100 * ON_TICKS / (ON_TICKS + OFF_TICKS));
return 0;
}একটি shared virtual machine-এ চালানো আউটপুট (simulation, তাই নির্ধারিত):
tick 1 COUNT=1 CMP=3 OUT=0x00 LED off
tick 2 COUNT=2 CMP=3 OUT=0x00 LED off
tick 3 COUNT=0 CMP=2 OUT=0x20 LED ON <- timer event
tick 4 COUNT=1 CMP=2 OUT=0x20 LED ON
tick 5 COUNT=0 CMP=3 OUT=0x00 LED off <- timer event
tick 6 COUNT=1 CMP=3 OUT=0x00 LED off
tick 7 COUNT=2 CMP=3 OUT=0x00 LED off
tick 8 COUNT=0 CMP=2 OUT=0x20 LED ON <- timer event
tick 9 COUNT=1 CMP=2 OUT=0x20 LED ON
tick 10 COUNT=0 CMP=3 OUT=0x00 LED off <- timer event
tick 11 COUNT=1 CMP=3 OUT=0x00 LED off
tick 12 COUNT=2 CMP=3 OUT=0x00 LED off
duty = 2/5 = 40%
এখানে আসল hardware নেই — fake_gpio আর fake_tim সাধারণ global struct, আর hw_tick() আসল timer-এর কাজ নকল করে; আসল chip-এ শুধু pointer-টি বদলাত। Tick ৩-এ counter প্রথম CMP = 3 ছোঁয় — event, flag মোছা হয় (acknowledge), LED জ্বলে, আর পরের সময়সীমা CMP = 2 বসে। Pin ৫ মানে বিট ৫, তাই OUT = 0x20. Tick ৫-এ আবার event, LED নেভে, CMP = 3. ফলে LED ১২টি tick-এর মধ্যে ৩, ৪, ৮, ৯-এ জ্বলে — প্রতি ৫ tick-এ ২টি, duty ৪০%. এটি আসলে software-চালিত PWM; নিচের PWM hardware একই কাজ CPU ছাড়াই করে। আসল chip-এ flag-এর বদলে timer-এর interrupt CPU-কে জাগাত, বাকি সময় CPU ঘুমাত।
Timer আর PWM — digital pin দিয়ে “মাঝামাঝি” মান
Timer একটি hardware counter (পর্ব ১৬-এর counter), যা নিজে নিজে clock গোনে আর compare মানে পৌঁছালে event দেয়। এর সবচেয়ে কাজের ব্যবহার PWM (pulse-width modulation): pin খুব দ্রুত চালু-বন্ধ হয়, আর period-এর যে ভগ্নাংশ চালু থাকে তা duty. LED, মোটর বা heater এত দ্রুত সাড়া দেয় না, তাই তারা গড় মানটি “দেখে”:
উদাহরণ: timer clock ১৬ MHz, period ১০০০ count → fPWM = ১৬ kHz (period ৬২.৫ µs). Compare ২৫০ হলে duty ২৫%, ৩.৩ V supply-তে গড় ০.৮২৫ V. নিচের stepper-এ একই timer-এ compare বদলে বদলে (এখানে প্রতিটি █ বা ░ period-এর ১/৮ অংশ):
1TIM_CMP = 0; // period = 10002TIM_CMP = 250;3TIM_CMP = 500;4TIM_CMP = 750;5TIM_CMP = 1000;
| duty | |
| ON সময় | |
| OFF সময় | |
| Vavg |
- Compare ০ — duty ০%. Counter ০ থেকে ৯৯৯ গোনে, আর count < compare হলে pin high — compare ০ হলে কখনো high নয়। গড় voltage ০ V, LED নিভে আছে।
- Compare ২৫০ — duty ২৫%. প্রতি period-এর প্রথম ২৫০ count (১৫.৬২৫ µs) pin high, বাকি ৭৫০ count low. গড় = ০.২৫ × ৩.৩ = ০.৮২৫ V. ১৬ kHz-এ চোখ ঝিকিমিকি দেখে না, শুধু কম উজ্জ্বলতা দেখে।
- Compare ৫০০ — duty ৫০%. অর্ধেক সময় high: ৩১.২৫ µs. গড় ১.৬৫ V. তবে চোখের কাছে উজ্জ্বলতা “অর্ধেক” মনে না-ও হতে পারে — মানুষের উজ্জ্বলতা-বোধ রৈখিক নয়, তাই LED-এর নকশায় প্রায়ই duty-কে একটি বক্ররেখা দিয়ে সাজানো হয়।
- Compare ৭৫০ — duty ৭৫%. High ৪৬.৮৭৫ µs, গড় ২.৪৭৫ V. মোটরের ক্ষেত্রে গড় voltage মোটামুটি গতি ঠিক করে — ফ্যানের regulator-এর digital রূপ।
- Compare ১০০০ — duty ১০০%. Count সবসময় compare-এর চেয়ে ছোট, তাই pin সারাক্ষণ high: ৩.৩ V. পুরো সময় CPU একটি instruction-ও খরচ করেনি — compare register-এ একবার লেখার পর hardware নিজেই তরঙ্গ বানাচ্ছে।
ADC — analog voltage থেকে সংখ্যা
তাপমাত্রা, আলো, মাটির আর্দ্রতার sensor সাধারণত একটি voltage দেয়। ADC (analog-to-digital converter) সেই voltage-কে n-bit সংখ্যায় বদলায়। আদর্শ n-bit ADC-তে 2nটি code, আর প্রতিটি code-এর ধাপ:
১২-bit, Vref ৩.৩ V: ধাপ = ৩.৩ ÷ ৪০৯৬ ≈ ০.৮০৬ mV. ১.৬৫ V → code ২০৪৮ (ঠিক মাঝখানে)। ধাপের চেয়ে ছোট পার্থক্য ADC দেখতে পায় না — এটি quantization error, ⌊ ⌋ দিয়ে কাটলে ০ থেকে প্রায় ১ ধাপ, আর কাছের code-এ গোল করলে ±½ ধাপ। সাবধান: কিছু বই আর datasheet ধাপকে Vref ÷ (2n − 1) হিসেবে লেখে — পরীক্ষায় কোন নিয়ম চাওয়া হয়েছে দেখে নিন। নিচের calculator দুই রূপান্তর, তিনটি ADC-র ধাপ, একটি ছোট quantisation টেবিল আর PWM-এর হিসাব একসাথে করে:
// ADC code <-> voltage and PWM duty -> average voltage (ideal converter, step = Vref / 2^n).
const step = (vref, n) => vref / 2 ** n;
const toCode = (v, vref, n) => Math.min(2 ** n - 1, Math.floor(v / step(vref, n)));
const toVolt = (code, vref, n) => code * step(vref, n); // lower edge of the code's band
for (const [vref, n] of [[5.0, 10], [3.3, 12], [3.3, 16]])
console.log(`${n}-bit, Vref ${vref} V: ${2 ** n} codes, step = ${(step(vref, n) * 1000).toFixed(4)} mV`);
console.log("\n12-bit, Vref 3.3 V");
for (const v of [0.5, 1.65, 2.0, 3.3]) console.log(` ${v.toFixed(2)} V -> code ${toCode(v, 3.3, 12)}`);
for (const c of [1000, 3000]) console.log(` code ${c} -> ${toVolt(c, 3.3, 12).toFixed(4)} V`);
console.log("\nquantisation: 3-bit ADC, Vref 8 V (step 1 V), input 0..8 V");
console.log(" input(V) code bits back(V) error(V)");
for (const v of [0.0, 0.4, 1.0, 2.7, 3.99, 5.5, 7.2, 8.0]) {
const c = toCode(v, 8, 3), back = toVolt(c, 8, 3);
console.log(` ${v.toFixed(2).padStart(7)} ${String(c).padStart(5)} ${c.toString(2).padStart(3, "0")}` +
`${back.toFixed(2).padStart(9)}${(v - back).toFixed(2).padStart(10)}`);
}
console.log("\nPWM: timer clock 16 MHz, period register 1000 counts, supply 3.3 V");
const fPWM = 16e6 / 1000;
console.log(` PWM frequency = ${fPWM / 1000} kHz, period = ${(1e6 / fPWM).toFixed(1)} us`);
for (const cmp of [0, 250, 500, 750, 1000]) {
const d = cmp / 1000;
console.log(` compare ${String(cmp).padStart(4)}: duty ${(100 * d).toFixed(0).padStart(3)}% ON ${(d * 62.5).toFixed(2).padStart(6)} us` +
` V_avg = ${(3.3 * d).toFixed(3)} V`);
}আউটপুট (নির্ধারিত):
10-bit, Vref 5 V: 1024 codes, step = 4.8828 mV
12-bit, Vref 3.3 V: 4096 codes, step = 0.8057 mV
16-bit, Vref 3.3 V: 65536 codes, step = 0.0504 mV
12-bit, Vref 3.3 V
0.50 V -> code 620
1.65 V -> code 2048
2.00 V -> code 2482
3.30 V -> code 4095
code 1000 -> 0.8057 V
code 3000 -> 2.4170 V
quantisation: 3-bit ADC, Vref 8 V (step 1 V), input 0..8 V
input(V) code bits back(V) error(V)
0.00 0 000 0.00 0.00
0.40 0 000 0.00 0.40
1.00 1 001 1.00 0.00
2.70 2 010 2.00 0.70
3.99 3 011 3.00 0.99
5.50 5 101 5.00 0.50
7.20 7 111 7.00 0.20
8.00 7 111 7.00 1.00
PWM: timer clock 16 MHz, period register 1000 counts, supply 3.3 V
PWM frequency = 16 kHz, period = 62.5 us
compare 0: duty 0% ON 0.00 us V_avg = 0.000 V
compare 250: duty 25% ON 15.63 us V_avg = 0.825 V
compare 500: duty 50% ON 31.25 us V_avg = 1.650 V
compare 750: duty 75% ON 46.88 us V_avg = 2.475 V
compare 1000: duty 100% ON 62.50 us V_avg = 3.300 V
প্রতিটি বাড়তি বিট ধাপ অর্ধেক করে: ১০-bit, ৫ V-এ (Arduino Uno-র ধাঁচ) ৪.৮৮ mV, ১২-bit, ৩.৩ V-এ ০.৮০৬ mV. ২.০ V ÷ ০.৮০৫৭ mV = ২৪৮২.৪ → code ২৪৮২; ৩.৩ V-এ code ৪০৯৬ হতো, কিন্তু ১২ বিটে সর্বোচ্চ ৪০৯৫. ৩-bit টেবিলে (ধাপ ১ V) quantisation চোখে দেখা যায়: ২.৭ V আর ২.০ V দুটিই code ২ (010), আর ৩.৯৯ V-এ ভুল প্রায় পুরো এক ধাপ। PWM অংশ stepper-এর সংখ্যা মেলায়: ১৬ kHz, ৬২.৫ µs, ২৫% duty-তে ON ১৫.৬২৫ µs (আউটপুটে গোল করে 15.63), গড় ০.৮২৫ V.
UART, I2C আর SPI — chip-এর সাথে chip-এর কথা
Sensor, display, memory chip-এর সাথে MCU কথা বলে serial bus-এ। পর্ব ৫১-এ (I/O আর bus) bus-এর সাধারণ ধারণা আছে; এখানে MCU-র তিনটি প্রচলিত পথ পাশাপাশি:
| বিষয় | UART | I2C | SPI |
|---|---|---|---|
| তার (GND ছাড়া) | ২: TX, RX | ২: SDA (ডেটা), SCL (clock) | ৩ + প্রতি device-এ ১টি CS: SCLK, MOSI, MISO, CS |
| Clock | নেই (asynchronous) — দুই পক্ষ আগে থেকে একই baud rate মানে | Controller দেয় | Controller দেয় |
| ঠিকানা | নেই — একজনের সাথে একজন | প্রতিটি device-এর ঠিকানা (সাধারণত ৭-bit), একই দুই তারে অনেক device | নেই — CS তার দিয়ে device বাছাই |
| প্রচলিত গতি (মোটামুটি) | ৯৬০০ থেকে ১১৫২০০ baud খুব প্রচলিত, আরও বেশিও হয় | ১০০ kbit/s (standard), ৪০০ kbit/s (fast), আরও দ্রুত mode-ও আছে | সাধারণত কয়েক থেকে কয়েক ডজন MHz, chip-ভেদে |
| বৈদ্যুতিক | push-pull | open-drain, pull-up resistor লাগে | push-pull |
| ব্যবহার | debug console, GPS, modem | তাপমাত্রা sensor, ছোট EEPROM, display | flash memory, SD card, দ্রুত display |
একটি হিসাব: UART-এ “8N1” ফরম্যাটে প্রতিটি byte-এ ১টি start বিট + ৮টি ডেটা বিট + ১টি stop বিট = ১০ বিট। তাই ১১৫২০০ baud-এ সর্বোচ্চ ১১৫২০০ ÷ ১০ = ১১,৫২০ byte/s — ৮ দিয়ে ভাগ করা প্রচলিত ভুল। I2C-তে প্রতিটি byte-এর পর receiver একটি ACK বিট দেয়, তাই এখানেও ৮ বিটের জন্য ৯টি clock; SPI সবচেয়ে সরল আর দ্রুত, তবে প্রতিটি device-এর জন্য বাড়তি তার।
Watchdog আর interrupt
Watchdog timer একটি গুনতে থাকা counter, যাকে software-কে নিয়মিত reset করতে (“খাওয়াতে”) হয়। Software কোথাও আটকে গেলে — অনন্ত loop, বিদ্যুতের ঝাঁকুনিতে গোলমাল — watchdog শেষ সীমায় পৌঁছে পুরো chip reset করে। মাঠে বসানো যন্ত্রে এটিই শেষ রক্ষা। আর peripheral নিজের কাজ শেষ হলে (ADC-র রূপান্তর, UART-এ byte এল, timer-এর event) CPU-কে interrupt দেয়, যাতে CPU বারবার জিজ্ঞেস না করে ঘুমিয়ে থাকতে পারে। Interrupt controller আর DMA-র hardware পর্ব ৫২-এ (Interrupt আর DMA), আর CPU-র ভেতরে trap কীভাবে সামলানো হয় তা পর্ব ৩৮-এ (Exception আর interrupt) দেখুন।
৮ · Real-time আর low-power নকশা — deadline, WCET আর duty cycling
Real-time — গড় নয়, সবচেয়ে খারাপ ক্ষেত্র
Real-time system-এ উত্তর ঠিক হওয়ার পাশাপাশি সময়মতো হতে হয়: প্রতিটি কাজের একটি deadline. Hard real-time-এ (airbag, মোটরের নিয়ন্ত্রণ) deadline ফসকানো মানে ব্যর্থতা; soft real-time-এ (ভিডিও চালানো) মাঝে মাঝে ফসকালে মান কমে। তাই এখানে প্রশ্ন “গড়ে কত দ্রুত” নয়, বরং WCET (worst-case execution time) — সবচেয়ে খারাপ ক্ষেত্রে একটি কাজ কতক্ষণ নিতে পারে।
এখানেই এই কোর্সের অনেক গতি-বাড়ানোর কৌশল ঝামেলা বাধায়। Cache (পর্ব ৪৫) গড় সময় কমায়, কিন্তু একই কোড কখনো hit, কখনো miss — সময় অনেকটা ওঠানামা করে। Branch predictor (পর্ব ৩৭), out-of-order execution (পর্ব ৪০) আর অন্য core-এর সাথে ভাগ করা bus-ও তাই। এদের সবচেয়ে খারাপ ক্ষেত্র প্রমাণ করা খুব কঠিন, আর নিরাপদ দিকে থাকতে বিশ্লেষণ প্রায়ই অনেক হতাশাজনক অনুমান দেয়। ফলে কঠোর real-time কাজের MCU-তে প্রায়ই সরল in-order pipeline, cache-এর বদলে বা পাশাপাশি নির্দিষ্ট সময়ের on-chip মেমরি (ARM-এর ভাষায় tightly-coupled memory), আর নির্দিষ্ট interrupt latency রাখা হয় — গড় গতির চেয়ে পূর্বানুমানযোগ্যতা বেশি মূল্যবান। Scheduling-এর দিক (rate monotonic, EDF) আর RTOS কীভাবে tick আর priority দিয়ে কাজ চালায়, তা OS কোর্সের Real-time scheduling আর RTOS-এর ভেতর অংশে আছে।
Low-power নকশা — প্রায় সারাক্ষণ ঘুম
একটি কাল্পনিক উদাহরণ: ধানক্ষেতের এক কোণে মাটির আর্দ্রতা মাপার একটি sensor node, দুটি AA ব্যাটারিতে (ধরা যাক ২০০০ mAh), প্রতি ১০ মিনিটে একবার মাপ পাঠায়। বর্ষায় মাঠে গিয়ে বারবার ব্যাটারি বদলানো বাস্তবসম্মত নয়, তাই লক্ষ্য মাসের পর মাস চলা। কৌশল একটিই — duty cycling: বেশিরভাগ সময় MCU গভীর ঘুমে (কয়েক µA), একটি কম-power timer নির্দিষ্ট সময় পর জাগায়, অল্প কাজ করে আবার ঘুম। গড় current:
- জাগা + মাপা
10 mA × 2 ssensor, ADC - পাঠানো
120 mA × 1 sradio TX - ঘুম
10 µA × 597 sশুধু RTC চলে - গড়
0.2433 mA145.97 ÷ 600 - আয়ু
≈ 274 দিন৮০% ব্যবহারযোগ্য
MCU জাগে, sensor-এ power দেয়, স্থির হওয়ার অপেক্ষা,
ADC দিয়ে কয়েকবার মেপে গড় নেয়।
charge = 10 mA × 2 s = 20 mA·s
radio চালু, packet পাঠানো, ACK-এর অপেক্ষা
charge = 120 mA × 1 s = 120 mA·s
(এক চক্রের মোট charge-এর প্রায় ৮২%)
sensor, radio, ADC বন্ধ; CPU power-gated
শুধু ছোট RTC আর জাগানোর logic চালু
charge = 0.010 mA × 597 s = 5.97 mA·s
মোট = 20 + 120 + 5.97 = 145.97 mA·s প্রতি 600 s
I_avg = 145.97 ÷ 600 = 0.2433 mA
জাগা সময় মাত্র 3 ÷ 600 = 0.5%
আদর্শ: 2000 ÷ 0.2433 ≈ 8221 h ≈ 342.5 দিন
৮০% ব্যবহারযোগ্য ধরলে: 1600 ÷ 0.2433 ≈ 274 দিন
ঘুমে 10 µA-এর বদলে 2 mA হলে: মাত্র 30 দিন
- জাগা আর মাপা। একটি ছোট real-time clock (RTC) timer ১০ মিনিট পর interrupt দিয়ে MCU-কে জাগায়। Sensor-এ power দেওয়া, স্থির হওয়ার অপেক্ষা আর ADC দিয়ে কয়েকবার মাপা — মোট ২ সেকেন্ড, ১০ mA ধরে: ২০ mA·s charge.
- পাঠানো। Radio সবচেয়ে বেশি current টানে — এখানে ১২০ mA ধরে ১ সেকেন্ড: ১২০ mA·s, যা পুরো চক্রের প্রায় ৮২%. তাই low-power নকশায় প্রথম প্রশ্ন: কত কম বার, কত ছোট packet পাঠালে চলে? কয়েকটি মাপ জমিয়ে একবারে পাঠানো বড় লাভ দিতে পারে।
- ঘুম। বাকি ৫৯৭ সেকেন্ড শুধু RTC চলে, বাকি সব power-gated — ১০ µA ধরে মাত্র ৫.৯৭ mA·s. সময়ের ৯৯.৫% এখানে, অথচ charge-এর ৪%-এর একটু বেশি।
- গড় current. এক চক্রে মোট ১৪৫.৯৭ mA·s, ৬০০ সেকেন্ডে ভাগ করলে Iavg ≈ ০.২৪৩৩ mA. সর্বোচ্চ current ১২০ mA হলেও গড় প্রায় ৫০০ গুণ কম — duty cycling-এর শক্তি এখানেই।
- আয়ু। পুরো ২০০০ mAh পেলে প্রায় ৮২২১ ঘণ্টা ≈ ৩৪২.৫ দিন। বাস্তবে self-discharge, ঠান্ডা আর ব্যাটারির শেষ দিকের কম voltage-এর জন্য পুরোটা পাওয়া যায় না; ৮০% ধরলে ≈ ২৭৪ দিন। আর firmware-এর একটি ভুলে (যেমন একটি pin ভাসমান রেখে বা radio বন্ধ না করে) ঘুমে ২ mA টানলে আয়ু নেমে আসে মাত্র ৩০ দিনে।
একই হিসাব বিভিন্ন জাগার ব্যবধানে — কত ঘন ঘন মাপ নিলে আয়ু কত:
// Duty-cycled sensor node: average current and battery life. ALL values are ASSUMED teaching numbers.
const battery_mAh = 2000, derate = 0.8; // usable fraction (self-discharge, cold, cut-off voltage)
const phases = [ // one wake-up: [name, seconds, current in mA]
["measure", 2, 10],
["radio TX", 1, 120],
];
const sleep_mA = 0.010; // 10 uA in deep sleep
console.log(`battery ${battery_mAh} mAh, usable ${derate * 100}%, sleep ${sleep_mA * 1000} uA`);
console.log("period awake% charge/period(mA*s) I_avg(mA) life(days)");
for (const period of [60, 300, 600, 1800, 3600]) { // seconds between wake-ups
let awake = 0, q = 0;
for (const [, t, i] of phases) { awake += t; q += t * i; }
q += (period - awake) * sleep_mA; // the rest of the period asleep
const iAvg = q / period; // mA = (mA*s) / s
const days = battery_mAh * derate / iAvg / 24;
console.log(`${String(period / 60).padStart(4)} min ${(100 * awake / period).toFixed(3).padStart(8)}` +
`${q.toFixed(2).padStart(18)}${iAvg.toFixed(4).padStart(15)}${days.toFixed(1).padStart(12)}`);
}
// What if the node never sleeps properly and idles at 2 mA instead of 10 uA?
const q2 = 2 * 10 + 1 * 120 + 597 * 2, i2 = q2 / 600;
console.log(`\n10 min period, idle 2 mA instead of sleep: I_avg = ${i2.toFixed(3)} mA, ` +
`life = ${(battery_mAh * derate / i2 / 24).toFixed(1)} days`);আউটপুট (নির্ধারিত, সব current অনুমিত):
battery 2000 mAh, usable 80%, sleep 10 uA
period awake% charge/period(mA*s) I_avg(mA) life(days)
1 min 5.000 140.57 2.3428 28.5
5 min 1.000 142.97 0.4766 139.9
10 min 0.500 145.97 0.2433 274.0
30 min 0.167 157.97 0.0878 759.6
60 min 0.083 175.97 0.0489 1363.9
10 min period, idle 2 mA instead of sleep: I_avg = 2.223 mA, life = 30.0 days
১০ মিনিটের সারি stepper-এর সাথে মেলে: ১৪৫.৯৭ mA·s, ০.২৪৩৩ mA, ২৭৪.০ দিন। প্রতি মিনিটে মাপলে গড় current প্রায় ১০ গুণ (২.৩৪ mA), আয়ু মাত্র ২৮.৫ দিন; প্রতি ঘণ্টায় হলে প্রায় ১৩৬৪ দিন (যদিও এত দীর্ঘ সময়ে ব্যাটারির self-discharge বড় হয়ে ওঠে)। ব্যবধান বাড়ালে ঘুমের charge-ই বড় অংশ হয়ে ওঠে (৬০ মিনিটে ১৭৫.৯৭-এর মধ্যে ৩৫.৯৭) — তখন ঘুমের µA কমানোই পরের লক্ষ্য। শেষ লাইন: ঘুমে ২ mA হলে মাত্র ৩০ দিন। সৌরশক্তিতে চলা যন্ত্রেও একই হিসাব: মেঘলা দিনে প্যানেল যত দেয়, গড় current তার নিচে রাখতে হয়।
ফোনের SoC — একটি chip-এ অনেক বিশেষজ্ঞ
এই পর্বের সব ধারণা একসাথে দেখা যায় ফোনের SoC-তে। সাধারণ আধুনিক ফোনের chip-এ মোটামুটি থাকে: বড় আর ছোট CPU core, GPU (পর্ব ৫৫), AI-এর জন্য NPU, ক্যামেরার ISP (image signal processor), video-র block, অনেক ক্ষেত্রে cellular modem, আর sensor দেখার জন্য সর্বদা-জাগ্রত একটি ছোট কম-power core. প্রতিটি block আলাদা power domain-এ, নিজস্ব DVFS আর power gating-সহ — ক্যামেরা বন্ধ থাকলে ISP পুরো অন্ধকার। এটিই dark silicon-এর ইতিবাচক রূপ: অনেক বিশেষজ্ঞ, যার যখন দরকার।
আরও গভীরে: বাস্তব chip-এ power-management নিজেই একটি ছোট কম্পিউটার — অনেক SoC-তে একটি আলাদা microcontroller-ধরনের core সারাক্ষণ তাপমাত্রা, current আর প্রতিটি domain-এর চাহিদা দেখে voltage regulator নিয়ন্ত্রণ করে। নকশার পর্যায়ে “multi-voltage” প্রবাহে প্রতিটি power domain, isolation cell আর level shifter একটি বিশেষ বিবরণ-ফরম্যাটে (যেমন UPF) লেখা হয়। গবেষণায় আরও আছে near-threshold computing — voltage-কে threshold-এর কাছাকাছি নামিয়ে প্রতি operation-এ energy অনেক কমানো, কিন্তু গতি আর নির্ভরযোগ্যতার বড় দামে — আর মেমরির কাছে বা ভেতরে হিসাব করা (near-memory computing), অংশ ৩-এর ডেটা আনা-নেওয়ার খরচ কমাতে।
৯ · AI-এর যুগে — power আর embedded-এর হিসাব যাচাই
AI টুল datasheet-এর মতো ভাষায় খুব আত্মবিশ্বাসী উত্তর দেয়, আর embedded-এ ভুল register-এর ঠিকানা বা ভুল ঘুমের current মাঠে গিয়ে তবেই ধরা পড়ে। এই বিষয়ে প্রচলিত ভুল:
| AI-এর প্রচলিত ভুল | ঠিক কথা | কীভাবে যাচাই |
|---|---|---|
| Power আর energy গুলিয়ে “কম W মানে বেশি ব্যাটারি” | প্রতি কাজের energy = P × t দেখতে হয় | দুই পথের J নিজে হিসাব করা |
| “V ১৫% কমালে power ১৫% কমে” | V² থাকায় ০.৭২২৫ গুণ; f-সহ ০.৮৫³ ≈ ০.৬১ | অংশ ৪-এর calculator |
| mAh-কে energy ধরে ভিন্ন voltage-এর ব্যাটারি তুলনা | Wh = mAh × V ÷ ১০০০ | voltage দিয়ে গুণ করে মেলানো |
| UART-এ baud ÷ ৮ = byte/s | 8N1-এ ১০ বিট প্রতি byte | start/stop বিট গুনে দেখা |
| ADC-র ধাপে 2n আর 2n − 1 মিশিয়ে ফেলা | কোন নিয়ম, তা datasheet বা প্রশ্নে লেখা থাকে | দুই নিয়মেই হিসাব করে পার্থক্য দেখা |
| নির্দিষ্ট chip-এর register-এর ঠিকানা বা ঘুমের current বানিয়ে বলা | সেই chip-এর reference manual আর datasheet | নথি মিলিয়ে, তারপর multimeter বা power analyser দিয়ে মাপা |
AI-কে প্রশ্ন করার সময় অনুমানগুলো স্পষ্ট করে লিখতে বলুন:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- Voltage আর frequency দুটিই ২০% কমালে dynamic power কত গুণ? — ০.৮³ = ০.৫১২ গুণ, প্রায় অর্ধেক।
- Clock gating আর power gating-এর পার্থক্য? — প্রথমটি clock থামিয়ে dynamic power কমায়, দ্রুত; দ্বিতীয়টি supply কেটে leakage-ও কমায়, কিন্তু অবস্থা হারায় আর জাগতে সময় লাগে।
- Microcontroller আর microprocessor-এর পার্থক্য? — MCU-তে CPU, flash, SRAM, peripheral এক chip-এ; MPU-র মেমরি আর I/O বাইরে।
- ১০-bit ADC, Vref ৫ V — ধাপ কত? — ৫ ÷ ১০২৪ ≈ ৪.৮৮ mV.
- Real-time-এ cache কেন সমস্যা? — গড় দ্রুত করে, কিন্তু hit-miss-এর ওপর সময় ওঠানামা করে, তাই WCET প্রমাণ কঠিন।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১ফোনের chip-এ কেন একই রকম ৮টি core-এর বদলে বড় আর ছোট core মেশানো হয়? এই ধারণা কীভাবে এল, আর এর দাম কী?
২০০০-এর দশকের শেষে smartphone দ্রুত জনপ্রিয় হলো, আর নকশাকারেরা একটি দ্বিধায় পড়লেন। ব্যবহারকারী চান ওয়েবপেজ মুহূর্তে খুলুক, গেম মসৃণ চলুক — এর জন্য বড়, wide, out-of-order core লাগে। কিন্তু ফোনের বেশিরভাগ সময় কাটে হালকা কাজে: স্ক্রিন বন্ধ রেখে email sync, গান, notification. বড় core এই হালকা কাজেও প্রতি instruction-এ বেশি energy খরচ করে — তার বিশাল instruction window, বেশি register port আর অনুমানভিত্তিক কাজের কাঠামো সবসময় জ্বালাতে হয়। DVFS দিয়ে বড় core-কে ধীর করলেও তার “কাঠামোগত” খরচ পুরো যায় না, আর voltage floor-এর নিচে নামা যায় না (অংশ ৪)।
উত্তর এল দুই ধরনের core মিশিয়ে। ARM ২০১১ সালে big.LITTLE নামে এই ধারণা ঘোষণা করে — প্রথম দিকে একটি বড় core (Cortex-A15) আর একটি ছোট core (Cortex-A7) জোড়ায়, যারা একই ISA চালায়, তাই একটি কাজ যেকোনোটিতে চলতে পারে। প্রথম দিকের কিছু বাস্তবায়নে একসাথে শুধু এক দল চালু থাকত; পরে সব core একসাথে চালানো আর OS-কে প্রতিটি thread-এর জন্য আলাদা core বাছতে দেওয়া প্রচলিত হয়। প্রায় এক দশক পরে, ২০২১ সালের দিকে, Intel-এর ডেস্কটপ আর ল্যাপটপ chip-এও P-core আর E-core-এর মিশ্রণ আসে, আর Apple-এর নিজস্ব Mac chip-গুলোও (M-সিরিজ) শুরু থেকেই এমন মিশ্রণ ব্যবহার করে বলে জানা যায়।
দাম কম নয়। প্রথম, scheduler-কে বুঝতে হয় কোন thread “জরুরি” — ভুল করলে স্ক্রিনের সাড়া ধীর বা ব্যাটারি দ্রুত শেষ; কিছু chip তাই hardware থেকে OS-কে thread-এর আচরণের ইঙ্গিত দেয়। দ্বিতীয়, দুই ধরনের core-এর ISA-সুবিধা হুবহু এক রাখতে হয়, নাহলে প্রোগ্রাম মাঝপথে core বদলালে বিপদ। তৃতীয়, migration-এর খরচ: thread অন্য core-এ গেলে তার cache-এর উষ্ণ ডেটা পেছনে পড়ে থাকে।
মূল উপলব্ধি: একটি core সব কাজে দক্ষ হতে পারে না; energy-র যুগে “এক মাপে সবাই” নকশার বদলে বিশেষজ্ঞদের দল — আর কাকে কোন কাজ দেওয়া হবে সেই সিদ্ধান্তই নতুন কঠিন সমস্যা।
প্র ০২DVFS কীভাবে ল্যাপটপে এল, আর “race-to-idle” নিয়ে বিতর্ক কেন আজও পুরো মীমাংসা হয়নি?
১৯৯০-এর দশকের শেষে ল্যাপটপের ব্যাটারি একটি বড় অভিযোগ ছিল, আর CPU ছিল খরচের বড় অংশ। ২০০০ সালের আশেপাশে কয়েকটি প্রতিষ্ঠান প্রায় একই সময়ে ধারণাটি বাজারে আনে বলে জানা যায়: Intel-এর SpeedStep (শুরুতে মূলত বিদ্যুতে লাগানো বনাম ব্যাটারি — দুটি অবস্থা), AMD-র PowerNow!, আর Transmeta নামের একটি প্রতিষ্ঠানের LongRun, যা চলার সময়ে অনেক ঘন ঘন voltage-frequency বদলাত। পরে ACPI মানে P-state আর C-state-এর সাধারণ ভাষা দাঁড়ায়, আর OS-এর governor সেই ভাষায় সিদ্ধান্ত নিতে শেখে।
প্রথম দিকে সমীকরণটি সরল ছিল: dynamic power প্রধান, voltage অনেকটা নামানো যায়, তাই ধীরে চলাই ভালো — energy প্রতি কাজে V²-এর অনুপাতে কমে। কিন্তু অংশ ২-এ যেমন দেখেছেন, ছোট transistor-এ leakage বাড়ল আর voltage-এর নিচের সীমা (floor) ওপরে উঠে এল, কারণ threshold-এর খুব কাছে transistor নির্ভরযোগ্যভাবে কাজ করে না। ফলে নিচু frequency-তে voltage আর কমে না, শুধু f কমে — আর অংশ ৪-এর তৃতীয় সারির মতো, ধীরে চলা তখন শুধু leakage-এর সময় বাড়ায়। একই সময়ে গভীর C-state-এ power gating চলে এল, যেখানে ঘুমের power প্রায় শূন্য। এই দুই পরিবর্তন race-to-idle-কে অনেক ক্ষেত্রে আকর্ষণীয় করল।
তবু প্রশ্নটি খোলা, কারণ উত্তর নির্ভর করে workload আর প্ল্যাটফর্মের ওপর। কাজ যদি মেমরির জন্য অপেক্ষায় থাকে, CPU দ্রুত করলেও কাজ দ্রুত শেষ হয় না — তখন বেশি frequency শুধু অপচয়। স্ক্রিন, RAM আর radio-র মতো “পুরো system”-এর power চালু থাকলে দ্রুত শেষ করা লাভজনক। আবার খুব ঘন ঘন ছোট কাজ এলে গভীর ঘুমে ঢোকা-বেরোনোর খরচ লাভ খেয়ে ফেলে। এজন্য আধুনিক chip-এ hardware নিজেই মাইক্রোসেকেন্ডের মাপে চাপ দেখে সিদ্ধান্ত নেয় আর OS শুধু নীতি (“গতি না সাশ্রয়”) জানায়।
মূল উপলব্ধি: energy-র সঠিক কৌশল কোনো স্থায়ী নিয়ম নয়, বরং প্রযুক্তির কয়েকটি সংখ্যার (leakage, voltage floor, ঘুমের power, জাগার খরচ) ফল — সংখ্যা বদলালে উত্তরও বদলায়, তাই অনুমান লিখে হিসাব করাই একমাত্র নিরাপদ পথ।
প্র ০৩“হিসাব সস্তা, ডেটা আনা-নেওয়া দামি” — এই উপলব্ধি কম্পিউটার নকশাকে কীভাবে বদলে দিচ্ছে?
অনেক দশক ধরে নকশাকারেরা গতি মাপতেন operation গুনে — কত FLOP, কত instruction. ২০১৪ সালে Mark Horowitz-এর ISSCC বক্তৃতা আর তার energy-টেবিল (অংশ ৩) একটি অস্বস্তিকর সত্য সামনে আনে: একটি ৩২-bit যোগের energy একটি DRAM পড়ার তুলনায় নগণ্য — প্রায় দশ হাজার গুণের পার্থক্যের মাত্রায়। অর্থাৎ chip-এর বিদ্যুতের বড় অংশ হিসাবে নয়, তার ও মেমরির ভেতর দিয়ে বিট সরাতে যায়। Dennard scaling থামার পর (পর্ব ০২) energy-ই যখন গতির সীমা, তখন এই উপলব্ধি নকশার কেন্দ্রে চলে এল।
এর প্রভাব চারদিকে। প্রথম, বিশেষায়িত accelerator: Google-এর TPU-র মতো নকশায় systolic array ব্যবহৃত হয় বলে প্রকাশিত, যেখানে একবার আনা একটি সংখ্যা পাশের হিসাব-কোষে চলে যায় আর বহুবার ব্যবহৃত হয় — মেমরিতে বারবার না গিয়ে। দ্বিতীয়, ছোট সংখ্যা: AI-তে ৩২-bit-এর বদলে ১৬-bit, ৮-bit বা আরও ছোট — শুধু গুণ সস্তা নয়, অর্ধেক বিট সরাতে অর্ধেক energy. তৃতীয়, মেমরি কাছে আনা: chip-এর পাশে একই package-এ স্তূপ করা HBM মেমরি, আর মেমরির ভেতরে বা পাশে হিসাব (processing-in-memory) নিয়ে গবেষণা ও কিছু বাণিজ্যিক চেষ্টা। চতুর্থ, software-এর দিকে: পর্ব ৪৮-এর cache-বান্ধব প্রোগ্রাম — loop-এর ক্রম আর blocking — এখন শুধু গতি নয়, ব্যাটারিরও কৌশল।
Embedded জগতেও একই কথা আরও তীব্র: একটি sensor node-এ radio দিয়ে একটি byte পাঠানোর energy শত শত বা হাজার হাজার instruction চালানোর সমান হতে পারে (radio আর দূরত্বভেদে)। তাই node-এর ভেতরেই ডেটা ছেঁকে, গড় করে বা “কিছু বদলায়নি” হলে না পাঠিয়ে energy বাঁচানো প্রচলিত কৌশল — হিসাব দিয়ে যোগাযোগ কেনা। এই প্রবণতাকে কখনো কখনো “edge computing”-এর একটি যুক্তি হিসেবেও দেখানো হয়।
মূল উপলব্ধি: আধুনিক নকশায় প্রশ্ন “কত দ্রুত হিসাব” থেকে সরে “কত কম সরানো” হয়েছে — locality শুধু গতির বন্ধু নয়, energy-র মূল নীতি।
প্র ০৪বিমান, গাড়ি বা মহাকাশযানের নিয়ন্ত্রক chip প্রায়ই আজকের সবচেয়ে দ্রুত CPU-র চেয়ে অনেক সরল কেন? Watchdog-এর ভূমিকা কোথায়?
Hard real-time system-এ (অংশ ৮) প্রমাণ করতে হয় যে প্রতিটি কাজ সবচেয়ে খারাপ ক্ষেত্রেও deadline-এর আগে শেষ হবে। এর জন্য WCET বিশ্লেষণ লাগে — পরিমাপ করে, অথবা কোড আর hardware-এর মডেল ধরে স্থিরভাবে (static analysis) সবচেয়ে খারাপ পথ খুঁজে। এমন বিশ্লেষণের বাণিজ্যিক টুল আছে, আর বিমান-শিল্পের মতো ক্ষেত্রে সনদের প্রক্রিয়ায় এমন প্রমাণ গুরুত্বপূর্ণ বলে জানা যায়। কিন্তু hardware যত জটিল, মডেল তত কঠিন: cache-এর অবস্থা আগের সব প্রবেশের ওপর নির্ভর করে, out-of-order core-এ একটি miss কখনো লুকানো যায়, কখনো যায় না, আর multicore-এ অন্য core-এর ব্যস্ততায় ভাগ করা bus আর cache-এর সময় বদলায়। নিরাপদ থাকতে বিশ্লেষণকে ধরে নিতে হয় প্রায় সবই miss — ফল এত হতাশাজনক যে দ্রুত CPU-র সুবিধা প্রায় মুছে যায়।
তাই এমন ক্ষেত্রে প্রায়ই বেছে নেওয়া হয় সরল in-order pipeline, cache-এর বদলে নির্দিষ্ট সময়ের on-chip মেমরি বা cache-এর অংশ “lock” করে রাখা, আর কখনো একই কাজ দুটি core-এ একসাথে চালিয়ে ফল মিলিয়ে দেখা (lockstep) — ARM-এর Cortex-R পরিবারের মতো real-time core-এ এমন বৈশিষ্ট্য থাকে বলে জানা যায়। মহাকাশে বিকিরণের জন্য আরও বাড়তি সুরক্ষা লাগে, তাই সেখানকার chip প্রায়ই প্রজন্মের পর প্রজন্ম পুরোনো প্রযুক্তির, কিন্তু প্রমাণিত।
Watchdog এখানে শেষ নিরাপত্তা-জাল। একটি বিখ্যাত উদাহরণ ১৯৯৭ সালের NASA-র Mars Pathfinder: মঙ্গলে নামার পর যানটি বারবার নিজে নিজে reset হচ্ছিল। প্রকাশিত বিবরণ অনুযায়ী কারণ ছিল RTOS-এ priority inversion — একটি গুরুত্বপূর্ণ কাজ একটি কম গুরুত্বের কাজের ধরা resource-এর জন্য আটকে deadline ফসকাচ্ছিল, আর একটি timer তা ধরে system reset করছিল। Reset যানটিকে বাঁচিয়ে রাখে, আর পৃথিবী থেকে software-এর একটি সেটিং বদলে সমস্যা মেটানো হয়। Priority inversion-এর software-দিক OS কোর্সের real-time অংশে আছে।
মূল উপলব্ধি: নিরাপত্তা-জরুরি যন্ত্রে “গড়ে দ্রুত” নয়, “সবসময় সময়মতো আর প্রমাণযোগ্য” — আর সেই প্রমাণের সুবিধার জন্য ইচ্ছা করেই সরল hardware বেছে নেওয়া হয়, সাথে ভুল হলে উদ্ধারের জন্য watchdog.
প্র ০৫Microcontroller কীভাবে এত সস্তা আর সর্বব্যাপী হলো, আর বাংলাদেশের মতো দেশে শেখার ও কাজের জন্য এর অর্থ কী?
১৯৭০-এর দশকের শুরুতে Texas Instruments-এর TMS1000-কে প্রায়ই প্রথম দিকের বাণিজ্যিক microcontroller বলা হয় — CPU, ROM, RAM আর I/O এক chip-এ, ক্যালকুলেটর আর খেলনার জন্য। ১৯৭০-এর দশকের শেষে Intel-এর 8048 আর ১৯৮০ সালে 8051 আসে; 8051-এর স্থাপত্য এত জনপ্রিয় হয় যে বহু নির্মাতা দশকের পর দশক তার সংস্করণ বানিয়েছেন। ১৯৯০-এর দশকে Atmel-এর AVR আর Microchip-এর PIC chip-এর ভেতরে flash এনে প্রোগ্রাম বারবার মুছে লেখা সহজ করে। মূল অর্থনীতি: সবকিছু এক chip-এ মানে কম যন্ত্রাংশ, ছোট বোর্ড, কম দাম — আর লাখ লাখ ইউনিটে একটি chip-এর দাম খুব কমে আসে।
শেখার জগৎ বদলায় ২০০৫ সালের দিকে, যখন ইতালিতে Arduino প্রকল্প একটি সস্তা খোলা-নকশার বোর্ড আর সরল প্রোগ্রামিং পরিবেশ আনে — USB-তে লাগিয়ে কয়েক লাইনে LED জ্বালানো। পরে Wi-Fi-সহ সস্তা ESP8266 আর ESP32 শখের IoT-কে আরও সহজ করে, আর ২০২১ সালে Raspberry Pi Foundation নিজস্ব MCU RP2040 আনে। আজ ARM Cortex-M আর RISC-V-ভিত্তিক MCU খুব কম দামে পাওয়া যায়, আর RISC-V-এর খোলা ISA নতুন নির্মাতাদের লাইসেন্স-খরচ ছাড়া core বানাতে দেয়।
যেকোনো দেশের শিক্ষার্থী আর ছোট উদ্যোক্তার জন্য এর অর্থ — খুব কম খরচে hardware-এর হাতে-কলমে কাজ শেখা যায়। বাংলাদেশের প্রেক্ষাপটে উদাহরণ হিসেবে ভাবা যায় সেচের পাম্পের স্বয়ংক্রিয় নিয়ন্ত্রণ, মাছের পুকুরের পানির মান মাপা, সৌরশক্তিতে চলা যন্ত্রের নিয়ন্ত্রণ, বা ঘরের বিদ্যুৎ খরচ মাপা — এগুলো এই পর্বের প্রতিটি ধারণা (ADC, PWM, duty cycling, watchdog) একসাথে ব্যবহার করে। তবে একটি প্রোটোটাইপ আর মাঠে বছরের পর বছর টেকা পণ্যের মধ্যে বড় ফারাক: বর্ষার আর্দ্রতা, বিদ্যুতের ওঠানামা, বাজ পড়া, আর ব্যাটারির হিসাবের ভুল — নির্ভরযোগ্যতার অংশটিই আসল প্রকৌশল।
মূল উপলব্ধি: microcontroller একীভূতকরণ (integration) আর বিপুল উৎপাদনের ফল — আর এর সস্তা প্রাপ্যতা hardware শেখাকে সবার নাগালে এনেছে; কিন্তু একটি যন্ত্রকে নির্ভরযোগ্য পণ্য বানাতে লাগে এই পর্বের power আর সময়ের হিসাবের শৃঙ্খলা।
অনুশীলন
পরীক্ষার ধাঁচে লেখা — আগে খাতায় সমাধান করুন, তারপর উত্তর মিলিয়ে নিন।
-
Dynamic power-এর scaling: একটি processor ১.২ V আর ২.৪ GHz-এ ১০ W dynamic power আর ২ W leakage খরচ করে, আর একটি কাজ ১ সেকেন্ডে শেষ করে। (ক) V = ০.৯ V, f = ১.৮ GHz করলে dynamic power কত? (খ) Leakage voltage-এর সমানুপাতিক ধরলে নতুন leakage কত? (গ) কাজটির সময় আর মোট energy আগে ও পরে কত? (ঘ) Energy-র অনুপাত V²-এর অনুপাতের সমান হলো না কেন?
- (ক) P = ১০ × (০.৯/১.২)² × (১.৮/২.৪) = ১০ × ০.৫৬২৫ × ০.৭৫ = ৪.২১৮৭৫ W.
- (খ) ২ × (০.৯/১.২) = ১.৫ W.
- (গ) আগে: ১ s, energy = (১০ + ২) × ১ = ১২ J. পরে: সময় = ১ ÷ ০.৭৫ = ১.৩৩৩ s, energy = (৪.২১৮৭৫ + ১.৫) × ১.৩৩৩ = ৭.৬২৫ J.
- (ঘ) Dynamic অংশ ১০ J থেকে ১০ × ০.৫৬২৫ = ৫.৬২৫ J — ঠিক V²-এর অনুপাত। কিন্তু leakage-এর energy ২ J থেকে ১.৫ × ১.৩৩৩ = ২ J — একটুও কমেনি, কারণ leakage-এর power কমলেও সময় বেড়েছে। তাই মোট অনুপাত ৭.৬২৫ ÷ ১২ ≈ ০.৬৩৫, ০.৫৬২৫ নয়।
-
ব্যাটারির আয়ু: (ক) একটি smartwatch-এ ৩০০ mAh, ৩.৮ V ব্যাটারি। গড় খরচ ১৫ mW হলে কত ঘণ্টা ও দিন চলবে? সারাক্ষণ স্ক্রিন জ্বালিয়ে রাখার বিকল্পে আরও ১০ mW যোগ হলে? (খ) একটি sensor node প্রতি ৫ মিনিটে জেগে ২ সেকেন্ড ১০ mA আর ১ সেকেন্ড ১২০ mA টানে, বাকি সময় ১০ µA. গড় current কত? ২০০০ mAh-এর ৮০% ব্যবহারযোগ্য ধরলে কত দিন?
- (ক) Energy = ৩০০ × ৩.৮ ÷ ১০০০ = ১.১৪ Wh = ১১৪০ mWh. আয়ু = ১১৪০ ÷ ১৫ = ৭৬ ঘণ্টা ≈ ৩.১৭ দিন. ২৫ mW-এ: ১১৪০ ÷ ২৫ = ৪৫.৬ ঘণ্টা ≈ ১.৯ দিন.
- (খ) এক চক্রে charge = ২ × ১০ + ১ × ১২০ + ২৯৭ × ০.০১০ = ২০ + ১২০ + ২.৯৭ = ১৪২.৯৭ mA·s. Iavg = ১৪২.৯৭ ÷ ৩০০ ≈ ০.৪৭৬৬ mA. আয়ু = ১৬০০ ÷ ০.৪৭৬৬ ÷ ২৪ ≈ ১৩৯.৯ দিন — অংশ ৮-এর calculator-এর ৫ মিনিটের সারির সাথে মেলে।
-
ADC, PWM আর ফল আন্দাজ: (ক) ১০-bit ADC, Vref ৩.৩ V (ধাপ = Vref ÷ 2n). ধাপ কত? ১.২ V-এ code কত? Code ৫১২ কোন voltage? (খ) একটি ৮-bit timer ০ থেকে ২৫৫ গোনে (period ২৫৬ count), compare ৬৪, supply ৫ V. Duty আর গড় voltage কত? (গ) অংশ ৭-এর C simulation-এ
ON_TICKS = 1, OFF_TICKS = 4করলে ১২টি tick-এ কোন কোন tick-এ LED ON দেখাবে, আর শেষ লাইনে কী ছাপবে?- (ক) ধাপ = ৩.৩ ÷ ১০২৪ ≈ ৩.২২৩ mV. ১.২ ÷ ০.০০৩২২৩ ≈ ৩৭২.৩৬ → code ৩৭২. Code ৫১২ → ৫১২ × ৩.৩ ÷ ১০২৪ = ১.৬৫ V.
- (খ) Duty = ৬৪ ÷ ২৫৬ = ২৫%; গড় = ০.২৫ × ৫ = ১.২৫ V.
- (গ) শুরুতে CMP = ৪, তাই tick ৪-এ প্রথম event: LED ON, CMP = ১. Tick ৫-এ আবার event: LED off, CMP = ৪. তারপর tick ৯-এ ON, tick ১০-এ off. তাই LED ON দেখাবে শুধু tick ৪ আর ৯-এ। শেষ লাইন:
duty = 1/5 = 20%.
-
Energy-delay তুলনা: একটি কাজ দুই নকশায়: X — ৫ W-এ ০.৫ সেকেন্ড; Y — ১.৫ W-এ ১ সেকেন্ড। (ক) প্রতিটির energy, perf/W (কাজ প্রতি joule), EDP আর ED²P বের করুন। (খ) ঘড়ির ব্যাটারি বাঁচাতে কোনটি বাছবেন, আর ব্যবহারকারীর স্পর্শে সাড়া দিতে কোনটি? (গ) X-এর পরে বাকি ০.৫ সেকেন্ড ০.১ W-এ ঘুমালে, ১ সেকেন্ডের জানালায় X আর Y-এর মোট energy তুলনা করুন।
- (ক) X: E = ৫ × ০.৫ = ২.৫ J, perf/W = ১ ÷ ২.৫ = ০.৪, EDP = ২.৫ × ০.৫ = ১.২৫ J·s, ED²P = ২.৫ × ০.২৫ = ০.৬২৫. Y: E = ১.৫ J, perf/W ≈ ০.৬৬৭, EDP = ১.৫ J·s, ED²P = ১.৫.
- (খ) ব্যাটারি (শুধু energy) — Y, ১.৫ J < ২.৫ J. স্পর্শের সাড়া (গতি গুরুত্বপূর্ণ) — X, EDP আর ED²P দুটিতেই কম।
- (গ) X: ২.৫ + ০.১ × ০.৫ = ২.৫৫ J; Y: ১.৫ J. এখানে race-to-idle হারে, কারণ X-এর power (৫ W) Y-এর তিন গুণের বেশি অথচ গতি মাত্র দ্বিগুণ — অর্থাৎ X প্রতি cycle-এ অনেক বেশি energy নেয় (বেশি voltage বা বড় core-এর কারণে)।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমব্যাটারিচালিত একটি sensor node-এর এক চক্রের ঘটনাগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- RTC timer-এর interrupt গভীর ঘুম থেকে MCU-কে জাগায়
- Sensor-এ power দিয়ে তার মান স্থির হওয়া পর্যন্ত অপেক্ষা করা
- ADC দিয়ে sensor-এর voltage মেপে সংখ্যায় রূপান্তর
- Radio চালু করে মাপটি পাঠানো, তারপর radio বন্ধ
- Watchdog খাইয়ে, পরের জাগার সময় ঠিক করে আবার গভীর ঘুম
একটি chip-এর supply voltage আর clock frequency দুটিই ১৫% কমানো হলো (activity factor আর capacitance অপরিবর্তিত)। Dynamic power আগের প্রায় কত গুণ হবে?
- ০.৮৫ গুণ
- ০.৭২ গুণ
- ০.৬১ গুণ
- ০.৫২ গুণ
একটি ফোনের ব্যাটারি ৫০০০ mAh, nominal voltage ৩.৮৫ V. এর energy কত, আর গড়ে ১.৫ W খরচে প্রায় কত ঘণ্টা চলবে?
- ৫০০০ Wh, ৩৩৩৩ ঘণ্টা
- ১৯.২৫ Wh, প্রায় ১২.৮ ঘণ্টা
- ৫ Wh, প্রায় ৩.৩ ঘণ্টা
- ১৯২৫০ Wh, প্রায় ১২৮৩৩ ঘণ্টা
Clock gating আর power gating সম্পর্কে কোন কথাটি সঠিক?
- Clock gating leakage প্রায় শূন্য করে, power gating শুধু dynamic power কমায়
- দুটিতেই register-এর বিষয়বস্তু হারিয়ে যায়
- Power gating থেকে জাগা clock gating-এর চেয়ে দ্রুত
- Clock gating dynamic power কমায়; power gating leakage-ও কমায় কিন্তু জাগতে বেশি সময় লাগে
একটি ১২-bit ADC-র reference voltage ৩.৩ V (ধাপ = Vref ÷ 2n). ২.০ V input-এ ADC কোন code দেবে (নিচের দিকে কেটে)?
- ২৪৮২
- ২০৪৮
- ৬২০
- ৬২০.৬
৩.৩ V supply-তে একটি PWM সংকেতের duty cycle ২৫%. LED বা মোটর যে গড় voltage “দেখে”, তা কত?
- ৩.৩ V
- ০.৮২৫ V
- ১.৬৫ V
- ২.৪৭৫ V
একটি sensor node প্রতি ৬০০ সেকেন্ডে ৩ সেকেন্ড জাগে: ২ সেকেন্ড ১০ mA আর ১ সেকেন্ড ১২০ mA; বাকি ৫৯৭ সেকেন্ড ০.০১ mA. গড় current প্রায় কত?
- ১২০ mA
- প্রায় ৪৩ mA
- প্রায় ০.২৪ mA
- ০.০১ mA
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Power বনাম energy: W = প্রতি সেকেন্ডে, J = W × s; ব্যাটারি energy রাখে — Wh = mAh × V ÷ ১০০০; আয়ু ≈ mAh ÷ গড় mA. ব্যাটারির জন্য প্রতি কাজের energy, তাপের জন্য power.
- দুই খরচ: Pdyn ≈ α·C·V²·f (V আর f ১৫% কমালে ≈ ০.৬১×), Pstatic ≈ V × Ileak; ডেটা আনা-নেওয়া হিসাবের চেয়ে বহু গুণ দামি।
- কৌশল: DVFS (P-state), clock gating (dynamic), power gating (leakage), C-state (গভীর ঘুম, ধীর জাগা), big.LITTLE; race-to-idle জেতে যখন voltage নামানো যায় না। তুলনায় perf/W, EDP = E × D, ED²P.
- Microcontroller: CPU + flash + SRAM + peripheral এক chip-এ, memory-mapped register; GPIO-তে SET/CLR, PWM-এ Vavg = duty × V, ADC ধাপ = Vref ÷ 2n; UART 8N1-এ byte/s = baud ÷ ১০.
- Embedded-এর শর্ত: real-time-এ WCET, তাই সরল ও পূর্বানুমানযোগ্য hardware; ব্যাটারিতে duty cycling — Iavg = Σ(I × t) ÷ T, ঘুমের µA আর radio-র সময়ই আয়ু ঠিক করে; watchdog শেষ রক্ষা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৫৭ · ক্যাপস্টোন — একটি RISC-V CPU simulator বানানোপরবর্তী পর্বমডিউল ৯-এর শেষ প্রজেক্ট।
- পর্ব ০২ · ইতিহাস আর প্রবণতা — ENIAC থেকে আজকের chip, Moore-এর সূত্র আর power wallভিত্তিDennard scaling আর power wall-এর ইতিহাস।
- পর্ব ৫২ · Interrupt আর DMA — hardware-এর দিক থেকেসম্পর্কিতPeripheral কীভাবে CPU-কে জাগায়।
- কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক · কোর্স হোম৬২টি পর্বলজিক গেট থেকে pipeline আর cache — পুরো রোডম্যাপ।
- Operating Systems · মোবাইল আর embedded OSপাশের ট্র্যাকGovernor, Doze, wake lock আর RTOS-এর software দিক।
- C প্রোগ্রামিং · Embedded Cপাশের ট্র্যাকvolatile, register আর bit manipulation দিয়ে hardware চালানো।