打印

采用SmallRTOS为STM32F4开发板编写Led跑马灯示例

[复制链接]
214|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
道子|  楼主 | 2018-7-30 10:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开发环境:IAR Embedded Workbench / Keil
SmallRTOS版本:V1.00
开发板:STM32F4

功能简介:采用微型嵌入式实时操作系统SmallRTOS创建控制任务CtrlTask,led任务Led1Task、Led2Task及相关同步信号量Led1SemHandle、Led2SemHandle等,由控制任务CtrlTask通过时间休眠的方式SRTaskuSleep控制Led灯的闪烁间隔,并通过Led1SemHandle、Led2SemHandle等信号量同步led任务Led1Task、Led2Task,实现led跑马灯的实验;

相关代码如下所示:

[mw_shl_code=c,true]/*****************************************************************************************************
SmallRTOS - Copyright (C) 2012~2015 SmallRTOS.ORG

http://www.SmallRTOS.org - Documentation, latest information, license and contact details.
http://www.SmallRTOS.com - Commercial support, development, porting, licensing and training services.
http://www.SmallRTOS.net - Forum, question and ask.
******************************************************************************************************/

/* Hardware and starter kit includes. */
#include "iar_stm32f407zg_sk.h"
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"

//SmallRTOS
#include "SmallRTOS.h"

SRTASK_HANDLE                   Led1TaskHandle          = NULL;
SRTASK_HANDLE                   Led2TaskHandle          = NULL;
SRTASK_HANDLE                   CtrlTaskHandle          = NULL;
SRSEMAPHORE_HANDLE              Led1SemHandle           = NULL;
SRSEMAPHORE_HANDLE              Led2SemHandle           = NULL;

static void Led1Task( void *pvParameters );
static void Led2Task( void *pvParameters );
static void CtrlTask( void *pvParameters );
static void prvSetupHardware( void );

int main()
{
    prvSetupHardware();
    // 创建同步信号量
    Led1SemHandle         = SRCreateSemaphore("Led1");
    Led2SemHandle         = SRCreateSemaphore("Led2");   
    // 创建任务
    Led1TaskHandle = SRCreateTask(Led1Task, NULL, SRLOWEAST_PRIORITY+1,256,"Led1Task",eTaskStateReady);
    Led2TaskHandle = SRCreateTask(Led2Task, NULL, SRLOWEAST_PRIORITY+1,256,"Led2Task",eTaskStateReady);  
    CtrlTaskHandle = SRCreateTask(CtrlTask, NULL, SRLOWEAST_PRIORITY+1, 256, "CtrlTask",eTaskStateReady);
   
    // Start the scheduler.
    SRTaskStartScheduler();

    //if everything is ok, can't reach here
    for( ;; );
        
    return 0;
}

void vParTestInitialise( void )
{
        /* Initialise all four LEDs that are built onto the starter kit. */
    STM_EVAL_LEDInit( LED1 );
    STM_EVAL_LEDInit( LED2 );
}

static void prvSetupHardware( void )
{
    /* Setup STM32 system (clock, PLL and Flash configuration) */
    SystemInit();

    /* Ensure all priority bits are assigned as preemption priority bits. */
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

    /* Setup the LED outputs. */
    vParTestInitialise();

    /* Configure the button input.  This configures the interrupt to use the
    lowest interrupt priority, so it is ok to use the ISR safe SmallRTOS API
    from the button interrupt handler. */
    STM_EVAL_PBInit( BUTTON_USER, BUTTON_MODE_EXTI );
}

static void CtrlTask( void *pvParameters )
{
  for(;;)
  {
    SRTaskuSleep(0, 500);//休眠500毫秒
    SRSemaphorePost(Led1SemHandle);
    SRTaskuSleep(0, 500);//休眠500毫秒
    SRSemaphorePost(Led2SemHandle);
  }
}

static void Led1Task( void *pvParameters )
{
  for(;;)
  {
    SRSemaphorePend(Led1SemHandle, SRPEND_MAX_TICKS);
    STM_EVAL_LEDToggle( LED1 );   
  }
}

static void Led2Task( void *pvParameters )
{
  for(;;)
  {
    SRSemaphorePend(Led2SemHandle, SRPEND_MAX_TICKS);
    STM_EVAL_LEDToggle( LED2 );
  }  
}
[/mw_shl_code]

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

444

主题

448

帖子

0

粉丝