极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5565|回复: 21

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

  [复制链接]
发表于 2014-5-2 22:21:24 | 显示全部楼层 |阅读模式
本帖最后由 董董soul 于 2016-10-27 11:21 编辑

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

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

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

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

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

2014-5-20 17-13-20.png

  1. #include <NilRTOS.h>

  2. int LED_PIN[6] ={ 2,3,4,5,6,7 };
  3. int Delay[6] ={ 100,550,900,2000,2800,1500 };
  4. /*线程1*/
  5. NIL_WORKING_AREA(waThread1, 64);
  6. NIL_THREAD(Thread1, arg) {
  7.   digitalWrite(LED_PIN[0], LOW);
  8.   while (TRUE) {
  9.     digitalWrite(LED_PIN[0], HIGH);
  10.     nilThdSleepMilliseconds(Delay[0]);
  11.     digitalWrite(LED_PIN[0], LOW);
  12.     nilThdSleepMilliseconds(Delay[0]);
  13.   }
  14. }
  15. /*线程2*/
  16. NIL_WORKING_AREA(waThread2, 64);
  17. NIL_THREAD(Thread2, arg) {
  18.   digitalWrite(LED_PIN[1], LOW);
  19.   while (TRUE) {
  20.     digitalWrite(LED_PIN[1], HIGH);
  21.     nilThdSleepMilliseconds(Delay[1]);
  22.     digitalWrite(LED_PIN[1], LOW);
  23.     nilThdSleepMilliseconds(Delay[1]);
  24.   }
  25. }
  26. /*线程3*/
  27. NIL_WORKING_AREA(waThread3, 64);
  28. NIL_THREAD(Thread3, arg) {
  29.   digitalWrite(LED_PIN[2], LOW);
  30.   while (TRUE) {
  31.     digitalWrite(LED_PIN[2], HIGH);
  32.     nilThdSleepMilliseconds(Delay[2]);
  33.     digitalWrite(LED_PIN[2], LOW);
  34.     nilThdSleepMilliseconds(Delay[2]);
  35.   }
  36. }
  37. /*线程4*/
  38. NIL_WORKING_AREA(waThread4, 64);
  39. NIL_THREAD(Thread4, arg) {
  40.   digitalWrite(LED_PIN[3], LOW);
  41.   while (TRUE) {
  42.     digitalWrite(LED_PIN[3], HIGH);
  43.     nilThdSleepMilliseconds(Delay[3]);
  44.     digitalWrite(LED_PIN[3], LOW);
  45.     nilThdSleepMilliseconds(Delay[3]);
  46.   }
  47. }
  48. /*线程5*/
  49. NIL_WORKING_AREA(waThread5, 64);
  50. NIL_THREAD(Thread5, arg) {
  51.   digitalWrite(LED_PIN[4], LOW);
  52.   while (TRUE) {
  53.     digitalWrite(LED_PIN[4], HIGH);
  54.     nilThdSleepMilliseconds(Delay[4]);
  55.     digitalWrite(LED_PIN[4], LOW);
  56.     nilThdSleepMilliseconds(Delay[4]);
  57.   }
  58. }
  59. /*线程6*/
  60. NIL_WORKING_AREA(waThread6, 64);
  61. NIL_THREAD(Thread6, arg) {
  62.   digitalWrite(LED_PIN[5], LOW);
  63.   while (TRUE) {
  64.     digitalWrite(LED_PIN[5], HIGH);
  65.     nilThdSleepMilliseconds(Delay[5]);
  66.     digitalWrite(LED_PIN[5], LOW);
  67.     nilThdSleepMilliseconds(Delay[5]);
  68.   }
  69. }
  70. /*线程列表*/
  71. NIL_THREADS_TABLE_BEGIN()
  72. NIL_THREADS_TABLE_ENTRY("thread1", Thread1, NULL, waThread1, sizeof(waThread1))
  73. NIL_THREADS_TABLE_ENTRY("thread2", Thread2, NULL, waThread2, sizeof(waThread2))
  74. NIL_THREADS_TABLE_ENTRY("thread3", Thread3, NULL, waThread3, sizeof(waThread3))
  75. NIL_THREADS_TABLE_ENTRY("thread4", Thread4, NULL, waThread4, sizeof(waThread4))
  76. NIL_THREADS_TABLE_ENTRY("thread5", Thread5, NULL, waThread5, sizeof(waThread5))
  77. NIL_THREADS_TABLE_ENTRY("thread6", Thread6, NULL, waThread6, sizeof(waThread6))
  78. NIL_THREADS_TABLE_END()

  79. void setup() {
  80.   for( int i = 0;i< 6; i++ )
  81.   {
  82.     pinMode(LED_PIN[i],OUTPUT);
  83.   }
  84.   // Start Nil RTOS.
  85.   nilSysBegin();
  86. }

  87. void loop() {
  88.   // Not used.
  89. }
复制代码




NilRTOS库下载
NilRTOS.zip (50.37 KB, 下载次数: 112)
回复

使用道具 举报

 楼主| 发表于 2016-3-13 20:53:43 | 显示全部楼层
dongbao.wang 发表于 2016-3-13 10:12
教程出来了吗?在哪里能找到?谢啦!

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

点评

老大你辛苦了。  发表于 2017-11-20 15:27
回复 支持 2 反对 0

使用道具 举报

发表于 2014-7-30 22:16:18 | 显示全部楼层
这个库的详细说明在哪呀?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 14:20:15 | 显示全部楼层
zwltanf 发表于 2014-7-30 22:16
这个库的详细说明在哪呀?

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

使用道具 举报

发表于 2014-8-2 11:53:48 | 显示全部楼层
这样的程序编译出来大吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-2 14:17:55 | 显示全部楼层
wing 发表于 2014-8-2 11:53
这样的程序编译出来大吗?

不大,这个点led的6线程也就3018个字节。
回复 支持 反对

使用道具 举报

发表于 2015-12-15 12:58:58 | 显示全部楼层
该RTOS UNO、seeeduino适用吗?
回复 支持 反对

使用道具 举报

发表于 2015-12-15 13:05:02 | 显示全部楼层
我感觉代码还可以更少。将线程封装成一个函数调用实现,虽然不是并发执行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-17 22:43:57 | 显示全部楼层
suoma 发表于 2015-12-15 12:58
该RTOS UNO、seeeduino适用吗?

适用的,328核心都没问题
回复 支持 反对

使用道具 举报

发表于 2016-3-13 10:12:02 | 显示全部楼层
弘毅 发表于 2014-7-31 14:20
这个。。。暂时只能看源码自己理解下了,把xmega兼容性做好了我会写语法手册。


教程出来了吗?在哪里能找到?谢啦!
回复 支持 反对

使用道具 举报

发表于 2016-3-14 21:54:58 | 显示全部楼层
弘毅 发表于 2016-3-13 20:53
没几个人支持。。。。前两天还被人说教程不值钱,淘宝给了个差评,好伤心。。。。

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

使用道具 举报

 楼主| 发表于 2016-3-19 09:37:25 | 显示全部楼层
dongbao.wang 发表于 2016-3-14 21:54
至少对我来说,入门教程的帮助还是很大的。这个论坛还是很棒的。
辛苦了!

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

点评

谢谢啦!  发表于 2016-3-19 09:51
回复 支持 反对

使用道具 举报

发表于 2016-4-7 15:07:54 | 显示全部楼层
如何能使6个光敏电阻分别控制6个led亮或灭?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-7 15:18:09 | 显示全部楼层
jinzeren 发表于 2016-4-7 15:07
如何能使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[0], LOW);
  while(1) {
    digitalWrite(LED_PIN[0], HIGH);
    nilThdSleepMilliseconds(Delay[0]);
    digitalWrite(LED_PIN[0], LOW);
    nilThdSleepMilliseconds(Delay[0]);
  }
}
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2018-5-28 09:01 , Processed in 0.097685 second(s), 10 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表