zoukankan      html  css  js  c++  java
  • uTenux-OS-Task再探

    在第一节中我由于没有拿到开发板,所以被迫无奈,只能将uTenux操作系统移植到手中的一块STM32F103的开发板上,当时对于uTenux的理解还不够,只是看了一下文件架构和效果,虽然移植成功了,但是其原理却不是太懂。所以目前uTenuxAT91SAM3S开发套件到手了,就老话重提,再把玩一下uTenux的第一个实验01.task,我们可以根据这个实验加深对uTenux的文件架构、组织关系的理解,对我们后期对他的学习很有帮助。

    接下来我们就其移植到uTenuxAT91SAM3S开发板上进行讲解。

    1、 和第一节中的操作一样,具体不细说了,不懂的麻烦看一下第一节的介绍或者跟帖,我会对跟帖的问题进行解答的。下面对与于第一节中的不同点进行解说。

    2、 按照第一节中的操作,uTenux操作系统肯定是能移植过去的,但是这似乎就没有什么新意了,那我这一节也就没什么好说的了。其实不然,我这已经重点要说的是怎样在其原有的工程模板中建立自己的一些底层驱动应用。我以LED驱动的加入为例进行介绍,首先我要说的是应该主要文件组织关系,下面是我自己的文件组织关系,您可以参考:

    ─001_task

        ├─APP

        │  ├─Configure

        │  ├─Interrupt

        │  ├─List

        │  ├─Note

        │  ├─Obj

        │  └─Source

        │      ├─APP

        │      └─HAL

        └─uTenux

            ├─.externalToolBuilders

            ├─.settings

            ├─app

            │  ├─build

            │  │  └─app_at91sam3

            │  └─usermain

            │      ├─build

            │      │  └─app_at91sam3

            │      └─src

            ├─bin

            │  └─app_at91sam3

            │      └─chip_at91sam3s4c

            ├─config

            │  └─sysdepend

            │      └─app_at91sam3

            │          └─chip_at91sam3s4c

            ├─etc

            │  └─sysdepend

            │      └─app_at91sam3

            ├─include

            │  ├─cpu

            │  │  └─sysdepend

            │  │      ├─armv7e_m

            │  │      └─armv7_m

            │  ├─dev

            │  │  └─sysdepend

            │  │      └─app_at91sam3

            │  ├─sbs

            │  ├─tk

            │  │  └─sysdepend

            │  │      ├─armv7e_m

            │  │      └─armv7_m

            │  └─tm

            ├─kernel

            │  ├─build

            │  │  └─app_at91sam3

            │  └─src

            │      └─sysdepend

            │          ├─armv7e_m

            │          │  ├─acc

            │          │  ├─gcc

            │          │  └─icc

            │          └─armv7_m

            │              ├─acc

            │              ├─gcc

            │              └─icc

            ├─lib

            │  ├─build

            │  │  └─app_at91sam3

            │  ├─libcpu

            │  │  ├─build

            │  │  │  └─at91sam3

            │  │  └─src

            │  │      └─sysdepend

            │  │          ├─armv6_m

            │  │          │  ├─acc

            │  │          │  ├─gcc

            │  │          │  └─icc

            │  │          ├─armv7e_m

            │  │          │  ├─acc

            │  │          │  ├─gcc

            │  │          │  └─icc

            │  │          └─armv7_m

            │  │              ├─acc

            │  │              ├─gcc

            │  │              └─icc

            │  ├─libdev

            │  │  ├─build

            │  │  │  └─app_at91sam3

            │  │  └─src

            │  │      └─sysdepend

            │  │          ├─app_at91sam3

            │  └─libtm

            │      ├─build

            │      │  └─app_at91sam3

            │      └─src

            ├─lic

            └─subass

                └─build

                    ├─app_at91sam3

    其中APP文件夹是为我们要加入的驱动而建立的一个KEIL工程的一个目录,而uTenux文件夹这是在第三节中讲到的需要我们建立的uTenux工程模板。

    3、 建立好以上的文件组织结构后,我们需要在Keil中建立新的工程其文件组织如下图

    wps_clip_image-6657

    我们建立这个工程的目的是创建后面我们要在任务中加入的LED驱动库。

    4、 OK,将上面的保存一下。打开.. 01_taskuTenuxinapp_at91sam3workspace.uvmpw,你可以看到和第一节中的是一样的(已经按第一节加入了TaskSample.c等文件)。下面我们需要添加刚才建立的LED驱动工程,如果你不懂怎么添加可以跟帖或百度一下,很简单的。

    5、 首先设定LED工程为当前活动的工程,在工程选项中设置包含路径和输出库文件。做好上面的你就可以编译了,但是编译也没用。在appusermain下添加一个组,并加入刚才生产的LED.lib文件(在..APPLEDObj目录下)。接着就是加入我们的驱动函数了下面是我对TaskSample.c做的修改,您可以参考:

    ER TaskSample( void)

    {

        ER ercd=E_OK;

        T_CTSK ctsk;

    LED_Configure(LED_BLUE);//Configure LED_BLUE

        tm_putstring((UB*)"Task sample create step 1-Create Task A; ");

        ctsk.exinf = (VP)NULL;

        ctsk.tskatr = TA_HLNG|TA_RNG0;

        ctsk.task = TaskSampleTaskA;

        ctsk.itskpri = 24;

        ctsk.stksz = 512*4;

        TaskID_A = tk_cre_tsk(&ctsk);

        if(TaskID_A < E_OK) {

    ercd=TaskID_A;

            return ercd;

        }

        tm_putstring((UB*)"Task sample create step 2-Create Task B; ");

        ctsk.exinf = (VP)NULL;

        ctsk.tskatr = TA_HLNG|TA_RNG0;

        ctsk.task = TaskSampleTaskB;

        ctsk.itskpri = 26;

        ctsk.stksz = 512*4;

        TaskID_B = tk_cre_tsk(&ctsk);

        if(TaskID_B < E_OK) {

    ercd=TaskID_B;

            return ercd;

        }

        tm_putstring((UB*)"Task sample create step 3-Create Task C; ");

        ctsk.exinf = (VP)NULL;

        ctsk.tskatr = TA_HLNG|TA_RNG0;

        ctsk.task = TaskSampleTaskC;

        ctsk.itskpri = 28;

        ctsk.stksz = 512*4;

        TaskID_C = tk_cre_tsk(&ctsk);

        if(TaskID_C < E_OK){

    ercd=TaskID_C;

            return ercd;

        }

        tm_putstring((UB*)"Task sample create step 4-Start Task B; ");

        tk_sta_tsk(TaskID_B,5);

        return E_OK;

    }

    void TaskSampleTaskB(W stacd,VP exinf)

    {

    B c;

        B s[3]="0 ";

    if(stacd>0){

    s[0]+=stacd;

    tm_putstring((UB*)"Task B parameter stacd is ");

    tm_putstring((UB*)s);

        tm_putstring((UB*)"Task B will start task C; ");

            tk_sta_tsk(TaskID_C,0);

        tm_putstring((UB*)"Task B will start task A; ");

            tk_sta_tsk(TaskID_A,0);

    }

        for(;;)

      {

    LED_Toggle(LED_BLUE); ////////////My Task Flag

    tm_putstring((UB*)"Task B is running,input Command(e=exit): ");

    c = tm_getchar(0);

    if(c=='e') {

    break;

    }

    tm_putstring((UB*)"Task B will be sleeping; ");

    tk_slp_tsk(500);

        }

    tm_putstring((UB*)"Task B will terminate&delete task A; ");

        tk_ter_tsk(TaskID_A);

        tk_del_tsk(TaskID_A);

    tm_putstring((UB*)"Task B will terminate&delete task C; ");

        tk_ter_tsk(TaskID_C);

        tk_del_tsk(TaskID_C);

    tm_putstring((UB*)"Task B will terminate&delete self; ");

        tk_exd_tsk();

    }

    我只是添加了红色部分的两个函数,原理就是这样了。接下来编译下载就好了。

    6、 实验现象:(请连接好串口线,打开串口通信软件)

    下载好程序,复位开发板后您可以看到串口软件上显示如下:

    wps_clip_image-23061

    除此之外板载的蓝色LED灯亮起。如果您按下任意一个上位机按键,蓝色LED的状态翻转一次,而且上位机显示相应的信息。

    备注:复位按键不够灵敏,不只是不是启动文件的问题。

    这一节就讲到这里,如果您有任何疑问,您可以跟帖或直接给我发消息,我会尽快的回复您的。谢谢您阅读本文,如果有任何的问题或意见建议,麻烦你跟帖或联系我,谢谢!

  • 相关阅读:
    两台oracle数据库相互导数据(转载)
    resin之jvm优化
    求一表中每一个类别共有几条记录数
    jQuery+Ajax+Struts2.0
    改进nginx访问resin的性能
    通过web修改squid用户上网密码
    jvm优化
    Samba通过ad域进行认证并限制空间大小
    Samba 与squid 都可以统一使用域(AD)验证
    ASP.NET 下载文件
  • 原文地址:https://www.cnblogs.com/BruceLone/p/3348746.html
Copyright © 2011-2022 走看看