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

共40条 3/4 1 2 3 4 跳转至
高工
2013-07-05 00:16:09     打赏
21楼

高工
2013-07-05 01:02:44     打赏
22楼

实验十一 周期性处理

这个实验很简单,主要为了验证周期性的调用任务这种功能。

我个人理解可以看成一种定时软中断,一旦一个周期结束,软中断就会调用相关的任务或函数,实验代码里面是CycHandler()。

这里不得不提两个概念:周期时间和周期相位。

周期时间,是指相邻2次激活的时间间隔;而周期相位,则是指调用tk_cre_cyc到第一次激活的时间间隔。

周期相位是个很有意思的咚咚,要吃透它,还得仔细看看讲义和内核规范。

这里要注意,一个周期性处理任务没有被激活,调用tk_sta_cyc也是无法使它运行的。

如果cycatr里面没有指定TA_PHS,那么系统会在调用tk_cre_cyc后经过cycphs时间(也就是周期相位)后,由tk_sta_cyc来激活和运行;如果cycatr里面指定了TA_PHS,那么调用tk_cre_cyc后经过cycphs时间(也就是周期相位)后,周期性处理任务会一直保持在激活状态,等待tk_sta_cyc来调用。貌似系统默认的是TA_STA,也就是一旦创建周期性处理任务,立马激活。

可以尝试验证一下这个分析,实验代码中总的时间是20S,如果我们将ccyc.cycphs赋值为5000000mS并将ccyc.cycatr=TA_HLNG|TA_PHS,那么周期性任务CycHandler()在整个程序时间内一直未被激活,即使调用tk_sta_cyc,它也无法运行。

上图:


系统压根就没执行CycHandler(),这个周期相位就很好理解了。

实验代码里面有个延时函数Delay(CFN_TIMER_CLOCK*1000*1000);值得引起注意,查看定义

EXPORT void Delay(UW count)
{
    for(;count>0;count--);
}

#define CFN_TIMER_CLOCK           168U           /* Timer clock input (MHz)£¬select MCK */
Delay()只是简单的一个for语句,而CFN_TIMER_CLOCK则表示选择MCU的主频,取值为168.

呃,我现在的实验平台是STM32F407VG,主频是168MHz。

那么这个延时函数是如何完成20s的延时呢?

秘密在下面:

进入DeBug,发现这个Delay()函数被编译成4句ASM,明朗了,那么Delay(1)至少就要经过4个机器周期。

而一个机器周期是(1/168兆)s,再加上CFN_TIMER_CLOCK*5*1000*1000=168X5X1000X1000=5X168兆。

那么Delay(CFN_TIMER_CLOCK*1000*1000)所经历的时间就应该是(1/168兆)X5X168兆X4=20s

呃,我只是觉得有必要搞清楚程序里面延时的情况。

上实验结果图:


很常规,加上上面的分析,不解释。


实验十一思考题


1) 改变延时时间,运行程序,测试周期性处理时间的准确性!

有了前面的思考和分析,这个问题并不难。

修改Delay(CFN_TIMER_CLOCK*5*1000*1000)变成Delay(CFN_TIMER_CLOCK*15*1000*1000),延时变成60秒。

那么周期性处理任务应该被调用6次。

RunRun看:

灰常准确的执行次数,坑的是跑了1分钟。。。。



TBC......



高工
2013-07-05 12:43:13     打赏
23楼

标准库的printf函数还是自己写的?

个人感脚,都差不多。 


高工
2013-07-08 22:51:58     打赏
24楼

实验十二 警报处理

警报处理的工作流程十分好理解,指在特定长度的时间后,启动一个特定的事件处理程序。

和前面几个实验非常类似,基本方法就是创建、启动、查询和结束。

但是需要注意的一点是,只有启动了警报程序,系统才开始针为警报计时,到达所设定的时间长度后,警报处理程序才会被调用。

不多说,上实验结果:

实验代码中tk_sta_alm(almid,30000)将警报时间设置为30000ms,也就是调用tk_sta_alm函数30s后才执行AlarmHandler()。

程序中的延时Delay(0x100000)在30ms左右,打印信息会很多,所以这里设置了一个static变量UW timer = 168(我用的是STM32F407),再修改Delay(timer*1000*250),这样得到的延时是1s,打印信息就清晰多了。

细心的筒子可能发现第27s的打印信息不见了。呃,系统运行的误差吧,如果要精确打印的话,还是使用上个实验所提到的周期处理方式相对比较精确。


实验十二 警报处理思考题

1) 减小警报时间,看看最小的警报时间能够有多少?

报警时间主要由ER ercd = tk_sta_alm ( ID almid, RELTIM almtim ) ;后面那个参数决定。

貌似都是ms级的,直接修改就能实验了。

1ms


0.999999ms


从打印信息来看,1ms还能正常按顺序执行主函数,小于1ms警报服务程序就直接被调用了。

可见最小的警报时间为1ms。


TBC......


高工
2013-07-09 21:43:51     打赏
25楼

丫的,电脑坏了。。。。。。

悲催啊。。。。。。。。


高工
2013-07-12 23:56:29     打赏
26楼

winxp的笔记本内存葛屁鸟(主机最难坏的东东居然坏了),DDR2的条子现在难买,win8的环境又不适合玩。进退两难啊。

还好上某宝淘了2条,就要到货鸟。不过uTenux的中断,我看了蛮久,没看出啥道道,看来有个大老虎在前面鸟。 


高工
2013-07-16 01:05:48     打赏
27楼

电脑原地满状态复活。

捣鼓了一晚上中断才理清,睡一觉起来再整理。

mark.


高工
2013-07-16 17:32:58     打赏
28楼

实验十三 中断管理

很早以前就明白,如果不会用中断,就不要说会用MCU。中断的地位可见一斑。

μTenux提供了很灵活的中断管理方式,但是注意,中断到来的时候,μTenux不再进行任务调度了,除非在调用tk_ret_int()之后。

系统限制的中断编号是0-255,其实查看中断向量表,还有很多可以用户自定义的余地。

μTenux系统中,管理中断的函数主要有tk_def_int(UINT dintno,T_DINT* pk_dint)和tk_ret_int()。

特别注意tk_def_int(),它讲一个地址为pk_dint的应用程序在系统中注册为中断号为dintno的中断服务程序。这里仅仅是注册和定义。

这里厘清一下μTenux中断的工作流程:DI()禁止中断——tk_def_int()定义中断——EI()使能中断——打开或触发中断——进入中断服务程序。

实验代码采用的是不可屏蔽中断,并用PendNMI()函数手动打开中断。

实验结果图:


实验代码中9次任务循环,每次循环都打开一次NMI并调用中断服务程序。

基本上和打印信息一致。



1) 实验选取的是不可屏蔽异常 NMI ,选取一个外设中断,考虑如何修改?


无论是NMI还是外设中断,都必须完成中断的基本流程。

DI()禁止中断——tk_def_int()定义中断——EI()使能中断——打开或触发中断——进入中断服务程序。

在这里吃了不少苦头,一直以为调用tk_def_int()函数,就能够完成中断的打开。其实不然,tk_def_int()函数仅仅是完成中断服务程序在μTenux系统中的定义注册功能,除此之外,打开中断还必须要配置目标MCU的相关中断寄存器

不知道μTenux里面如何进行相关操作的,LZ在这里是加载了stm32F4xx的标准库,然后进行NVIC配置的。

这里具体的配置方法,请猛啃stm32F4xx的标准库相关文件。

或者参照军爷的牛帖:http://forum.eepw.com.cn/thread/232031/3#28

这里选择Usart3_IRQn,适当修改程序。建立一个9次循环的任务,每次打开一次中断,9次结束后系统关闭。

直接上图:

打印信息和外设中断全部都是Usart3,每次Usart3接收到数据,都会调用中断函数。

由键盘输入10次,前9次并完成9次中断服务程序的调用,最后1次键盘输入使μTenux系统shutdown。



高工
2013-07-22 12:39:00     打赏
29楼

军爷,这货硬件研究有啥心得,分享一下啊。

功能越多,寄存器越复杂,我算是眼花了


高工
2013-07-27 21:07:55     打赏
30楼

这几天在折腾uloong的板子,计划在外设驱动库的基础上,用μTenux进行项目的实现。

想在μTenux的基础上加载Sam3s官方的驱动库,没成功,编译老是出问题,头大

看来对编译环境和C语言的理解有待提高啊。

请坛子里大神们开贴科普一下呀。

休息放松一下,去爱特梅尔官网上转转,发现有DEMO程序,下来玩玩。

顺道贴一下Jlink-Flash的基本用法吧。

先上官方DEMO的源码和bin文件。

——回复可见内容——


打开bin压缩包,里头有个txt说明文档:


1/ Using the USB connection, burn the file demo.bin with SAM-BA at the 
   beginning of SAM3S flash (address 0x400000). Set the GPNVM "Boot from 
   Flash".
2/ Power OFF and ON the board with the USB cable always connected.
3/ A new Removable Disk should appear in the computer explorer.
4/ Copy the demo folder in the root directory of this removable disk : a
   demo folder should appear in it.
5/ When the copy operation is achieved, disconnect the USB cable, and 
   Power OFF and ON the board.
6/ The first screen of the demo ask for Touch Screen calibration, please 
   do this step carefully and then the demo is fully operational.


大致意思是用SAM-BA软件烧写bin文件,烧写结束会发现一个可移动磁盘,然后将源代码文件夹下面的demo文件夹拷到这个可移动磁盘根目录下,掉电重启,即可运行DEMO。

LZ的SAM-BA软件发现不了这块EK,改用Jlink-Flash软件。

打开Jlink-Flash

File-New Project新建下载工程

Option-Project settings-CPU按下图顺序设置目标芯片:


Target-connect就能正常连接上目标芯片

File-Open data file,选择压缩包里头的  sam3s_demo_1.4.bin文件。

这个时候会弹出一个对话框,填上起始地址400000:

按下F6烧写bin文件,ok后,掉电重启,电脑会发现一个122MB、FAT32格式的可移动磁盘,貌似是由板载NAND Flash+Sam3S4C构成的。

将源代码文件中sam3s-ek_demo_1.4\demo\resources\disk目录下demo文件夹全部拷到这个移动硬盘中。

掉电重启,DEMO程序就可以正常运行了。

如果不拷贝这个demo文件夹,DEMO程序就会没有图标哟。

上视频:


视频地址:http://player.youku.com/player.php/sid/XNTg4MjQ5NTY0/v.swf

在DEMO运行过程中,很悲催的发现,QTouch板的K2键(向左键)是无法正常工作的,不知是不是硬件问题。

前段时间有筒子在坛子里反应说这块液晶屏画圆有问题。

ATMEL官方DEMO里面有测试画圆的例子,还是挺圆的。



共40条 3/4 1 2 3 4 跳转至

回复

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