uTenux-OS-Task再探
在第一节中我由于没有拿到开发板,所以被迫无奈,只能将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再探的更多相关文章
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- 第四节:SignalR灵魂所在Hub模型及再探聊天室样例
一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...
- c++再探string之eager-copy、COW和SSO方案
在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- Spark Streaming揭秘 Day7 再探Job Scheduler
Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...
- 再探ASP.NET 5(转载)
就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- 深入出不来nodejs源码-内置模块引入再探
我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...
随机推荐
- Deep Learning 深度学习 学习教程网站集锦(转)
http://blog.sciencenet.cn/blog-517721-852551.html 学习笔记:深度学习是机器学习的突破 2006-2007年,加拿大多伦多大学教授.机器学习领域的泰斗G ...
- Another app is currently holding the yum lock; waiting for it to exit...另一个应用程序在占用yum lock,等待其退出。
这种情况下通常是由于yum的时候意外退出造成的,虽然也给出提示当前占用进行的id,但是执行kill -9 3599 强制杀死进程后,情况依然没能改变. 备注:(-9是强制杀死) 主要原因是因为,yum ...
- 在线快速生成 CSS Sptite 的网站
Spritepad http://spritepad.wearekiss.com/ 这个好,虽然没用过,先收起来再说.
- Sed文本替换一例
使用 Sed 完成文本替换操作任务是非常合适的. 现在, 假设我要将一个原有 Java 项目中的一些包及下面的类移到另一个项目中复用. Project javastudy: Packages: alg ...
- E2PROM的尺寸
买的E2PROM是128*8bit的, 就是只能存储128个byte, 妈的, 买小了. 实际需要的是10句, 可能加两个特殊句, "新手"跟"故障", 一共1 ...
- https笔记
TCP提供了可靠的,面向连接的字节流服务. 1)应用数据分割成TCP认为适合发送的数据块,通过MSS(最大数据包长度)来控制. 2)重传机制 3)对首部和数据进行校验 4)TCP对收到的数据进行排序, ...
- c sharp学习 问题记录
1.函数的调用可以嵌套,定义不可以 C# 参考之方法参数关键字:params.ref及out C#中方法的参数的四种类型
- $IFS和set
$IFS是内部字段分隔符的缩写.它决定Bash解析字符串时将怎样识别字段,或单词分界线.默认为(空格.制表符.换号) 修改$IFS: [xiluhua@vm-xiluhua][~/shell_scri ...
- Codeforces 746D:Green and Black Tea(乱搞)
http://codeforces.com/contest/746/problem/D 题意:有n杯茶,a杯绿茶,b杯红茶,问怎么摆放才可以让不超过k杯茶连续摆放,如果不能就输出NO. 思路:首先,设 ...
- RabbitMQ 基本概念介绍-----转载
1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...