Collaboration diagram for Thread Management:
Typically Nut/OS is at its most useful where there are several concurrent tasks that need to be undertaken at the same time. To support this requirement, Nut/OS offers some kind of light processes called threads. In this context a thread is a sequence of executing software that can be considered to be logically independent from other software that is running on the same CPU.
All threads are executing in the same address space using the same hardware resources, which significantly reduces task switching overhead. Therefore it is important to stop them from causing each other problems. This is particularly an issue where two or more threads need to share a resources like memory locations or peripheral devices.
The system works on the principle that the most urgent thread always runs. One exception to this is if a CPU interrupt arrives and the interrupt has not been disabled. Each thread has a priority which is used to determine how urgent it is. This priority ranges from 0 to 255, with the lowest value indicating the most urgent.
Nut/OS implements cooperative multithreading. That means, that threads are not bound to a fixed timeslice. Unless they are waiting for specific event or explicitely yielding the CPU, they can rely on not being stopped unexpectedly. However, they may be interrupted by hardware interrupt signals. In opposite to pre-emptive multithreading, coorperative multithreading simplifies resource sharing and results in faster and smaller code.
#include <sys/thread.h> THREAD(Back, arg) { for (;;) { NutSleep(1000); } }
To start this thread, use
#include <sys/thread.h> /* Other code here... */ NutThreadCreate("Bg", Back, NULL, 512); /* Execution continues here and concurrently in the background thread.
The functions listed below are hardware independant. Additional API calls are located in the architecture dependant sections.
Data Structures | |
struct | _NUTTHREADINFO |
Thread information structure. More... | |
struct | _NUTTHREADINFO |
Thread information structure. More... | |
Typedefs | |
typedef _NUTTHREADINFO | NUTTHREADINFO |
Functions | |
void | NutThreadAddPriQueue (NUTTHREADINFO *td, NUTTHREADINFO *volatile *tqpp) |
Add a thread to a prioritiy ordered queue. | |
void | NutThreadRemoveQueue (NUTTHREADINFO *td, NUTTHREADINFO *volatile *tqpp) |
Remove a thread from a specified queue. | |
void | NutThreadResume (void) |
Continue with the highest priority thread, which is ready to run. | |
void | NutThreadWake (HANDLE timer, HANDLE th) |
Resume a previously suspended thread. | |
void | NutThreadYield (void) |
Give up the CPU. | |
u_char | NutThreadSetPriority (u_char level) |
Set the current thread's priority. | |
void | NutThreadExit (void) |
End the current thread. | |
void | NutThreadDestroy (void) |
Free a thread that was previously killed and release memory back to the OS. | |
void | NutThreadKill (void) |
Kill the running thread. | |
HANDLE | GetThreadByName (char *name) |
Query handle of a thread with a specific name. | |
Variables | |
NUTTHREADINFO * | runningThread |
Currently running thread. | |
NUTTHREADINFO * | killedThread |
Thread to be killed. | |
NUTTHREADINFO * | nutThreadList |
List of all created threads. | |
NUTTHREADINFO * | runQueue |
List of ready-to-run threads. |
|
Thread information structure type. |
|
Add a thread to a prioritiy ordered queue. Insert the thread into a specified queue behind the last thread with lower or equal priority.
|
|
Remove a thread from a specified queue.
|
|
Continue with the highest priority thread, which is ready to run. If the currently running thread lost its top position in the queue of ready-to-run threads, then the context will be switched.
|
|
Resume a previously suspended thread. This routine is called by the system when a sleep timer elapses.
|
|
Give up the CPU. If another thread within the same or higher priority is ready to run, then the current thread is stopped and the other one is started. |
|
Set the current thread's priority. The priority of newly created threads is set to 64, but may be changed when the thread starts running. Changing the priority level to 255 will kill the calling thread. When another thread with a higher or equal priority is ready to run, the current thread will be stopped and control of the CPU is passed to the other thread. The function returns the old priority, which makes it easy to temporarily switch to another priority and later set back the old one.
|
|
End the current thread. Terminates the current thread, in due course the memory associated with the thread will be released back to the OS this is done by the idle thread.
|
|
Free a thread that was previously killed and release memory back to the OS. Called when another thread is killed and by the idle thread. Applications generally do not call this function, however you could call it to try to reclaim memory. |
|
Kill the running thread. The thread is moved from the schedule que and Applications generally do not call this function. |
|
Query handle of a thread with a specific name.
|
|
Currently running thread. Pointer to the NUTTHREADINFO structure of the currently running thread. |
|
Thread to be killed. Pointer to the NUTTHREADINFO structure of the latest killed thread. |
|
List of all created threads. Linked list of NUTTHREADINFO structures of all threads. New threads are put in front. This list contains at least two threads, the main application thread followed by the idle thread. |
|
List of ready-to-run threads. Priority ordered linked list of NUTTHREADINFO structures of all threads which are ready to run. The idle thread will always remain at the end of this list. |