Question bank — Startup code — vector table, reset handler, stack initialization
5.5.16 · D5· Coding › Embedded Systems & Real-Time Software › Startup code — vector table, reset handler, stack initializa
Shuru karne se pehle, teen plain-word reminders taaki neeche koi bhi term unexplained na rahe:
Sach ya jhooth — justify karo
Cortex-M vector table ki har entry ek function pointer hai jis par CPU jump kar sakta hai.
Reset handler ko main() se pehle run karna zaroori hai kyunki C standard ek aisa environment assume karta hai jo main() khud apne liye nahi bana sakta.
int g=42; assume karta hai ki g mein pehle se 42 hai aur int z; assume karta hai ki z 0 hai, lekin main ke apne code mein kuch bhi .data copy nahi karta ya .bss clear nahi karta; woh kaam pehle se complete hona chahiye jab main start ho.Ek full-descending stack par, koi value push karte waqt pehle value likhi jaati hai, phir stack pointer decrement hota hai.
_estack RAM ka lowest address hota hai.
_estack highest RAM address + 1 (end) hota hai, kyunki ek descending stack upar se start hota hai aur heap ki taraf neeche grow karta hai.Agar tum .bss zero kar do lekin .data copy karna bhool jao, toh program phir bhi sahi behave karta hai.
int g=42; jaise initialized globals Flash-time garbage read karenge (power-up par RAM mein jo kuch bhi tha), kyunki kisi ne bhi 42 unke RAM slot mein nahi daala..bss variables ke liye Flash image mein zeros store karna harmless hoga, bas thoda wasteful.
.bss ko "clear at runtime" define kiya gaya hai na ki "load from Flash."Vector table sirf address 0x00000000 par hi reh sakta hai.
Agar main() return kare, toh execution cleanly ruk jaata hai.
main se return karna undefined memory mein chala jaata hai. Reset handler while(1){} ke saath khatam hota hai taaki us case ko deliberately trap kiya ja sake.Error dhundho
void (*vt[])(void) = { Reset_Handler, &_estack, ... }; — is ordering mein kya galat hai?
&_estack hona chahiye aur word 1 mein Reset_Handler. Jaise likha hai, hardware ek code address MSP mein load karta hai aur ek stack address par jump karta hai jaise woh code ho — instant fault.Ek student vector_table ko .isr_vector ki jagah .data mein rakhta hai. Chip kabhi boot kyun nahi karta?
.data RAM mein rehta hai aur sirf reset handler ke dwara populate hota hai — lekin hardware vector table ko uski fixed boot location se koi bhi code run hone se pehle padhta hai, isliye reset par woh table wahan hoti hi nahi. Use boot address par Flash mein rehna chahiye.Copy loop padhta hai while (dst < &_edata) *dst++ = *src++; lekin src ko &_sidata ki jagah &_sdata se initialize kiya gaya tha. Kya break hota hai?
.data variables mein jo bhi undefined RAM pehle se tha wahi rehta hai — Flash ki initial values kabhi use nahi hoti.for (dst=&_sbss; dst < &_ebss; ) *dst++ = 0; ko dst < &_ebss; dst++ header mein aur *dst = 0; body mein likhne se replace kiya jaata hai. Koi bug hai?
for header mein likha hai body ki jagah. Dono .bss ke har word par chalta hai aur 0 store karta hai; sirf dhyan rakho ki increment accidentally double na ho.Koi reset vector ko seedha main par set karta hai "ek jump bachane ke liye." Kya silently break hota hai?
.data kabhi copy nahi hota aur .bss kabhi clear nahi hota, isliye initialized globals mein garbage aur zero-init globals mein random RAM rehta hai — C ke startup guarantees quietly violate ho jaate hain chahe code compile aur link ho jaaye (dekho crt0 note).__libc_init_array() ko .data copy loop se pehle call kiya jaata hai. Yeh kyun dangerous hai?
.data abhi copy nahi hua, toh woh constructors garbage dekhenge. Environment setup (.data/.bss) kisi bhi constructor ke run hone se pehle complete hona chahiye.Why questions
Hardware stack pointer ko pehle kyun load karta hai, pehle instruction fetch karne se pehle?
CPU ko sahi handler dhundne ki jagah vector table kyun use ki jaati hai?
table[n] pick karta hai, jo fastest possible, fully-deterministic dispatch deta hai bina kisi scanning ke, jo real-time code demand karta hai.Global variables jinhe init values chahiye, woh values Flash mein kyun rakhte hain RAM ki jagah?
.bss-clear missing hona classic "heisenbug" kyun hai?
Bare-metal MCU par stack overflow usually ek clean error kyun nahi hota?
.bss aur heap ko overwrite karta hai; corruption baad mein ek door, unrelated symptom ke roop mein surface hoti hai na ki immediate fault ke roop mein.Vector table array ko const kyun declare karna chahiye?
const table RAM mein land karega aur reset par jab hardware use padhega tab woh wahan hogi hi nahi — plus uske addresses kabhi change nahi hote, isliye RAM waste hoga.Hardware registers ko early init ke dauran volatile mark karte hain lekin wahi idea .data copy loop mein kyun nahin chahiye?
Edge cases
Agar .data empty ho (koi initialized globals nahi) toh kya hoga?
_sdata == _edata, isliye copy loop ki condition immediately false hai aur woh zero times run karta hai — bilkul sahi, koi special case nahi chahiye.Agar .bss empty ho toh?
_sbss == _ebss, zeroing loop zero iterations run karta hai, aur kuch clear nahi hota kyunki clear karne ke liye kuch hai hi nahi — loop gracefully degenerate ho jaata hai.Agar _sidata (Flash source) word-aligned nahi hai lekin tum uint32_t* se copy karte ho toh kya hoga?
Agar reset handler ke dauran, uske handler address likhe jaane se pehle, koi peripheral interrupt fire kare, toh kya govern karta hai outcome?
.data/.bss) abhi initialized nahi ho sakti, isliye setup complete hone tak interrupts typically disabled rakhe jaate hain.Agar linker script mein RAM size chip ke actually hai usse zyada declare ki ho toh kya hoga?
_estack real memory ke baad point karta hai; pehla stack push ek non-existent address par likhta hai, bus fault ya silent loss cause karta hai — linker yeh detect nahi kar sakta, isliye script mein RAM size datasheet se match karni chahiye.Jis exact moment par main() enter hoti hai, stack kitne bytes grow kar chuka hota hai?
_estack se kuch words neeche hota hai — stack essentially empty hai, main ke locals ke liye upar se neeche descend karne ke liye ready.Recall Self-check: teen jo tumhe bina dekhhe answer karne chahiye
Vector table ka word 0 vs word 1? ::: Word 0 = initial MSP (stack-top value); word 1 = Reset_Handler address (PC mein jaata hai).
Copy-then-zero order aur kyun? ::: .data ko Flash se RAM mein copy karo, phir .bss clear karo; dono main ya kisi bhi constructor ke run hone se pehle complete hone chahiye taaki C ke global guarantees hold karein.
_estack RAM ke high end par kyun hota hai? ::: Stack full-descending hai, isliye woh upar se start hota hai aur heap ki taraf neeche grow karta hai, ek well-defined collision failure mode deta hai.