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

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

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中建立新的工程其文件组织如下图

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

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

5、 首先设定LED工程为当前活动的工程,在工程选项中设置包含路径和输出库文件。做好上面的你就可以编译了,但是编译也没用。在appusermain下添加一个组,并加入刚才生产的LED.lib文件(在..\APP\LED\Obj目录下)。接着就是加入我们的驱动函数了下面是我对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;\n");

    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;\n");

    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;\n");

    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;\n");

    tk_sta_tsk(TaskID_B,5);

    return E_OK;

}

void TaskSampleTaskB(W stacd,VP exinf)

{

B c;

    B s[3]="0\n";

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;\n");

        tk_sta_tsk(TaskID_C,0);

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

        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):\n");

c = tm_getchar(0);

if(c=='e') {

break;

}

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

tk_slp_tsk(500);

    }

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

    tk_ter_tsk(TaskID_A);

    tk_del_tsk(TaskID_A);

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

    tk_ter_tsk(TaskID_C);

    tk_del_tsk(TaskID_C);

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

    tk_exd_tsk();

}

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

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

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

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

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

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

uTenux-OS-Task再探的更多相关文章

  1. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  2. 第四节:SignalR灵魂所在Hub模型及再探聊天室样例

    一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...

  3. c++再探string之eager-copy、COW和SSO方案

    在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...

  4. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  5. 再探jQuery

    再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...

  6. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  7. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  8. 再探ASP.NET 5(转载)

    就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...

  9. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  10. 深入出不来nodejs源码-内置模块引入再探

    我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...

随机推荐

  1. mongo快速翻页方法(转载)

    翻阅数据是MongoDB最常见的操作之一.一个典型的场景是需要在你的用户界面中显示你的结果.如果你是批量处理的数据,同样重要的是要让你的分页策略正确,以便你的数据处理可以规模化. 接下来,让我们通过一 ...

  2. 手机端js模拟长按事件(代码仿照jQuery)

    代码编写: $.fn.longPress = function(fn) { var timeout = undefined; var $this = this; for(var i = 0;i< ...

  3. centos的用户管理相关命令所在的包

    用户管理命令是指:useradd userdel  groupadd groupdel 这些 这些命令出自一个叫 shadow-utils 的包. 对于配置文件 /etc/shadow ,则来自一个叫 ...

  4. 【py网页】urllib模块,urlopen

    Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 下面是在 Python Shell 里的 urllib 的使用情况: 01 Pyth ...

  5. Sqlserver Sql Agent Job 只能同时有一个实例运行

    Sqlserver Sql Agent中的Job默认情况下只能有一个实例在运行,也就是说假如你的Sql Agent里面有一个正在运行的Job叫"Test Job",如果你现在再去启 ...

  6. HTTP请求流程(一)----流程简介

    最近一直在研究如何让asp.net实现上传大文件的功能,所以都没怎么写技术类的文章了.可惜的是至今还没研究出来,惭愧~~~.不过因为这样,也了解了一下http消息请求的大致过程.我就先简单介绍下,然后 ...

  7. 原生js获取execl里面的值 主要使用ActiveXObject

    今天一个程序员给了一个excel表,里面有一百多条数据,叫我一个一个数据的复制到系相应的函数里面比如 put("gaga1","gaga2"),这样一句话,要我 ...

  8. Java中main方面面试题

    1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7开始就行不通了. 2.main() ...

  9. Respond.js – 让 IE6-8 支持 CSS3 Media Query

    Respond.js 是一个快速.轻量的 polyfill,用于为 IE6-8 以及其它不支持 CSS3 Media Queries 的浏览器提供媒体查询的 min-width 和 max-width ...

  10. struts2多线程数据乱窜问题

    转自:http://love398146779.iteye.com/blog/1781680 1.struts2为每个线程提供一个action实例,多线程访问时不会出现问题.当使用spring管理st ...