This system seems ideal for small chips like the ATmega328. Nil RTOS is extremely simple so it is great for new users.
I have written a number of examples and a guide, "Understanding the Examples", to help new users.
Here is the first example new users should try. It requires about 2150 bytes of flash on an Uno.
/*
* Example to demonstrate thread definition, semaphores, and thread sleep.
*/
#include <NilRTOS.h>
// The LED is attached to pin 13 on Arduino.
const uint8_t LED_PIN = 13;
// Declare a semaphore with an inital counter value of zero.
SEMAPHORE_DECL(sem, 0);
//------------------------------------------------------------------------------
/*
* Thread 1, turn the LED off when signaled by thread 2.
*/
// Declare a stack with 128 bytes beyond context switch and interrupt needs.
NIL_WORKING_AREA(waThread1, 128);
// Declare the thread function for thread 1.
NIL_THREAD(Thread1, arg) {
while (TRUE) {
// Wait for signal from thread 2.
nilSemWait(&sem);
// Turn LED off.
digitalWrite(LED_PIN, LOW);
}
}
//------------------------------------------------------------------------------
/*
* Thread 2, turn the LED on and signal thread 1 to turn the LED off.
*/
// Declare a stack with 128 bytes beyond context switch and interrupt needs.
NIL_WORKING_AREA(waThread2, 128);
// Declare the thread function for thread 2.
NIL_THREAD(Thread2, arg) {
pinMode(LED_PIN, OUTPUT);
while (TRUE) {
// Turn LED on.
digitalWrite(LED_PIN, HIGH);
// Sleep for 200 milliseconds.
nilThdSleepMilliseconds(200);
// Signal thread 1 to turn LED off.
nilSemSignal(&sem);
// Sleep for 200 milliseconds.
nilThdSleepMilliseconds(200);
}
}
//------------------------------------------------------------------------------
/*
* Threads static table, one entry per thread. A thread's priority is
* determined by its position in the table with highest priority first.
*
* These threads start with a null argument. A thread's name may also
* be null to save RAM since the name is currently not used.
*/
NIL_THREADS_TABLE_BEGIN()
NIL_THREADS_TABLE_ENTRY("thread1", Thread1, NULL, waThread1, sizeof(waThread1))
NIL_THREADS_TABLE_ENTRY("thread2", Thread2, NULL, waThread2, sizeof(waThread2))
NIL_THREADS_TABLE_END()
//------------------------------------------------------------------------------
void setup() {
// Start Nil RTOS.
nilSysBegin();
}
//------------------------------------------------------------------------------
// Loop is the idle thread. The idle thread must not invoke any
// kernel primitive able to change its state to not runnable.
void loop() {
// Not used.
}
with nilThdSleep(10);
No line ending:
type any character to begin
type any character to end
type any character to begin
Newline:
type any character to begin
type any character to begin
CR:
type any character to begin
type any character to begin
Both NL&CR:
type any character to begin
type any character to begin
with delay(10);
any settings
type any character to begin
type any character to end
type any character to begin
with:
//#define Serial NilSerial
and No line ending:
type any character ôtype any character to begin
type any charactertype any character to begin
type any character to eîtype any character to begin
type any character totype any character to begin
firefox under xp has a problem to download it, IE8 did it .. :~
but still the same issue..
I'll try with usb serial dongle..
..the same..
fyi - this is the bench from the sdfat:
Type any character to start
Free RAM: 1019
Type is FAT32
File size 5MB
Buffer size 100 bytes
Starting write test. Please wait up to a minute
Write 135.23 KB/sec
Maximum latency: 54924 usec, Minimum Latency: 88 usec, Avg Latency: 733 usec
Starting read test. Please wait up to a minute
Read 284.79 KB/sec
Maximum latency: 4656 usec, Minimum Latency: 84 usec, Avg Latency: 345 usec
Done
Type any character to start
Type any character to start
Free RAM: 1109
Type is FAT32
Starting print test. Please wait.
Test of println(uint16_t)
Time 9.97 sec
File size 128.89 KB
Write 12.93 KB/sec
Maximum latency: 20828 usec, Minimum Latency: 176 usec, Avg Latency: 491 usec
Test of printField(uint16_t, char)
Time 3.15 sec
File size 128.89 KB
Write 40.92 KB/sec
Maximum latency: 18748 usec, Minimum Latency: 60 usec, Avg Latency: 150 usec
Test of println(double)
Time 15.06 sec
File size 149.00 KB
Write 9.89 KB/sec
Maximum latency: 19160 usec, Minimum Latency: 572 usec, Avg Latency: 746 usec
Done!
Type any character to start
I can't do anything more since everything I try works fine. I don't have a working xp system.
Edit: Here is one more idea. Change nilSysBegin() to nilSysBeginNoFill(). This will prevent filling stacks when NilRTOS starts so the final message will be wrong.