Lesson X

Executable Format and Boot Loader


C vs. C++


Typically, C design pattern to create a re-usable module is performed like so:

typedef struct {
  int target_ms;
  int interval_ms;
} timer_t;

void timer_start(timer_t *t, uint32_t interval);

void timer_stop(timer_t *t);

bool timer_expired(timer_t *t);

On the other hand, C++ for the same module would be:

class timer
    void start(uint32_t interval);
    void stop();
    bool expired();
    int target_ms;
    int interval_ms;

Code analysis

void main(void)
   * C convention:
   *   object_method(&obj)
   * Then you pass the object as the first parameter to the methods to "operate on" this object
  timer_t t;
  timer_start(&t, 1000);
  timer_stop (&t);
   * C++ convention:
   *  obj.method()
   * C++ automatically passes the object pointer, known as the "this"  pointer to the method
   * In reality, the language and the compiler is invoking the methods just like C:
   *    timer::start(&obj, 1000);
  timer t;

Volatile Variable


// volatile 
int flag; // global memory is part of "BSS" section, guaranteed to be zero (unless a bug in startup code)

void flag_setter_task(void *p) {
  while (1) {

void flag_checker_task(void *p) {
  puts("Task entry");

  while (1) {
    flag = 0;
    while (0 == flag) {

    puts("flag has incremented away from value of 0");

Interview Questions

  • What is a volatile keyword?
  • Given a code snippet, why you cannot set a breakpoint?
  • Is const opposite of volatile?
  • What is the point of "const volatile *variable" ?
    • You as a programmer, cannot write a line of code to modify, but maybe DMA or a peripheral behind you can modify it

Random Topics

Useful topics to learn about:

  • Avoid dynamic memory after RTOS starts
    • Avoiding task deletions
  • APIs to avoid in FreeRTOS
  • How much sleep time will vTaskDelay(1) actually sleep the task?
  • Clock system review
    • Peripheral clock divider
    • CPU PLL