弘毅 发表于 2014-5-2 22:21:24

OCROBOT入门教程028--RTOS使用入门

本帖最后由 董董soul 于 2016-10-27 11:21 编辑

学习到现在我们对OCROBOT控制板的使用已经有了一个初步的了解,也能自己做一些简单的应用操作了,如果遇到比较复杂的应用环境,比如一个灯需要2秒量一次,一个需要PWM控制,另外需要根据模拟口读数来控制一个继电器,同时还需要串口输出三种控制的状态。自己虽然也可以写出来,不过整个逻辑结构就会略显复杂。如果我们能够使用一个支持多线程的小型操作系统那就能大大降低整体的逻辑复杂程度。

RTOS英文全称Real-Time Operating Systems,中文叫做实时操作系统。

NilRTOS就是这么一个可以运行在OCROBOT控制板中的简单的操作系统。

我们通过驱动六颗LED让其以不同的速度闪烁来简单学习一下NilRTOS的基本用法。

在NilRTOS中,我们不能使用标准的delay(),这个会导致操作系统异常。需要使用nilThdSleepMilliseconds来替代delay(),这个需要切记。



#include <NilRTOS.h>

int LED_PIN ={ 2,3,4,5,6,7 };
int Delay ={ 100,550,900,2000,2800,1500 };
/*线程1*/
NIL_WORKING_AREA(waThread1, 64);
NIL_THREAD(Thread1, arg) {
digitalWrite(LED_PIN, LOW);
while (TRUE) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
/*线程2*/
NIL_WORKING_AREA(waThread2, 64);
NIL_THREAD(Thread2, arg) {
digitalWrite(LED_PIN, LOW);
while (TRUE) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
/*线程3*/
NIL_WORKING_AREA(waThread3, 64);
NIL_THREAD(Thread3, arg) {
digitalWrite(LED_PIN, LOW);
while (TRUE) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
/*线程4*/
NIL_WORKING_AREA(waThread4, 64);
NIL_THREAD(Thread4, arg) {
digitalWrite(LED_PIN, LOW);
while (TRUE) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
/*线程5*/
NIL_WORKING_AREA(waThread5, 64);
NIL_THREAD(Thread5, arg) {
digitalWrite(LED_PIN, LOW);
while (TRUE) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
/*线程6*/
NIL_WORKING_AREA(waThread6, 64);
NIL_THREAD(Thread6, arg) {
digitalWrite(LED_PIN, LOW);
while (TRUE) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
/*线程列表*/
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_ENTRY("thread3", Thread3, NULL, waThread3, sizeof(waThread3))
NIL_THREADS_TABLE_ENTRY("thread4", Thread4, NULL, waThread4, sizeof(waThread4))
NIL_THREADS_TABLE_ENTRY("thread5", Thread5, NULL, waThread5, sizeof(waThread5))
NIL_THREADS_TABLE_ENTRY("thread6", Thread6, NULL, waThread6, sizeof(waThread6))
NIL_THREADS_TABLE_END()

void setup() {
for( int i = 0;i< 6; i++ )
{
    pinMode(LED_PIN,OUTPUT);
}
// Start Nil RTOS.
nilSysBegin();
}

void loop() {
// Not used.
}

http://player.youku.com/player.php/sid/XNzE4ODM0ODcy/v.swf

NilRTOS库下载

弘毅 发表于 2016-3-13 20:53:43

dongbao.wang 发表于 2016-3-13 10:12 static/image/common/back.gif
教程出来了吗?在哪里能找到?谢啦!

没几个人支持。。。。前两天还被人说教程不值钱,淘宝给了个差评,好伤心。。。。

zwltanf 发表于 2014-7-30 22:16:18

这个库的详细说明在哪呀?

弘毅 发表于 2014-7-31 14:20:15

zwltanf 发表于 2014-7-30 22:16 static/image/common/back.gif
这个库的详细说明在哪呀?

这个。。。暂时只能看源码自己理解下了,把xmega兼容性做好了我会写语法手册。

wing 发表于 2014-8-2 11:53:48

这样的程序编译出来大吗?

弘毅 发表于 2014-8-2 14:17:55

wing 发表于 2014-8-2 11:53 static/image/common/back.gif
这样的程序编译出来大吗?

不大,这个点led的6线程也就3018个字节。

suoma 发表于 2015-12-15 12:58:58

该RTOS UNO、seeeduino适用吗?

suoma 发表于 2015-12-15 13:05:02

我感觉代码还可以更少。将线程封装成一个函数调用实现,虽然不是并发执行

弘毅 发表于 2015-12-17 22:43:57

suoma 发表于 2015-12-15 12:58 static/image/common/back.gif
该RTOS UNO、seeeduino适用吗?

适用的,328核心都没问题

dongbao.wang 发表于 2016-3-13 10:12:02

弘毅 发表于 2014-7-31 14:20 static/image/common/back.gif
这个。。。暂时只能看源码自己理解下了,把xmega兼容性做好了我会写语法手册。

教程出来了吗?在哪里能找到?谢啦!

dongbao.wang 发表于 2016-3-14 21:54:58

弘毅 发表于 2016-3-13 20:53 static/image/common/back.gif
没几个人支持。。。。前两天还被人说教程不值钱,淘宝给了个差评,好伤心。。。。

至少对我来说,入门教程的帮助还是很大的。这个论坛还是很棒的。
辛苦了!

弘毅 发表于 2016-3-19 09:37:25

dongbao.wang 发表于 2016-3-14 21:54 static/image/common/back.gif
至少对我来说,入门教程的帮助还是很大的。这个论坛还是很棒的。
辛苦了!

OCROBOT ALPHA系列下会对RTOS进一步进入深度讲解。。。。不过品牌不是Arduino了,Arduino也可以照着用。

jinzeren 发表于 2016-4-7 15:07:54

如何能使6个光敏电阻分别控制6个led亮或灭?

弘毅 发表于 2016-4-7 15:18:09

jinzeren 发表于 2016-4-7 15:07 static/image/common/back.gif
如何能使6个光敏电阻分别控制6个led亮或灭?

6个ADC口检测光敏电阻阻值变化。。。控制6个LED

包不同 发表于 2017-1-8 13:57:11

弘毅 发表于 2016-4-7 15:18
6个ADC口检测光敏电阻阻值变化。。。控制6个LED

大佬,我发现将线程中的while(1)中的条件改掉,程序就不能正常运行,比如把线程1的条件改成0,其他线程的小灯都不会亮。这是怎么回事呢。。
/*线程1*/
NIL_WORKING_AREA(waThread1, 64);
NIL_THREAD(Thread1, arg) {
digitalWrite(LED_PIN, LOW);
while(1) {
    digitalWrite(LED_PIN, HIGH);
    nilThdSleepMilliseconds(Delay);
    digitalWrite(LED_PIN, LOW);
    nilThdSleepMilliseconds(Delay);
}
}
页: [1] 2
查看完整版本: OCROBOT入门教程028--RTOS使用入门