欢迎来到天天文库
浏览记录
ID:42379552
大小:40.00 KB
页数:6页
时间:2019-09-14
《ucos修改笔记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Ucos以中断+信号量方式控制LED与软件定时器定时方式控制LED练习笔记这两天,在学习如何在ucos系统组织程序。由于对ucos的了解较为笼统,所以先以LED控制来练习使用。练习1:使用按键中断发出信号量来控制LED;练习2:使用定时器控制LED。开发板硬件连接简介:软件环境:ADS1.2处理器:S3C2440LED连接:GPB的5、6、7、8四个引脚控制四个LED的1、2、3、4,输出低电平点亮LED。按键连接:K1接GPG11,作为外中断EINT19;K2接GPG3,作为中断EINT11;K3接GPF2
2、,作为外中断EINT2;K4接GPF0,作为外中断EINT0。练习1:在本练习中,只是为了示意性的了解中断如何使用信号量来控制程序的运行,所以,仅使用K3、K4两个按键来控制LED3、LED4。首先,要使能信号量。即#defineOS_SEM_EN1定义两个信号量OS_EVENT*Semp1;OS_EVENT*Semp2;编写两个中断函数:voidExtint0_isr(void){rSRCPND=rSRCPND;rINTPND=rINTPND;清楚终端相关的标志位,为下一次中断作准备OSSemPost(Se
3、mp1);释放信号量}voidExtint2_isr(void){rSRCPND=rSRCPND;rINTPND=rINTPND;OSSemPost(Semp2);}初始化中断:voidExtinit(void){rGPFCON=(rGPFCON&0xFFCC)
4、0x0022;rEXTINT0=(rEXTINT0&0xFFFFF8F8)
5、0x00000202;rINTMSK&=0xFFFFFFFA;以上为设置GPF的0和2引脚为中断方式,边沿触发,打开中断屏蔽;pISR_EINT0=(U32)Extint0_
6、isr;/*使中断向量指向中断函数,中断函数的名称命名无所谓,但是必须放到底层设置的该中断向量的位置,在此为”pISR_EINT0/1”,且标记为32位地址;*/pISR_EINT2=(U32)Extint2_isr;}在主程序中,先初始化ucos后,即可初始化中断以及创建信号量,创建信号量必须在初始化ucos之后进行。Extinit();Semp1=OSSemCreate(0);Semp2=OSSemCreate(0);然后在创建的任务中使用信号量Voidtask1(void*pdata){While(1)
7、{OSTimeDly(OS_TICKS_PER_SEC*3);rGPBDAT&=0x6FF;OSTimeDly(OS_TICKS_PER_SEC*3);rGPBDAT
8、=0x7FF;}}Voidtask2(void*pdata){While(1){OSTimeDly(OS_TICKS_PER_SEC*3);rGPBDAT&=0x77F;OSTimeDly(OS_TICKS_PER_SEC*3);rGPBDAT
9、=0x7FF;}}使用ucos中的延时函数会调用任务切换,也就是说在延时完设置的时间后任务管理器会根
10、据最高优先级任务进行切换,可能延时之后不运行本任务,只是将本任务放入就绪状态。所以,如果是有具体时间要求的位置,感觉不适合使用OSTimeDly,可以使用定时器或者自编写的延时函数。练习一的主要部分就是这样的。在刚开始写的时候,遇到了些不顺利,例如由于粗心大意而导致的对LED引脚的设置错误等,同时,由于我板子的按键粘连的问题,不能在按下后快速返回,导致过中断函数被重复触发,而使程序不能正常运行的问题,于是在中断中加入了一段时间的延时后才去清除中断标志位,这样就正常了。刚开始写完的时候,进行测试,在软件环境下编
11、译没有问题,然后下载到板子的内存中执行,竟然不能运行,各个任务都不执行。就先将中断部分以及涉及到信号量的部分去掉,再次运行,程序正常。反复检查被去掉的部分,没有找到明显的问题,开始一条指令一条指令的去掉注释,检查问题,发现和程序的位置有关,将相关的程序行进行了位置调整,运行正常。最主要的是建立信号量等,必须要在初始化ucos之后。练习二:使用ucos的软件定时器控制LED在练习一上说了,因为使用ucos里面的延时会发生程序调度,如果不想程序被调度,必须使用定时器或者自己编写的函数来处理延时问题。定时器本身可以
12、很准确的进行定时,但是感觉不适合使用的太多,而大一些的程序往往有很多需要不同时间延时的地方,如果全部使用定时器,可能会因为建立定时器相关结构而造成太多不必要的内存浪费,本练习只是为了了解一下定时器的使用。使能定时器#defineOS_TMR_EN1建立定时器相关变量OS_TMR*tLEDa;指向定时器结构的指针OS_TMR*tLEDb;U8cnt1,cnt2;程序中计数用INT8Uerr;指向错误的
此文档下载收益归作者所有