📖 Scenario: You are working on a simple embedded system that needs to start correctly when powered on or reset. The system uses a reset vector to jump to the startup code, which initializes the system before running the main program.
🎯 Goal: Build a basic embedded C program that defines a reset vector and a startup sequence function. The startup sequence will initialize a variable and then call the main function. This simulates how embedded systems begin running after a reset.
📋 What You'll Learn
Define a reset vector function named Reset_Handler
Create a startup function named Startup_Code that initializes a variable system_ready to 1
Call the main function from the startup code
Define a main function that returns 0
Print the value of system_ready in main to confirm initialization
💡 Why This Matters
🌍 Real World
Embedded systems like microcontrollers use reset vectors and startup sequences to prepare hardware and software before running the main application.
💼 Career
Understanding startup sequences and reset vectors is essential for embedded software engineers working on firmware for devices like IoT gadgets, automotive controllers, and consumer electronics.
Progress0 / 4 steps
1
Create the system_ready variable
Create a global integer variable called system_ready and set it to 0.
Embedded C
Hint
Use int system_ready = 0; to create the variable.
2
Define the Startup_Code function
Define a function called Startup_Code that sets system_ready to 1 and then calls the main function.
Create a function called Reset_Handler that calls the Startup_Code function.
Embedded C
Hint
Write void Reset_Handler() { Startup_Code(); }.
4
Define the main function and print system_ready
Define the main function that prints the value of system_ready and returns 0.
Embedded C
Hint
Use printf("system_ready = %d\n", system_ready); inside main.
Practice
(1/5)
1. What is the primary role of the reset vector in an embedded C program?
easy
A. It manages power consumption modes.
B. It initializes all global variables to zero.
C. It handles interrupts during program execution.
D. It tells the microcontroller where to start executing code after a reset.
Solution
Step 1: Understand the reset vector concept
The reset vector is a special address in memory that points to the first instruction executed after a reset.
Step 2: Identify its role in program start
When the microcontroller resets, it jumps to the reset vector to begin running the startup code.
Final Answer:
It tells the microcontroller where to start executing code after a reset. -> Option D
Quick Check:
Reset vector = start address after reset [OK]
Hint: Reset vector points to start code after reset [OK]
Common Mistakes:
Confusing reset vector with interrupt vector
Thinking reset vector initializes variables
Assuming reset vector manages power modes
2. Which of the following is the correct way to declare the reset vector in embedded C?
easy
A. int ResetVector = 0x0000;
B. void ResetVector() { main(); }
C. void (* const ResetVector)(void) __attribute__((section(".reset_vector"))) = Reset_Handler;
D. char *ResetVector = "Reset_Handler";
Solution
Step 1: Understand reset vector declaration
The reset vector is usually a pointer to a function placed in a special memory section.
Step 2: Check syntax correctness
void (* const ResetVector)(void) __attribute__((section(".reset_vector"))) = Reset_Handler; correctly declares a constant function pointer to Reset_Handler placed in the ".reset_vector" section using GCC attribute syntax.
Final Answer:
void (* const ResetVector)(void) __attribute__((section(".reset_vector"))) = Reset_Handler; -> Option C
Quick Check:
Function pointer in reset vector section = correct declaration [OK]
Hint: Reset vector is a function pointer in special section [OK]
Common Mistakes:
Declaring reset vector as int or char pointer
Defining reset vector as a function instead of pointer
Missing section attribute for placement
3. Given the following code snippet, what will be the output after reset?
void Reset_Handler(void) {
int x = 5;
x += 10;
while(1) {}
}
void (* const ResetVector)(void) __attribute__((section(".reset_vector"))) = Reset_Handler;
medium
A. The program will enter an infinite loop after setting x to 15.
B. The program will run main() and print 15.
C. The program will cause a runtime error due to missing main.
D. The program will reset repeatedly.
Solution
Step 1: Analyze Reset_Handler behavior
Reset_Handler sets x to 5, adds 10 making x = 15, then enters an infinite loop.
Step 2: Understand program flow after reset
After reset, the microcontroller jumps to Reset_Handler and stays in the infinite loop; no main() is called.
Final Answer:
The program will enter an infinite loop after setting x to 15. -> Option A
Quick Check:
Reset_Handler runs then loops forever = infinite loop [OK]
Hint: Reset_Handler runs then loops forever, no main called [OK]
Common Mistakes:
Assuming main() is called automatically
Expecting output or print statements
Confusing variable x scope and effect
4. Identify the error in this startup code snippet:
void Reset_Handler(void) {
// Initialize data
extern int _sidata, _sdata, _edata;
int *src = &_sidata;
int *dst = &_sdata;
while(dst < &_edata) {
*dst++ = *src++;
}
main();
}
void (* const ResetVector)(void) __attribute__((section(".reset_vector"))) = Reset_Handler;
medium
A. Reset_Handler should not call main() directly.
B. The pointers _sidata, _sdata, _edata should be declared as extern char, not int.
C. The while loop condition should use <= instead of <.
D. ResetVector should not be a function pointer.
Solution
Step 1: Check pointer types for memory copy
Memory sections like _sidata, _sdata, _edata represent byte addresses and should be pointers to char or unsigned char, not int.
Step 2: Understand pointer arithmetic impact
Using int pointers causes incorrect copying because pointer arithmetic advances by sizeof(int), skipping bytes.
Final Answer:
The pointers _sidata, _sdata, _edata should be declared as extern char, not int. -> Option B
Quick Check:
Memory pointers for data init = char* not int* [OK]
Hint: Use char pointers for memory copy in startup [OK]
Common Mistakes:
Using int pointers for byte-wise memory copy
Changing loop condition incorrectly
Thinking main() call is wrong here
5. You want to create a startup sequence that initializes .data and .bss sections and then jumps to main(). Which of the following code snippets correctly implements this in embedded C?