蹄牛操作系统TINIUX
ROS中文社区
查看: 2423|回复: 1

SmallRTOS在Xilinx(赛灵思)Zynq平台上的示例编译运行教程

[复制链接]
发表于 2015-8-17 22:22:58 | 显示全部楼层 |阅读模式
本帖最后由 RTOS 于 2015-8-21 21:06 编辑

SmallRTOS在Xilinx(赛灵思)Zynq平台示例编译运行教程

微型嵌入式实时操作系统SmallRTOS官方已经提供了针对Zynq平台的示例工程,该示例工程可在Zedboard开发板上编译运行,也适用于ZC706、ZC702等评估板卡;

朋友们可以通过官方网站http://www.smallrtos.org下载最新版本的SmallRTOS源代码压缩包,解压后,在\Demo\CORTEX_A9_Zynq_Zedboard_SDK文件夹下即可看到针对Zynq平台的示例工程SmallRTOSDemo。

该示例工程可以直接在SDK(如果你还不知道SDK是什么开发工具,你可以关闭本教程了……)中编译。启动SDK时,把工作路径指向\Demo\CORTEX_A9_Zynq_Zedboard_SDK,则启动完毕后则可以看到SDK中已经打开了三个工程:一个为design_1_wrapper_hw_platform,其为FPGA生成的顶层设计包;一个为SmallRTOS_bsp,其为板级支持包;一个为SmallRTOSDemo,其为应用程序,亦即SmallRTOS的演示工程。这三个工程亦可通过导入的方式在SDK中打开。

工程打开完毕后,如果SDK提示板级支持包有问题,则可以对SmallRTOS_bsp重新生成。

朋友们可以对应用程序SmallRTOSDemo进行重新编译,编译完毕后下载到Zedboard开发板上,对该示例工程进行检测评估。

该示例工程主要演示了多任务创建、信号量创建(semaphore,有称作旗语)、多任务同步、软中断等功能,这些功能主要在main.c文件中体现;下面贴出main.c文件中的部分代码:


[C] 纯文本查看 复制代码
short                                gIntID = 1;
unsigned int                 gIntCount = 0;

SRTASK_HANDLE                 HWTaskHandle = NULL;
SRTASK_HANDLE                 GBTaskHandle = NULL;
SRTASK_HANDLE                 SimTaskHandle = NULL;
SRSEMAPHORE_HANDLE        GBSemaphoreHandle = NULL;

static void TaskHelloWorld( void *pvParameters );
static void TaskGoodBye( void *pvParameters );
static void TaskSimulateInterrupt( void *pvParameters );
void IntTestFunction(void *CallbackRef);

int main( void )
{
    init_platform();
        fitInitializeExceptions();

        GBSemaphoreHandle = SRSemaphoreCreate(0, "GB");

        // configure and start tasks
        HWTaskHandle = SRTaskCreate(TaskHelloWorld, NULL, SRLOWEAST_PRIORITY+1, SRMINIMAL_STACK_SIZE, "HW", eTaskStateReady );
        GBTaskHandle = SRTaskCreate(TaskGoodBye, NULL, SRLOWEAST_PRIORITY+1, SRMINIMAL_STACK_SIZE, "GB", eTaskStateReady );
        SimTaskHandle = SRTaskCreate(TaskSimulateInterrupt, NULL, SRLOWEAST_PRIORITY+1, SRMINIMAL_STACK_SIZE, "SimInt", eTaskStateReady );

        /* Start the tasks and timer running. */
        SRStartScheduler();

        for( ;; );

    cleanup_platform();
    return 0;
}

//interrupt;
void SRSetupHardware( void )
{
        gpInterruptController = fitGetInterruptControllerInstance();

        //Config software Interrupt
        ConfigInterrupt(0, IntTestFunction, gIntID);
}

//interrupt function
void IntTestFunction(void *CallbackRef)
{
        gIntCount += 1;
}

static void TaskSimulateInterrupt( void *pvParameters )
{

        for( ;; )
        {
                xil_printf("Task Simulate Interrupt\r\n");
                SRTaskuSleep(0, 200);
                XScuGic_SoftwareIntr(gpInterruptController, gIntID, XSCUGIC_SPI_CPU0_MASK);
        }
}

static void TaskHelloWorld( void *pvParameters )
{

        for( ;; )
        {
                xil_printf("Hello World\r\n");
                SRSemaphorePost(GBSemaphoreHandle);
                SRTaskuSleep(0, 200);
        }
}

static void TaskGoodBye( void *pvParameters )
{
        for( ;; )
        {
                xil_printf("Good Bye\r\n");
                SRSemaphorePend(GBSemaphoreHandle, SRPEND_FOREVER_VALUE);
                //do something here
        }
}



在main函数中,首先对平台进行初始化等操作。接着调用SRSemaphoreCreate()函数,创建了一个信号量,用于任务之间的同步通信;接着调用系统接口函数SRTaskCreate()创建了三个任务,整个演示程序简单明了。朋友们可以通过JTAG下载到Zedboard板卡上在线运行,通过设置断点查看几个任务的运行次序。

示例中通过函数ConfigInterrupt()配置了一个软中断,中断服务函数为IntTestFunction();该软中断的触发源在任务TaskSimulateInterrupt中,可以看到,该任务每间隔200ms调用一次XScuGic_SoftwareIntr(gpInterruptController, gIntID, XSCUGIC_SPI_CPU0_MASK),中断服务函数也就每200ms响应一次。
回复

使用道具 举报

 楼主| 发表于 2015-8-17 23:16:50 | 显示全部楼层
本帖最后由 RTOS 于 2015-8-18 13:50 编辑

如果不采用示例工程,则怎么把SmallRTOS系统移植到Zynq平台上呢?

请参考论坛另一篇教程,SmallRTOS在Xilinx(赛灵思)Zynq平台上的移植:
http://www.robotos.net/thread-2416-1-1.html


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|智能硬件开发社区 ( 京ICP备14010787号 )

GMT+8, 2019-4-20 23:06 , Processed in 0.066058 second(s), 16 queries .

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表