这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 【8.05更新μTenux工程下1-wire总线器件二叉树算法驱动有视频+μTe

共69条 1/7 1 2 3 4 5 6 ›| 跳转至

【8.05更新μTenux工程下1-wire总线器件二叉树算法驱动有视频+μTenux学习体会】漫天飞舞的板砖进程贴

高工
2013-06-12 21:16:02     打赏
μTenux系统部分

名称 传送门 内容
第一次接触μTenux
http://forum.eepw.com.cn/thread/232434/1#6
解决L6236E等链接编译错误,初步认识工程结构
μTenux实验一(任务
http://forum.eepw.com.cn/thread/232434/1#7
使用v1.6内核源码,完成实验一及思考题
μTenux实验二(信号量)
http://forum.eepw.com.cn/thread/232434/1#9
使用v1.6内核源码,完成实验二及思考题
μTenux实验三(事件标志)
http://forum.eepw.com.cn/thread/232434/2#14
使用v1.6内核源码,完成实验三及思考题 2)。有遗留问题(中断)
μTenux实验四(消息邮箱
http://forum.eepw.com.cn/thread/232434/2#17
使用v1.6内核源码,完成实验四及思考题。有遗留问题(B无法发送优先级消息)【已解决
μTenux实验五(互斥体)
http://forum.eepw.com.cn/thread/232434/3#21
使用v1.6内核源码,完成实验五及思考题
μTenux实验六(消息缓冲区)
http://forum.eepw.com.cn/thread/232434/3#22
使用v1.6内核源码,完成实验六及思考题
μTenux实验七(集合点端口)
http://forum.eepw.com.cn/thread/232434/3#23
使用v1.6内核源码,完成实验七及思考题
μTenux实验八(固定内存池)
http://forum.eepw.com.cn/thread/232434/3#25
使用v1.6内核源码,完成实验八及思考题
μTenux实验九(可变内存池
http://forum.eepw.com.cn/thread/232434/3#28
使用v1.6内核源码,完成实验九及思考题。有遗留问题(思考题1程序跑飞)
μTenux实验十(系统时间管理)
http://forum.eepw.com.cn/thread/232434/4#31
使用v1.6内核源码,完成实验十及思考题
μTenux实验十一(周期性处理
http://forum.eepw.com.cn/thread/232434/4#36
使用v1.6内核源码,完成实验十一及思考题
μTenux实验十二(警报处理)
http://forum.eepw.com.cn/thread/232434/4#40
使用v1.6内核源码,完成实验十二及思考题
μTenux实验十三(中断管理
http://forum.eepw.com.cn/thread/232434/5#48
使用v1.6内核源码,完成实验十三及思考题
μTenux学习体会 http://forum.eepw.com.cn/thread/232434/6#59
操作系统学习心得

硬件平台部分

名称 传送门 内容
晒板帖
http://forum.eepw.com.cn/thread/231990/1
高清无码晒板图、运行英倍特DEMO
开发环境搭建
http://forum.eepw.com.cn/thread/232434/1#2
解决环境搭建过程中及JLink-V7仿真器sn校验出现的问题
运行ATMEL官方demo
http://forum.eepw.com.cn/thread/232434/6#53
Jlink-Flash基本使用方法,运行ATMEL官方demo(上视频)
μTenux任务点灯 http://forum.eepw.com.cn/thread/232434/6#54
LM4F驱动库加载,并在μTenux工程建立三个点灯任务(有图有视频)
μTenux任务点屏
http://forum.eepw.com.cn/thread/232434/6#57
移植nokia_5110的驱动,并在μTenux工程建立三个5110显示任务(有图有视频)
μT工程中项目芯片驱动 http://forum.eepw.com.cn/thread/232434/6#58
1-wire器件二叉树算法驱动(有图有视频)
μT工程中项目整体移植


写在最后 http://forum.eepw.com.cn/thread/232434/7#65
不是总结的总结





关键词: 更新     Tenux     工程     1-wire     总线     器件         

高工
2013-06-12 22:18:32     打赏
2楼

由于手头上的工具较为陈旧,这次搭建环境也是费了不少的力气,不多说,开贴分享,求高人指正。

基本环境采用的是开发套件光盘自带的软件:KEIL MDK4.6和J-Link4.68,仿真器是J-Link V7,基本上安装都没有太多问题。

光盘里MDK软件木有和谐,和谐补丁在此,有需要的筒子可以下载试试:——回复可见内容——

此和谐补丁来自互联网且纯属学习使用,如果涉及产权问题,请站内M我删除或者直接请版主删除。



安装KEIL MDK4.6和J-Link4.68完毕后,要设置相关的仿真接口(target option-Debug和Utilities中配置RDI Interface Driver),这里最容易出现一个问题,如下图:


缺少一个动态链接文件,需要的筒子可以下载试试,——回复可见内容——,解压后将agdirdi.dll文件拷贝到\Keil\ARM\BIN目录下就ok了。



手头上只有一个V7版本的Jlink,环境搭建过程中让我很受伤,也是新版J-Link软件的强制SN校验机制(尤其是针对11111117和其他几个SN),使得很多兼容版的J-link无法正常使用,现象是提示J-Link硬件仿真器为clone,然后程序闪退。


前面有TX提出降低J-Link软件的版本,这是一个解决办法,但是知道是校验SN产生的问题,就可以用一个目前看来,釜底抽薪、一劳永逸的办法,修改SN。这里要用到winhex,——回复可见内容——,用winhex打开J-Link的固件,修改2个地方,就能修改自己J-Link的SN了。

修改结束后保存,用AT91-ISP软件将修改后的固件烧录进J-Link,运行J-Link ARM,会提示firmware升级,直接不理会(以后通过Keil调用J-Link的时候都会有这个提示,一律点否),进去后就发现SN改变了,再也不用担心由于SN引起的clone问题了。

我这里SN改成了16777215(貌似有溢出),以后调试,再无问题。

V7版本J-link修改后正常,兼容版V8的筒子们也可以参考,王总表打我脸。


关于H-Jtag:如果你有USB HJtag可以在win7 64位以上操作系统使用,但是想尝试并口HJtag的话,64位系统就放弃这个想法吧,H-Jtag并口驱动不支持win7 64位以上的系统。 


折腾了好几天,老设备才能正常的用起来,高手们表藐视,请回复支持DIY精神。


高工
2013-06-12 22:27:50     打赏
3楼
v7还是rdi啊?在ads里边用过,貌似也不错的。

高工
2013-06-12 22:45:33     打赏
4楼
J-LINK / J-Trace Cortex也能用,得走SW port,我这台电脑上稍有卡顿.....

高工
2013-06-12 23:38:27     打赏
5楼
各种调试方法,能用就行!能跟踪到毛病就行

高工
2013-06-15 00:47:50     打赏
6楼

第一次接触μTenux

完成了环境的搭建,着手开始对μTenux进行了解。鄙人对嵌入式OS了解不够深入,只能从一些粗浅的地方开始学习。

打开workspace,像我这种初学者有点不适应,说实话,第一次接触好几个项目在同一个KEIL workspace下面编译开发(很有eclipse的味道)。仔细看看,一共有appusermain、kernel、libcpu、libdev、libtm和bin这6个工程在里面,后面的一些错误的操作,也和这种结构有关。

keil下这种工程结构有个很痛苦的地方,如果需要查看某个函数或变量的定义,就必须将文件所在的工程set as active project,如果某个函数或变量的定义不在当前工程,我还没找到办法查看定义,只能够用查找的方式,在整个workspace文件里面查找,不知道在其他编译环境下是什么情况,各位大侠们有什么好的解决办法?

还有一个有关工程结构整出的乌龙,原因是由于惯性思维,一直认为应用程序在appusermain工程里面编写,理所当然的下载文件也由appusermain工程生成。但实际上,工程batch build所产生hex或axf文件,必须由bin工程产生,其他工程只生成库文件,否则会出现很多类似L6236E这样的编译错误。感谢uloong公司的阿奔和龙哥,在端午节的时候还在帮忙分析解决。经过一段时间的摸索,逐渐适应了这种结构,其实感觉很严谨,蛮不错的。不知道新发布的内核源码1.6版本结构改了没。

把例程打印信息稍作修改,算是完成第一次接触μTenux。


工程结构的问题,觉得自己在嵌入式OS方面还有很长的路要走。

从下次开始,逐渐开始摸索μTenux的基本特性,譬如任务、信号量、中断等等,进一步了解μTenux。

希望通过本次活动能有所斩获,与筒子们共勉。


高工
2013-06-19 00:52:55     打赏
7楼

μTenux实验一(任务)

下载了1.6版本的源码,直奔sam3s4c的工程,顿时觉得眼睛舒服了很多,简洁明了哇。

简单看了一下内核规范,感觉需要记忆的东西太多,干脆直接读代码,有问题再去翻内核规范。

发现创建任务的时候,都会有一个taskid和E_OK的比较,翻看规范才知道,E_OK=0,使用tk_cre_tsk()函数创建任务成功的话会返回一个正值,否则返回一个负值。手痒痒,做了一个小小的修改。

build,load,打开串口,reset,一系列动作后,串口返回这么个咚咚。

看来,我分析的不错,内核规范还得时刻set to top(想去再整个显示器了……,一个不够用啊)。



实验一思考题


1) 如果打开调试支持和钩子函数(HOOK),重新构造运行,会有什么不同?

在实验代码里面,使用了很多预编译,基本上都是针对调试和钩子函数的,找到USE_DBGSPT和USE_HOOK_TRACE 的定义,从0U改成1U。

重建后,每次SVC都会打印输出相关的信息(不知道是否准确)。



2) 如何任务 C 在任务循环中不是进行循环,而是也调用 tk_slp_tsk,会出现什么情况?为什么?

无论TaskC在循环内或者去掉循环直接调用休眠,最终系统都要运行到“Push any key to shutdown the micro Tenux”。


个人理解与程序流程有关,在TaskC进入休眠态时,TaskB和TaskA也都在休眠态,那么这个时候操作系统无任务可进行调度,由于TaskC和TaskA均由TaskB执行,所以程序跳转ER TaskSample( void),并返回E_OK。追溯到调用TaskSample的usermain,下一语句已经是tm_putstring((UB*)"Push any key to shutdown the micro Tenux.\n")。至此,等键盘输入后结束。


3) 找找参考程序中有没有永远不会执行的代码?实际修改一下,看看判断的是否准确?为什么?

个人认为TaskA和TaskC中有一段代码(红框内)似乎永远无法执行。



这里的无条件循环语句for(;;)木有break或goto,只能不停地sleep,结束休眠后再从头执行for(;;)语句,为了证实我的分析,我在TaskA的for(;;)语句中加了一行tm_putstring((UB*)"Task A will start;\n"),执行后每次TaskA结束休眠态后,都仅执行循环语句。


不知道上面对思考题的分析对不对,请大牛赐教。


嵌入式操作系统的学习的确千头万绪,有好多函数和变量目前都没仔细了解到,只能把内核规范作为手册,不理解的地方猛戳手册和搜索引擎。


TBC......



专家
2013-06-19 21:58:07     打赏
8楼
支持一下

高工
2013-06-20 01:09:30     打赏
9楼

μTenux实验二(信号量)

直接读代码,按照实验教程就能得到结果,过程比较简单。直接上串口打印信息。

从打印信息来看,TaskA和TaskB轮流在对信号量进行操作。基本上符合程序的流程。



实验二思考题


1) 如何将本实验中信号量的例子改为互斥信号量?尝试修改一下!(TaskA优先级高于TaskB)

这里首先要整清楚,什么是互斥信号量。

互斥实际上就是要保证某一个资源,只能够由特定的某个任务独享,无论等待中的任务优先级高低,都必须保证当前任务独享这个资源,当前任务释放后,这个资源才能被其他任务使用。

那么互斥信号量,就是完成互斥控制的信号量。一般是一个二值参数,要么释放,要么独享。

不知道这种理解对不对。

对实验代码的信号量进行设置:csem.isemcnt = 1;csem.maxsem = 1;

并使TaskB在任务循环中不释放信号量,直接将释放信号量的代码注释掉。


完成上述处理后,理论上,TaskA不会再有机会对信号量进行操作,也就是TaskB将独享信号量的操作权,达到资源独享的互斥控制效果。但是出问题咧。


从打印信息来看,A虽然在B等待的状态下不能操作信号量,但是A挂起后,B也无法操作信号量了,系统所有任务都挂起的话,μTenux会退出(μTenux没有像μCos一样,默认有一个无法删除的Idle任务,不过可以在初始化函数中创建一个)。虽然进行了一次互斥控制,但是不够完美。

思考着能不能在TaskB的任务循环首句增加一句ercd = tk_sig_sem(semid, 1);这样可以使TaskB在任务循环开始的时候释放信号量,而在任务循环最后不释放信号量,从而使TaskA无法等到信号量,完成TaskB对资源的独享。

编译,下载,却发现打印信息和预计的相差甚远。


从打印信息来分析,虽然TaskB在TaskA执行前并未释放信号量,但是TaskA依然能够获取信号量的处理权,咋回事?

原来TaskB任务循环的首句ercd = tk_sig_sem(semid, 1);会进行一次系统调度,也就是说虽然A在等待信号量未分配到资源进入等待状态,但是B中一旦调用ercd = tk_sig_sem(semid, 1);,加之优先级A>B,A会优先于B执行,虽然B在自己的循环中释放了信号量,但是A会立刻抢占cpu运行权,对信号量进行操作。

翻查内核规范,注意到tk_wai_sem()函数的参数中有一个TMO_POL,当在 tmout 中设置 TMO_POL=0 时,表明时限值(timeout value)被设定成 0,即使没有获得资源, 也会返回 E_TMOUT,而不进入等待状态。

立马修改代码,将TaskA调用tk_wai_sem()函数时的参数改为TMO_POL=0 ,并将循环内的语句顺序烧嘴修改。使A等不到信号量后不是进入等待状态,而是进入休眠状态。而休眠态的A,无论B是否释放信号量,都无法对信号量进行操作,达到B独享的互斥控制效果。


看看运行的结果是否和预想的一致。



果然,从打印信息来看,只有TaskB在对信号量进行操作。

呃,折腾了这么久,这个算不算是互斥控制呢?请大神科普。


TBC......


高工
2013-06-20 01:15:12     打赏
10楼
多谢支持,码字很辛苦,貌似都没人来看。

共69条 1/7 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]