在pcDuino上学习μC/OS II

酸酸苹果汁 发布于 2014/02/20 10:21
阅读 1K+
收藏 3

uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。 uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、移植性和安全性,uC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。

想学习操作系统的同学的可以好好分析这个系统的代码。

logo_osii

说明

硬件:pcDuino V2   1块

 linker base   1块

  led          1个

导线

代码:

$   表示在pcDuino执行

#   表示在x86 linux上执行

>   表示在u-boot状态执行

uC/OS II下载编译

1,我们的ucos是用github维护的,你需要下载安装github来维护这些代码

$sudo  apt-get install git git-core

2,下载代码

$git clone https://github.com/Pillar1989/ucos-ii-for-pcDuino

3,下载之后的有以下文件

ubuntu@ubuntu :~/ucos_linux_2.86$ ls
Makefile  app  arduino  build  config.mk  ucos  ucos_2.86_original

app下主要存放你的ucos应用程序的代码

arduino存放arduino的API

build 存放编译之后的文件

ucos 系统源码

ucos_2.86_original 系统的文档

3,进入到arduino目录下

$cd arduino

4,先编译arduino动态连接库libarduino.so

$make

ubuntu@ubuntu :~/ucos_linux_2.86/arduino$ ls
Makefile hardware libarduino.a libarduino.so libraries output sample

5,回到代码根目录下

$cd ..

6,编译整个系统

$make

7,编译完了之后会生成ucos_sample

ubuntu@ubuntu :~/ucos_linux_2.86$ make
make[1]: Entering directory `/home/ubuntu/ucos_linux_2.86/ucos’
make[2]: Entering directory `/home/ubuntu/ucos_linux_2.86/ucos/port’
[CC] /home/ubuntu/ucos_linux_2.86/build/os_cpu_c.o
[LD] /home/ubuntu/ucos_linux_2.86/build/port.o
make[2]: Leaving directory `/home/ubuntu/ucos_linux_2.86/ucos/port’
[CC] /home/ubuntu/ucos_linux_2.86/build/os_core.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_dbg_r.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_flag.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_mbox.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_mem.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_mutex.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_q.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_sem.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_task.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_time.o
[CC] /home/ubuntu/ucos_linux_2.86/build/os_tmr.o
[LD] /home/ubuntu/ucos_linux_2.86/build/ucos.o
make[1]: Leaving directory `/home/ubuntu/ucos_linux_2.86/ucos’
make[1]: Entering directory `/home/ubuntu/ucos_linux_2.86/app’
sample.c: In function ‘MyTask’:
sample.c:31:9: warning: type defaults to ‘int’ in declaration of ‘flag1’ [-Wimplicit-int]
sample.c: In function ‘main’:
sample.c:79:7: warning: unused variable ‘sTask4’ [-Wunused-variable]
sample.c:78:7: warning: unused variable ‘sTask3’ [-Wunused-variable]
sample.c:77:7: warning: unused variable ‘sTask2’ [-Wunused-variable]
sample.c:74:8: warning: unused variable ‘Stk5’ [-Wunused-variable]
sample.c:73:8: warning: unused variable ‘Stk4’ [-Wunused-variable]
sample.c:72:8: warning: unused variable ‘Stk3’ [-Wunused-variable]
sample.c:71:8: warning: unused variable ‘Stk2’ [-Wunused-variable]
[CC] /home/ubuntu/ucos_linux_2.86/build/sample.o
[LD] /home/ubuntu/ucos_linux_2.86/build/app.o
make[1]: Leaving directory `/home/ubuntu/ucos_linux_2.86/app’
[LD] ucos_sample -lpthread -larduino -L./arduino
ubuntu@ubuntu :~/ucos_linux_2.86$ ls
Makefile app arduino build config.mk ucos ucos_2.86_original ucos_sample

硬件连接

led

   uC/OS II测试

编写测试程序:

$vim app/sample.c

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
*********************************************************************************************************
*                                               sample.c
*
* Description:  This sample program uses the ucos linux port to start 5 simple tasks.
*
* Author: Philip Mitchell
*
*********************************************************************************************************
*/
 
#include<stdio.h>
#include<stdlib.h>
#include"ucos_ii.h"
#include<core.h>
#include<string.h>
 
intled_pin =1;
intbtn_pin =5;
 
voidhardware_init()
{
     pinMode(led_pin, OUTPUT);
}
/* Function common to all tasks */
 
voidMyTask(void*p_arg )
{
 
    char* sTaskName = (char*)p_arg;
    staticflag1 =1;
#ifOS_CRITICAL_METHOD ==3
    OS_CPU_SR     cpu_sr =0;
#endif
 
    while(1)
    {
        /* printf uses mutex to get terminal access, therefore must enter critical section */
        OS_ENTER_CRITICAL();
        printf("Name: %s\n", sTaskName );
        if(!strcmp(sTaskName,"Task 1"))
        {
            if(flag1 ==1)
            {
                flag1 =0;
                printf("HIGH\n");
                digitalWrite(led_pin, HIGH);
            }
            else
            {
                flag1 =1;
                printf("LOW\n");
                digitalWrite(led_pin, LOW);
            }
        }      
        OS_EXIT_CRITICAL();
 
        /* Delay so other tasks may execute. */
        OSTimeDly(50);
    }/* while */
 
}
 
intmain (void)
{
    /* pthreads allocates its own memory for task stacks. This UCOS linux port needs a minimum stack size
        in order to pass the function information within the port. */
    hardware_init();
    INT8U Stk1[ OSMinStkSize() ];
    INT8U Stk2[ OSMinStkSize() ];
    INT8U Stk3[ OSMinStkSize() ];
    INT8U Stk4[ OSMinStkSize() ];
    INT8U Stk5[ OSMinStkSize() ];
 
    char sTask1[] ="Task 1";
    char sTask2[] ="Task 2";
    char sTask3[] ="Task 3";
    char sTask4[] ="Task 4";
//  char sTask5[] = "Task 5";
 
    OSInit();
 
    OSTaskCreate( MyTask, sTask1, (void*)Stk1,4);
//  OSTaskCreate( MyTask, sTask2, (void*)Stk2, 5 );
//  OSTaskCreate( MyTask, sTask3, (void*)Stk3, 6 );
//  OSTaskCreate( MyTask, sTask4, (void*)Stk4, 7 );
//  OSTaskCreate( MyTask, sTask5, (void*)Stk5, 8 );
 
    OSStart();
 
    return0;
}

连接一个led灯到1脚,执行刚刚编译出来的程序

ubuntu@ubuntu:~/ucos-ii-for-pcDuino$ ./ucos_sample

连接一个led灯到1脚,执行刚刚编译出来的程序

ubuntu@ubuntu :~/ucos-ii-for-pcDuino$ ./ucos_sample

1Name: Task 1

HIGH

Name: Task 1

LOW

Name: Task 1

HIGH

Name: Task 1

LOW

Name: Task 1

板子上接到1 pin的led会不断的闪烁

应用教程

从刚才的测试中可以看到在ucos使用arduino的API非常简单,写在原来setup里面的代码可以写在hardware_init函数里面,写在loop里面代码可以写在你的task里面。你添加修改的代码主要集中在app这个文件夹下,添加完了之后在代码的根目录下执行,下面是一个例子,例如

1,假如你在sample.c里面添加了你自己的代码

$vim app/sample.c

2,你需要编译整个系统

$make

3,编译之后会生成ucos_sample,运行你编译的ucos系统
$./ucos_sample

关于ucos整个系统的介绍,推荐看邵贝贝写的《嵌入式实时操作系统μCOS-II》,电子书的链接地址为

http://down.51cto.com/data/57267

关于arduino 使用介绍请看:

http://www.arduino.cc/



linksprite学习中心

加载中
0
echor
echor
github中的代码多任务存在段错误的严重bug,
返回顶部
顶部