

实验十一 周期性处理
这个实验很简单,主要为了验证周期性的调用任务这种功能。
我个人理解可以看成一种定时软中断,一旦一个周期结束,软中断就会调用相关的任务或函数,实验代码里面是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......

实验十二 警报处理
警报处理的工作流程十分好理解,指在特定长度的时间后,启动一个特定的事件处理程序。
和前面几个实验非常类似,基本方法就是创建、启动、查询和结束。
但是需要注意的一点是,只有启动了警报程序,系统才开始针为警报计时,到达所设定的时间长度后,警报处理程序才会被调用。
不多说,上实验结果:
实验代码中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......

实验十三 中断管理
很早以前就明白,如果不会用中断,就不要说会用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。

这几天在折腾uloong的板子,计划在外设驱动库的基础上,用μTenux进行项目的实现。
想在μTenux的基础上加载Sam3s官方的驱动库,没成功,编译老是出问题,头大。
看来对编译环境和C语言的理解有待提高啊。
请坛子里大神们开贴科普一下呀。
休息放松一下,去爱特梅尔官网上转转,发现有DEMO程序,下来玩玩。
顺道贴一下Jlink-Flash的基本用法吧。
先上官方DEMO的源码和bin文件。
——回复可见内容——
1/ Using the USB connection, burn the file demo.bin with SAM-BA at the
LZ的SAM-BA软件发现不了这块EK,改用Jlink-Flash软件。
打开Jlink-Flash
File-New Project新建下载工程
Option-Project settings-CPU按下图顺序设置目标芯片:
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程序就会没有图标哟。
上视频:
在DEMO运行过程中,很悲催的发现,QTouch板的K2键(向左键)是无法正常工作的,不知是不是硬件问题。
前段时间有筒子在坛子里反应说这块液晶屏画圆有问题。
ATMEL官方DEMO里面有测试画圆的例子,还是挺圆的。
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。
Target-connect就能正常连接上目标芯片
视频地址:http://player.youku.com/player.php/sid/XNTg4MjQ5NTY0/v.swf
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |