第4步程序的AXI定时器0的ucos_axitimer驱动程序
对于一些外围设备,Micrium公司经销的自定义驱动,通常被设计为线程安全的通过RTOS服务使用。例如,ucos_axitimer主要作用是充当MicroBlaze的系统的内核时基的驱动。这些驱动程序可供一般使用的便利性。
在这个步骤中,您将创建一个新的内核任务在等待一个信号量定期发布的中断服务程序。这ISR将通过AXI定时器0使用ucos_axitimer被触发。在步骤5中相同的操作将使用Xilinx独立驱动来完成。
为清楚起见由各个内核函数返回的错误码在下列实施例,不检查。错误应该通常在最终应用进行验证。
1.创建一个新的任务和信号量。
第一步是声明的任务功能,它的TCB(任务控制块)和堆栈空间邻近app.c.的顶 与此同时,我们需要在这个例子中名为Timer0Semaphore一个信号。
无效 Timer0Task(无效 * p_arg);
OS_TCB Timer0TCB;
CPU_STK Timer0TaskStk [512];
OS_SEM Timer0Semaphore;
上市 - 定时器0声明的任务
在μC/ OS-III裸任务是一个简单的功能,Timer0Task在这个例子中。为了帮助演示,我们可以在新的任务开始加UCOS_Print(),以确保它已成功创建。请参阅 因为我们不希望此任务返回时(1)在接近函数的末尾添加。
无效 Timer0Task(无效 * p_arg)
{
OS_ERR os_err;
UCOS_Print(“Timer0Task达到 r N” );
而 (1) {
}
}
上市 - 定时器0任务骷髅
该UCOS_Print()的实现是重入(线程安全的),这意味着它可以从多个任务被称为无特殊同步。
信号量是用在本实施例中,等待来自计时器的信号。创建于μC/ OS-III信号量是一个简单的函数调用,如图 上市-定时器0信号灯创建
OSSemCreate(Timer0Semaphore, “ 定时器0信号灯” ,0,&os_err);
上市 - 定时器0信号灯创建
定时器0的任务可以挂起(等待)这个信号量一旦它与OSSemPend()创建和输出的东西在终端上时,它发出信号。最后的任务应与OSTaskCreate()函数调用创建 列表-定时器0任务显示的主要和Timer0任务的当前内容。
无效 MainTask的(无效 * p_arg)
{
OS_ERR os_err;
UCOS_Print( “ 你好从主要任务 r ñ世界” );
OSSemCreate(Timer0Semaphore, “ 定时器0信号灯” ,0,&os_err);
OSTaskCreate(Timer0TCB,
“定时器0的任务” ,
Timer0Task,
DEF_NULL ,
10,
Timer0TaskStk,
0,
512,
0,
0,
DEF_NULL ,
0,
&os_err);
而 (DEF_TRUE ){
OSTimeDlyHMSM(0,0,10,0,OS_OPT_TIME_HMSM_STRICT,&os_err);
UCOS_Print( “ 定期输出的主要任务 r ñ每10秒” );
}
}
无效 Timer0Task(无效 * p_arg)
{
OS_ERR os_err;
UCOS_Print(“Timer0Task达到 r N” );
而 (1) {
OSSemPend(Timer0Semaphore,0,0,DEF_NULL ,&os_err);
UCOS_Print( “ 定时器0旗语信号 r N” );
}
}
上市 - 定时器0任务
运行该程序现在将显示定时器0元起拍,但对未决信号无限期由于定时器尚未配置。
2.配置AXI定时器0信号定时器0信号。
Micrium公司定制的驱动程序通常注册了一个默认的中断处理函数时初始化。中断源是从硬件设计中扣除。在ucos_axitimer驱动程序有可能注册一个回调的情况下,要调用的中断触发时。使用该功能显示在
无效 Timer0ISR(AXITIMER_HANDLE手柄,CPU_INT32U tmr_nbr)
{
OS_ERR os_err;
OSSemPost(Timer0Semaphore,0,&os_err);
}
上市 - 定时器0 ISR
该ISR只是张贴定时器0信号。
最后一步是配置AXI定时器。驾驶员的公共API可以通过包括访问ucos_axitimer.h头文件app.c. Micrium的司机都围绕这是由不同的初始化函数返回的句柄。 上市-定时器0手柄宣言表明的AXI定时器申报办理定时器0。
AXITIMER_HANDLE定时器0;
上市 - 定时器0声明手柄
要配置定时器必须首先进行初始化,然后配置为倒计时,自动重装定时器启用中断。在硬件设计的定时器由一个50MHz的时钟驱动,我们将使用100万美元的负载值给予2秒的延时中断之间 上市-定时器0设置
定时器0 = AXITimer_Init (0);
AXITimer_OptSet(定时器0,0,AXITIMER_OPT_DOWN | AXITIMER_OPT_AUTO_RELOAD | AXITIMER_OPT_INT);
AXITimer_LoadSet(定时器0,0,亿);
AXITimer_CallbackSet(定时器0,0,Timer0ISR);
上市 - 定时器0设置
最后,计时器可以启动。 上市-定时器0开始
AXITimer_Start(定时器0,0);
上市 - 定时器0开始
3.运行应用程序。输出应该看起来像 图-定时器0端子输出。
图 - 定时器0端子输出
第5步程序的AXI定时器1与赛灵思tmrctr驱动程序
在步骤4中的Micrium定制驱动ucos_axitimer用于产生周期性中断唤醒的应用程序的任务。同样可以通过使用分布式的SDK赛灵思独立的驱动程序来实现。
当使用一个独立的驱动程序是很重要的有ucos_standalone列入项目库。此外,如果外设从多个线程所使用的必需的同步,必须由应用程序提供,或者通过使用内核信号量或互斥。
1.创建一个新的任务和信号灯类似于步骤4的1项。
2.编写一个自定义的中断服务程序定时器。
无效 Timer1ISR(无效 * p_arg,CPU_INT32U CPU)
{
CPU_INT32U ControlStatusReg;
OS_ERR os_err;
ControlStatusReg = XTmrCtr_ReadReg(Timer1.BaseAddress,
0,
XTC_TCSR_OFFSET);
XTmrCtr_WriteReg(Timer1.BaseAddress,
0,
XTC_TCSR_OFFSET,
ControlStatusReg |
XTC_CSR_INT_OCCURED_MASK);
OSSemPost(Timer1Semaphore,0,&os_err);
}
上市 - 定时器1 ISR
在μC/ OS下的原始中断程序都具有相同的签名,其中一部分只与在某些情况下。该p_arg参数是注册时中断给用户指定的参数。该CPU的说法是,所产生的中断,并且只针对相应和对的Cortex-A9产生软件中断的CPU核心ID。CPU的参数将是0在所有其他情况。
3.注册和启用自定义中断
UCOS_IntVectSet(62,0,DEF_BIT_00 ,Timer1ISR,和定时器1);
UCOS_IntSrcEn (62);
上市 - 定时器1中断配置
4.建立和运行。输出应该类似于从第4步以前的输出最终app.c文件可以在这里下载- app.c
结论
在本教程中,您创建了一个基本的ZYNQ硬件设计和写利用μC/ OS BSP一个基本的应用程序。无论是Micrium公司自定义驱动程序和Xilinx独立驱动器的使用,提出与中断处理。读者新的生态系统Micrium公司建议阅读UC-OS-III文档深入了解有关使用Micrium的实时内核。在另一方面,长期以来Micrium公司强烈建议用户检查Vivado设计套件的各种教程和培训。
评论
查看更多