⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 app.c

📁 ucosii是一个简单易学的嵌入式实时操作系统
💻 C
字号:
/*
*************************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                                         ATmega128  Sample code
*
* File : APP.C
* By   : Jean J. Labrosse
*************************************************************************************************************
*/

#include  <includes.h>

/*
**************************************************************************************************************
*                                               CONSTANTS
*
* Note(s) : 1) See OS_CFG.H for the default stack size: 'OS_TASK_STK_SIZE'
**************************************************************************************************************
*/

#define  CPU_CLK_FREQ                  3684000L


#define  OS_TASK_START_STK_SIZE        OS_TASK_STK_SIZE
#define  OS_TASK_START_HARD_STK_SIZE   OS_TASK_HARD_STK_SIZE

#define  OS_TASK_1_STK_SIZE            OS_TASK_STK_SIZE
#define  OS_TASK_1_HARD_STK_SIZE       OS_TASK_HARD_STK_SIZE

#define  OS_TASK_2_STK_SIZE            OS_TASK_STK_SIZE
#define  OS_TASK_2_HARD_STK_SIZE       OS_TASK_HARD_STK_SIZE


/*
**************************************************************************************************************
*                                               VARIABLES
**************************************************************************************************************
*/

OS_STK  AppTaskStartStk[OS_TASK_START_STK_SIZE];
OS_STK  AppTask1Stk[OS_TASK_1_STK_SIZE];
OS_STK  AppTask2Stk[OS_TASK_2_STK_SIZE];

/*
**************************************************************************************************************
*                                           FUNCTION PROTOTYPES
**************************************************************************************************************
*/

       void  main(void);
       
static void  AppTaskStart(void *p_arg);
static void  AppTaskCreate(void);
static void  AppTask1(void *p_arg);
static void  AppTask2(void *p_arg);

static void  AppIOInit(void);

static void  LED_Toggle(INT8U led);
 
/*
**************************************************************************************************************
*                                                MAIN
*
* Note(s): 1) You SHOULD use OS_TASK_STK_SIZE (see OS_CFG.H) when setting OSTaskStkSize prior to calling 
*             OSInit() because OS_TASK_IDLE_STK_SIZE and OS_TASK_STAT_STK_SIZE are set to this value in
*             OS_CFG.H.
**************************************************************************************************************
*/

void  main (void)
{
    /*---- Any initialization code prior to calling OSInit() goes HERE --------------------------------*/

                                                /* IMPORTANT: MUST be setup before calling 'OSInit()'  */
    OSTaskStkSize     = OS_TASK_STK_SIZE;       /* Setup the default stack size                        */
    OSTaskHardStkSize = OS_TASK_HARD_STK_SIZE;  /* Setup the default hardware stack size               */

    OSInit();                                   /* Initialize "uC/OS-II, The Real-Time Kernel"         */

    /*---- Any initialization code before starting multitasking ---------------------------------------*/

    OSTaskStkSize     = OS_TASK_START_STK_SIZE;       /* Setup the total stack size                    */
    OSTaskHardStkSize = OS_TASK_START_HARD_STK_SIZE;  /* Setup the hardware stack size                 */
    OSTaskCreate(AppTaskStart, (void *)0, (OS_STK *)&AppTaskStartStk[OSTaskStkSize - 1], 0);

    /*---- Create any other task you want before we start multitasking --------------------------------*/

    OSStart();                                  /* Start multitasking (i.e. give control to uC/OS-II)  */
}

/*
*********************************************************************************************************
*                                          STARTUP TASK
*
* Description : This is an example of a startup task.  As mentioned in the book's text, you MUST
*               initialize the ticker only once multitasking has started.
*
* Arguments   : p_arg   is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

static void  AppTaskStart (void *p_arg)
{
    p_arg = p_arg;                               /* Prevent compiler warnings                          */

    OSTickISR_Init();                            /* Initialize the ticker                              */

    AppIOInit();                                 /* Initialize the I/Os                                */

    AppTaskCreate();

    while (TRUE) {                               /* Task body, always written as an infinite loop.     */
        LED_Toggle(1);
        OSTimeDly(OS_TICKS_PER_SEC / 10);
    }
}


/*
*********************************************************************************************************
*                                    CREATE APPLICATION TASKS
*
* Description : This function creates the application tasks.
*
* Arguments   : p_arg   is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

static  void  AppTaskCreate (void)
{
    /*---- Task initialization code goes HERE! --------------------------------------------------------*/
    OSTaskStkSize     = OS_TASK_1_STK_SIZE;        /* Setup the default stack size                     */
    OSTaskHardStkSize = OS_TASK_1_HARD_STK_SIZE;   /* Setup the default hardware stack size            */
    OSTaskCreate(AppTask1, (void *)0, (OS_STK *)&AppTask1Stk[OSTaskStkSize - 1], 1);

    OSTaskStkSize     = OS_TASK_2_STK_SIZE;        /* Setup the default stack size                     */
    OSTaskHardStkSize = OS_TASK_2_HARD_STK_SIZE;   /* Setup the default hardware stack size            */
    OSTaskCreate(AppTask2, (void *)0, (OS_STK *)&AppTask2Stk[OSTaskStkSize - 1], 2);
}

/*
*********************************************************************************************************
*                                              TASK #1
*********************************************************************************************************
*/

static void  AppTask1(void *p_arg)
{
    p_arg = p_arg;
    while (TRUE) {
        LED_Toggle(2);
        OSTimeDly(OS_TICKS_PER_SEC / 5);
    }
}

/*
*********************************************************************************************************
*                                              TASK #2
*********************************************************************************************************
*/

static void  AppTask2(void *p_arg)
{
    p_arg = p_arg;
    while (TRUE) {
        LED_Toggle(3);
        OSTimeDly(OS_TICKS_PER_SEC / 2);
    }
}

/*
*********************************************************************************************************
*                                            SETUP THE I/Os
*********************************************************************************************************
*/

static void AppIOInit (void)
{
    DDRD        = 0xFF;                                 /* All PORTD pins are outputs                  */
    PORTD       = 0xFF;
}

/*
*********************************************************************************************************
*                                        SETUP THE TICK RATE
*********************************************************************************************************
*/

void  OSTickISR_Init (void)
{
    TCCR0 = 0x07;                                       /* Set TIMER0 prescaler to CLK/1024            */
    TIMSK = 0x01;                                       /* Enable TIMER0 overflow interrupt            */
}


/*
*********************************************************************************************************
*                                        SETUP THE TICK RATE
*********************************************************************************************************
*/

void  OSTickISR_Handler (void)
{
    TCNT0 = 256 - (CPU_CLK_FREQ / OS_TICKS_PER_SEC / 1024);
    OSTimeTick();
}

/*
*********************************************************************************************************
*                                          TOGGLE LED
*********************************************************************************************************
*/

static  void  LED_Toggle (INT8U led)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    OS_ENTER_CRITICAL();
    switch (led) {
        case 1:
             PORTD ^= 0x01;
             break;

        case 2:
             PORTD ^= 0x02;
             break;

        case 3:
             PORTD ^= 0x04;
             break;

        case 4:
             PORTD ^= 0x08;
             break;
    }
    OS_EXIT_CRITICAL();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -