CS452 - Real-Time Programming - Spring 2012

Lecture 8 - Create, Initialization

Pubilc Service Annoucements

  1. Due date for assignment 1
  2. Victoria Day holiday

Initializing the Kernel

Set up the Hardware

  1. busy-wait io
  2. low memory
  3. Turn off interrupts in the ICU

Prepare the Kernel Data Structures

Where is the kernel's stack pointer, right now? What does the stack look like?

The kernel data structures

  1. an array of empty ready queues
  2. a poimter to the TD of the active task
  3. an array of TDs
  4. a free list of pointers to free TDs

Prepare the Memory to be Used by Tasks

  1. task memory

Create the First User Task

Can run with interrupts turned off for now (belt and braces) but will need to be turned on later.

Reminder. The place where the kernel starts executing has the global name main, which cannot be re-used.

Creating a Task

In creating a task you have to do two things

  1. Get and initialize resources needed by the task
  2. Make the task look as if it had just entered the kernel

Things you need to do

Allocate resources

Get an unused TD and unused memory for its stack

Initialize resources

Mostly filling in fields in the TD. Here are the ones that ought to be in the TD.

  1. task id
  2. priority
  3. stack pointer
  4. parent tid
  5. state
  6. install in the ready queues

This looks like six words, which could be squeezed into fewer. (There will be more later.)

Here are the ones that could be in the TD, or could be on the stack.

  1. SPSR
  2. link register
  3. return value

Initialize the stack

Here's something I always do.

The Create Function

You also need a int Create( int priority, void (*code) ( ) ) function to call from user tasks.

Although it's no more than a wrapper there are a few problems to solve.

  1. Passing arguments
  2. Jumping into the kernel
  3. Getting the return value from the kernel and returning it.

Other Primitives

These primitives exist mostly so that we, which includes you, can ensure that task creation and scheduling are working when there is not much else implemented.

Tid MyTid( )


A question, to which there is a correct answer, or more specifically, a correct (answer, reason) pair.

Tid MyParentTid( )


Where is the parent Tid, and how does the kernel find it?

void Pass( )

Doesn't block: task calling Pass( ) remains ready to execute.

Does reschedule.

When is Pass( ) a NOP?

void Exit( )

Calling task is removed from all queues, but its resources are not reclaimed or reused.

That is, the task goes into a zombie state, in which it cannot be active or ready, but continues to own all its resources.

How Should Execution Terminate?


When there are no tasks left on the ready queues, it goes back to RedBoot.

Return to: