The Simple Scheduler in
Embedded System
A simple scheduler module implemented in C
StarNight @ OSDC.TW 2014
Who am I?
潘建宏 / Jian-Hong Pan (StarNight)
About Me : http://about.me/StarNight
出沒在~
GitHub : starnight
PTT : zack2004
plurk : StarNight
Facebook : Jian-Hong Pan
目前繼續在種花店當個打雜園丁 ~
Outline
● History
● OS concepts learned from textbooks
● Process & Scheduler
● What if …
● Simple Scheduler
● Simple Oscilloscope
很久很久以前~
Long Long time ago ~
很久很久以前~
Long Long time ago ~
There is a robot in every boy’s mind ~
每個男孩心中,
都有一個機器人~
There is an operating system in every
computer scientist’s mind ~
上了大學之後,
同學告訴我每位資工人的
心中都有個 OS OS ~
However, I am graduated from
department of mechanical engineering ~
但我是機械系畢業的~
For the expectation in my childhood, not only
I attended the required classes, but also I sat
in the operating system class ~
為了男孩心中的機器人
所以除了本科外,我旁聽 ~
上課也可
以很熱血
!!!
Reference from internet
欠的總是要還~
其實就是因為旁聽沒繳作業,
所以畢業三年多後,
要補寫作業跟老師謝罪 XD
My First Impression of OS
Operating
System
Input Output
keyboard
mouse
microphone
touchpad
comunication (in)
...
screen
headset
comunication (out)
...
There could be an OS in a robot, too!
Operating
System
Input Output
GPI
sensors
command (in)
comunication (in)
...
GPO
motors
command (out)
comunication (out)
...
Thinking furthermore
Apps
Operating
System
Input Output
drivers scheduler etc ...
ETC
ready
queue
data
structure
Simple Data Structure @
lightning talk COSCUP 2013
Data
Text
Heap
Stack
max
base 0
Process in Memory
Temporary data
Dynamic allocated
memory
Global variables
Program code
Reference: Figure 3.1 of Operating System Concept, 8th
Usual Diagram of Process State
new
ready
terminated
running
Waiting
admitted exit
interrupt
scheduler dispatch
I/O or event wait
I/O or event
completion
Reference: Figure 3.2 of Operating System Concept, 8th
Process Control Block (PCB)
Process State
Process Number
Program Counter
Registers
Memory Limits
List of Open Files
Reference: Figure 3.3 of Operating System Concept, 8th
Scheduling when 4 Events Occurs
new
ready
terminated
running
Waiting
admitted exit
interrupt
scheduler dispatch
I/O or event wait
I/O or event
completion
Reference: Figure 3.2 of Operating System Concept, 8th
1
2
34
For Multitasking
For Multiprogramming
Scheduling Algorithms
● First-Come, First-Served (or FIFO)
● Round Robin
● Shortest Job First
● Shortest Remaining Time First
● Priority Scheduling
● Multilevel Queues
What if ...
● The scheduled job (process) is as small &
simple as a function, even is a function.
● Because of being small, the job will not be
interrupted by timeout.
● Because of being simple, the job will not wait
for the I/O or event. There is another job for
I/O or event completion.
Running Waiting Ready
Before
I/O or event
During
I/O or event
After
I/O or event
Compare Jobs’ Status Changing
Job #1 Job #2 Job #3
General
Simple
Scheduler
Time
ToDoAsync DoAsync AfterAsync
In other words
● Break a single process into several jobs.
● Each job will not be interrupted.
● A job terminate immediately if it is finished.
● Do not save job’s state during context
switching.
This is not new idea
Related concepts:
● Functional programming
● Asynchronous function in Javascript
● Events of GUI programs
● Function pointer in C
ToDoAsyncFunc(pArgument, pAfterFunc)
How do it keep the jobs until they
are executed?
Save the jobs in somewhere,
maybe a queue.
How about make it like the ready queue
of scheduler !?!?
What is Simple Scheduler
● Simple Scheduler does "First In, First Out"
(FIFO) scheduling works with no priority and
non-preemptive scheduling scheme.
● It is the "Functions", which could also be
called callback functions or jobs, that Simple
Scheduler schedules.
You can have it from
GitHub → StarNight → simple scheduler
https://github.com/starnight/simple-scheduler
PS. Wiki included
Job’s State in Simple Scheduler
new
ready
terminated
running
admitted exit
scheduler dispatch
Ready Queue
interrupt
scheduler dispatch
Waiting
I/O or event wait
I/O or event
completion
Small & non-preemptive
Simple &
non-blocking I/O
Job’s State in Simple Scheduler
new
ready
terminated
running
scheduler dispatch
Ready Queue
admitted exit
Do scheduling
Timing Diagram
Job #1 Job #2
Ready Queue:
First In, First Out (FIFO)
Timing Diagram
Job #1 Job #2
Ready Queue:
Job #1
Timing Diagram
Job #1 Job #2
Ready Queue:
Job #1 admits one Job #2Job #2
Job #2
Timing Diagram
Job #2 Job #2
Ready Queue:
Timing Diagram
Job #2 Job #2
Ready Queue:
Job #2
Timing Diagram
Job #2
Ready Queue:
Timing Diagram
Job #2
Ready Queue:
An interrupt occurs during scheduling
Timing Diagram
Job #2
Ready Queue:
The interrupt admits one Job #3
Job #3
Job #3
Timing Diagram
Job #2
Ready Queue:
Job #3
Timing Diagram
Job #2 Job #3
Ready Queue:
Job #2
Timing Diagram
Job #2
Ready Queue:
Job #3
Another interrupt occurs
during Job #2 executing
Timing Diagram
Job #2
Ready Queue:
Job #3
The interrupt admits one Job #1
Job #1
Job #1
Timing Diagram
Job #2 Job #1
Ready Queue:
Job #3
Timing Diagram
Job #3
Ready Queue:
Job #1
Timing Diagram
Job #1
Ready Queue:
Job #3
Job #3
Timing Diagram
Ready Queue:
Job #1
Timing Diagram
Ready Queue:
Job #1
Job #1
Timing Diagram
Job #1
Ready Queue:
Job #1 admits
one Job #2
Job #2
Job #2
Timing Diagram
Job #2
Ready Queue:
Timing Diagram
Job #2
Ready Queue:
Job #2
Timing Diagram
Ready Queue:
Timing Diagram
Ready Queue:
When does it admit job?
● Booting (Before scheduler start to run)
● A Job is running
● During interrupt
哥schedule的不是Process, 是Function
It is the functions, not the processes, that
simple scheduler schedules.
typedef void (*SS_CB)(void *);
● The job could be pass one parameter's
pointer or NULL representing no parameter.
● The pointer of the parameter could be a
native variable pointer or even a struture
pointer.
Prototype of the Scheduled Function
/* Packaged callback function (PCB). */
typedef
struct _SS_PACKAGED_CALLBACK {
SS_CB cb;
void *p;
} SS_PCB;
PCB Structure Type
● cb : The callback function pointer
of the job.
● p : The argument pointer going
to be passed into the job.
Ready Queue
PCB of Job #3
PCB of Job #2
PCB of Job #1
FI
FO
PCB vs PCB
Process State
Process Number
Program Counter
Registers
Memory Limits
List of Open Files
SS_CB cb
Callback function pointer
void *p
Parameter pointer
for the callback function
Original PCB Simple Scheduler PCB
Public Functions
● SSInit : Initial the scheduler.
● SSAdmitJob : Admit a job (callback function) into
the ready queue.
● SSMainLoop : Main loop for system scheduling.
● SSBreak : Break scheduling.
● SSConsumeLeft : Consume left jobs in ready queue.
● SSDebug : Have the debug information of the
scheduler.
SSBreak(BC)
SSBreak(B)
Scheduler’s State in Simple Scheduler
Boot
Run
Break &
Consume Left
SSConsumeLeft(n) or
SSBreak(BC)
SSBreak(B)
Break
B: SS_BREAKSCHEDULING
BC: SS_BREAKANDCONSUMELEFT
SSMainLoop()
有了
Simple Scheduler
那就用用看吧!
ADC & UART & Timer Labs
+
Scheduler
實作一個窮到只剩下 $$
Scheduler的OS kernel
Simple OS for Simple Oscilloscope
https://github.com/starnight/Simple-Oscilloscope
樸實無華 X 極簡
As simple as possible ~
Architecture
Scheduler
Direvers Timer
App #1 App #N
Kernel
User
Fill Modules into Architecture
Simple Scheduler
ADC
USART
SysTimer
ADCSample
Process
Kernel
User
Timer
USARTCommunicate
MODBUS - like
Platform
Dependent
Drivers
Usage of Simple Scheduler
● SSInit()
● Admit leading jobs, ex: Wait command job.
● SSMainLoop()
● Interrupts admit jobs
○ USART RX:
■ Admits a job when predefined RX queue is full.
○ USART TX:
■ Admits a job when predefined TX queue is empty.
Usage of Simple Scheduler (Cont.)
● Jobs admit jobs (Ex: Modbus-like package)
○ Wait Commad:
■ Admits a wait command job if there is no command.
■ Admits a check station job if there is a command.
○ Check station job:
■ Admits a wait command job if not matched address.
■ Parses commad and admits a corresponding job.
○ Corresponding job:
■ ...
Simple Oscilloscpe - MCU Side
Simple Oscilloscpe - Wave Gen. Side
MCU Side
ATMega328P
Wave Generator Side
Oscilloscope Console by python + pyserial + matplotlib
畢業之後,
還可以重新仔細回味校園裡所學,
並將這些知識融合做出成果,
不也是一種 小確幸 ~
● MVMC & ACAL Labs @ NCU
○ 老師們與歷屆學長、同學和學弟們
● 作業系統Operating Systems on Share Course
● 我旁聽的作業系統課 @ NCU
● Textbook: Operating System Concepts
● Open Source Groups
Thanks to
Thank you ~
and Q & A
GitHub → starnight → simple-scheduler
Between Running and Ready State
ready running
interrupt
scheduler dispatch
Ready * NRunning Running
Job’s state according to time:
Time
Interrupted by timeout
For Multitasking
The Waiting State
Waiting
I/O
event
waitI/O
event
completion
WaitingRunning Ready
Job’s state according to time:
Time
For Multiprogramming
Diagram showing CPU switch from
process to process
Reference: Figure 3.4 of Operating System Concept, 8th
● SS_READYQUEUEOK
○ The ready queue works fine.
● SS_READYQUEUEEMPTY
○ The ready queue is empty.
● SS_READYQUEUEFULL
○ The ready queue is full.
Ready Queue Status
Ready Queue
PCB of Job #3
PCB of Job #2
PCB of Job #1
FI
FO
Job’s State in Simple Scheduler
new
ready
terminated
running
admitted exit
scheduler dispatch
Ready Queue
SSAdmitJob
SSMainLoop
Scheduler Status
● SS_RUNSCHEDULING
○ The scheduler is running.
● SS_BREAKSCHEDULING
○ The scheduler is or is going to be broken into stop.
● SS_BREAKANDCONSUMELEFT
○ The scheduler is or is going to be broken into stop
and consume the left jobs in ready queue.
Represented by SS_SSTATUS → run
Recall thinking furthermore
Apps
Operating
System
Input Output
drivers scheduler etc ...
ETC
ready
queue
data
structure

The Simple Scheduler in Embedded System @ OSDC.TW 2014