本帖最后由 董董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[6] ={ 2,3,4,5,6,7 };
- int Delay[6] ={ 100,550,900,2000,2800,1500 };
- /*线程1*/
- NIL_WORKING_AREA(waThread1, 64);
- NIL_THREAD(Thread1, arg) {
- digitalWrite(LED_PIN[0], LOW);
- while (TRUE) {
- digitalWrite(LED_PIN[0], HIGH);
- nilThdSleepMilliseconds(Delay[0]);
- digitalWrite(LED_PIN[0], LOW);
- nilThdSleepMilliseconds(Delay[0]);
- }
- }
- /*线程2*/
- NIL_WORKING_AREA(waThread2, 64);
- NIL_THREAD(Thread2, arg) {
- digitalWrite(LED_PIN[1], LOW);
- while (TRUE) {
- digitalWrite(LED_PIN[1], HIGH);
- nilThdSleepMilliseconds(Delay[1]);
- digitalWrite(LED_PIN[1], LOW);
- nilThdSleepMilliseconds(Delay[1]);
- }
- }
- /*线程3*/
- NIL_WORKING_AREA(waThread3, 64);
- NIL_THREAD(Thread3, arg) {
- digitalWrite(LED_PIN[2], LOW);
- while (TRUE) {
- digitalWrite(LED_PIN[2], HIGH);
- nilThdSleepMilliseconds(Delay[2]);
- digitalWrite(LED_PIN[2], LOW);
- nilThdSleepMilliseconds(Delay[2]);
- }
- }
- /*线程4*/
- NIL_WORKING_AREA(waThread4, 64);
- NIL_THREAD(Thread4, arg) {
- digitalWrite(LED_PIN[3], LOW);
- while (TRUE) {
- digitalWrite(LED_PIN[3], HIGH);
- nilThdSleepMilliseconds(Delay[3]);
- digitalWrite(LED_PIN[3], LOW);
- nilThdSleepMilliseconds(Delay[3]);
- }
- }
- /*线程5*/
- NIL_WORKING_AREA(waThread5, 64);
- NIL_THREAD(Thread5, arg) {
- digitalWrite(LED_PIN[4], LOW);
- while (TRUE) {
- digitalWrite(LED_PIN[4], HIGH);
- nilThdSleepMilliseconds(Delay[4]);
- digitalWrite(LED_PIN[4], LOW);
- nilThdSleepMilliseconds(Delay[4]);
- }
- }
- /*线程6*/
- NIL_WORKING_AREA(waThread6, 64);
- NIL_THREAD(Thread6, arg) {
- digitalWrite(LED_PIN[5], LOW);
- while (TRUE) {
- digitalWrite(LED_PIN[5], HIGH);
- nilThdSleepMilliseconds(Delay[5]);
- digitalWrite(LED_PIN[5], LOW);
- nilThdSleepMilliseconds(Delay[5]);
- }
- }
- /*线程列表*/
- 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[i],OUTPUT);
- }
- // Start Nil RTOS.
- nilSysBegin();
- }
- void loop() {
- // Not used.
- }
复制代码
NilRTOS库下载
|