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

📄 app.c

📁 好东西只有这一个了汗汗汗¥·# ¥·¥#
💻 C
字号:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                         The Real-Time Kernel
*
*                             (c) Copyright 1998-2005, Micrium, Weston, FL
*                                          All Rights Reserved
*
*
*                                            ARM Sample code
*
* File : APP.C
* By   : Jean J. Labrosse
*********************************************************************************************************
*/

#include <includes.h>

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

static   OS_STK      AppTaskStartStk[APP_TASK_START_STK_SIZE];
static   OS_STK      AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE];

#if OS_TMR_EN > 0
static   OS_TMR     *AppTmrTbl[OS_TMR_CFG_MAX];
#endif

#if OS_VIEW_MODULE > 0
static   OS_EVENT   *AppTerminalMbox;          /* Mailbox to hold the value obtained from the terminal */
static   CPU_INT08U  AppViewChar;              /* Character received from OS-View                      */
#endif

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

static  void  AppTaskCreate(void);
static  void  AppTaskStart(void *p_arg);
static  void  AppTaskUserIF(void *p_arg);
static  void  AppDispScr_Tmr(void);

#if OS_VIEW_MODULE > 0
static  void  AppTerminalRx(CPU_INT08U rx_data);
#endif

static  void  AppFormatDec(CPU_INT08U *s, CPU_INT32U value, CPU_INT08U digits);

/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.
*
* Arguments   : none
*********************************************************************************************************
*/

void  main (void)
{
    CPU_INT08U  err;


    BSP_IntDisAll();                       /* Disable all interrupts until we are ready to accept them */

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

    OSTaskCreateExt(AppTaskStart,          /* Create the start task                                    */
                    (void *)0,
                    (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],
                    APP_TASK_START_PRIO,
                    APP_TASK_START_PRIO,
                    (OS_STK *)&AppTaskStartStk[0],
                    APP_TASK_START_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

#if OS_TASK_NAME_SIZE > 13
    OSTaskNameSet(APP_TASK_START_PRIO, "Startup", &err);
#endif

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

/*$PAGE*/
/*
*********************************************************************************************************
*                                          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.
*               2) Interrupts are enabled once the task start because the I-bit of the CCR register was
*                  set to 0 by 'OSTaskCreate()'.
*********************************************************************************************************
*/

static  void  AppTaskStart (void *p_arg)
{
    CPU_INT08U  i;
    CPU_INT08U  dir;
/*
    CPU_CHAR    s[20];
    CPU_INT08U  err;
    CPU_INT32U  period;
*/

    p_arg = p_arg;

    BSP_Init();                          /* Initialize BSP functions                                   */


#if OS_TASK_STAT_EN > 0
    OSStatInit();                        /* Determine CPU capacity                                     */
#endif

#if OS_VIEW_MODULE > 0
    OSView_Init(115200);             /* Initialize uC/OS-View                                      */
                                         /* Initialize the mailbox for the OS/View callback function   */
    AppTerminalMbox = OSMboxCreate((void *)0);
    OSView_TerminalRxSetCallback(AppTerminalRx);
#endif

#if OS_TMR_EN > 0
    for (i = 0; i < OS_TMR_CFG_MAX; i++) {
        OS_StrCopy(s, "Timer xx");
        s[6]         = i / 10 + '0';
        s[7]         = i % 10 + '0';
        period       = (i + 1) * 31;
        AppTmrTbl[i] = OSTmrStart(period, OS_TMR_OPT_PERIODIC, (OS_TMR_CALLBACK)0, (void *)i, s, &err);
    }
#endif

    LED_Off(0);                           /* Turn OFF all the LEDs                                     */

    AppTaskCreate();                      /* Create application tasks                                  */

    i   = 1;
    dir = 0;
    while (TRUE) {                        /* Task body, always written as an infinite loop.            */
        LED_Off(0);
        LED_On(i);
        LED_On(i + 1);
        if (dir == 0) {
            if (i == 7) {
                i  -= 2;
                dir = 1;
                Speaker_Toggle();
            } else {
                i += 2;
            }
        } else {
            if (i == 1) {
                i  += 2;
                dir = 0;
                Speaker_Toggle();
            } else {
                i -= 2;
            }
        }
        OSTimeDlyHMSM(0, 0, 0, 50);
    }
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                         USER INTERFACE TASK
*********************************************************************************************************
*/

static  void  AppTaskUserIF (void *p_arg)
{
    CPU_INT08U     s[20];
    CPU_INT08U     user_if_state;
#if OS_VIEW_MODULE > 0
    CPU_INT08U    *msg;
#endif
    CPU_BOOLEAN    b1;                               /* State of Push Button #1                        */
    CPU_BOOLEAN    b1_prev;
    CPU_INT32U     value;


    p_arg = p_arg;

    DispInit(2, 16);                                 /* Initialize the LCD module                      */
    DispVertBarInit();                               /* Define the characters to do vertical bargraphs */

    DispStr(0, 0, "Micrium uC/OS-II");               /* Display 'sign on' message                      */
    DispStr(1, 0, "STR71x");
    OSTimeDlyHMSM(0, 0, 1, 0);

    user_if_state = 1;
    b1_prev  = FALSE;

    while (TRUE) {                                   /* Task body, always written as an infinite loop. */
#if OS_VIEW_MODULE > 0
        msg = (CPU_INT08U *)OSMboxAccept(AppTerminalMbox);
        if (msg != (CPU_INT08U *)0) {
            OSView_TxStr("\n", 1);
            user_if_state = *msg;
            DispClrScr();
        }
#endif
        b1 = PB_GetStatus(2);
        if (b1 == TRUE && b1_prev == FALSE) {
            DispClrScr();
            if (user_if_state == 6) {
                user_if_state = 0;
            } else {
                user_if_state++;
            }
        }

        switch (user_if_state) {
            case 0:
                 DispStr(0, 0, "Micrium uC/OS-II");  /* Display 'sign on' message                      */
                 DispStr(1, 0, "STR71x");
                 break;

            case 1:
                 OS_StrCopy(s, "uC/OS-II:  Vx.yy");
                 value = (CPU_INT32U)OSVersion();
                 s[12] = value / 100 + '0';
                 s[14] = (value % 100) / 10 + '0';
                 s[15] = (value %  10) + '0';
                 DispStr(0, 0, s);

                 OS_StrCopy(s, "TickRate:   xxxx");
                 value = (CPU_INT32U)OS_TICKS_PER_SEC;
                 AppFormatDec(&s[12], value, 4);
                 DispStr(1, 0, s);
                 break;

            case 2:
                 OS_StrCopy(s, "CPU Usage:xx %  ");
                 value = (CPU_INT32U)OSCPUUsage;
                 s[10] = (value / 10) + '0';
                 s[11] = (value % 10) + '0';
                 DispStr(0, 0, s);

                 OS_StrCopy(s, "CPU Speed:xx MHz");
                 value = (CPU_INT32U)BSP_CPU_ClkFreq() / 1000000L;
                 s[10] = (value / 10) + '0';
                 s[11] = (value % 10) + '0';
                 DispStr(1, 0, s);
                 break;

            case 3:
                 OS_StrCopy(s, "#Ticks: xxxxxxxx");
                 value = (CPU_INT32U)OSTime;
                 AppFormatDec(&s[8], value, 8);
                 DispStr(0, 0, s);

                 OS_StrCopy(s, "#CtxSw: xxxxxxxx");
                 value = (CPU_INT32U)OSCtxSwCtr;
                 AppFormatDec(&s[8], value, 8);
                 DispStr(1, 0, s);
                 break;

#if OS_VIEW_MODULE > 0
            case 4:
                 OS_StrCopy(s, "uC/OS-View  Pkts");
                 DispStr(0, 0, s);
                 value = (CPU_INT32U)OSView_RxPktCtr;
                 AppFormatDec(&s[0], value, 6);
                 DispStr(1, 0, s);
                 value = (CPU_INT32U)OSView_TxPktCtr;
                 AppFormatDec(&s[0], value, 6);
                 DispStr(1, 10, s);
                 break;


            case 5:
                 OS_StrCopy(s, "uC/OS-View Bytes");
                 DispStr(0, 0, s);
                 value = (CPU_INT32U)OSView_RxCtr;
                 AppFormatDec(&s[0], value, 7);
                 DispStr(1, 0, s);
                 value = (CPU_INT32U)OSView_TxCtr;
                 AppFormatDec(&s[0], value, 7);
                 DispStr(1, 9, s);
                 break;
#endif

            case 6:
                AppDispScr_Tmr();
                break;

            default:
                 DispStr(0, 0, "Micrium uC/OS-II");  /* Display 'sign on' message                      */
                 DispStr(1, 0, "STR71x");
                 user_if_state = 0;
                 break;

        }
        b1_prev = b1;

        OSTimeDlyHMSM(0, 0, 0, 100);
    }
}

/*$PAGE*/
static  void  AppDispScr_Tmr (void)
{
#if OS_TMR_EN > 0
    OS_TMR_WHEEL *pwheel;
    CPU_INT08U    i;
    CPU_INT08U    entries;
    CPU_INT08U    s[10];


    DispStr(0, 0, "       F:   U:  ");

    AppFormatDec(s, OSTmrTime, 6);
    DispStr(0,  0, s);

    AppFormatDec(s, OSTmrFree, 2);
    DispStr(0,  9, s);

    AppFormatDec(s, OSTmrUsed, 2);
    DispStr(0, 14, s);

    pwheel = &OSTmrWheelTbl[0];
    for (i = 0; i < OS_TMR_CFG_WHEEL_SIZE; i++) {
        entries = pwheel->OSTmrEntries;
        DispVertBar(1, i, entries);
        pwheel++;
    }
#endif
}

/*
*********************************************************************************************************
*                                      CREATE APPLICATION TASKS
*********************************************************************************************************
*/

static  void  AppTaskCreate (void)
{
    CPU_INT08U  err;


    OSTaskCreateExt(AppTaskUserIF,
                    (void *)0,
                    (OS_STK *)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE - 1],
                    APP_TASK_USER_IF_PRIO,
                    APP_TASK_USER_IF_PRIO,
                    (OS_STK *)&AppTaskUserIFStk[0],
                    APP_TASK_USER_IF_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

#if OS_TASK_NAME_SIZE > 13
    OSTaskNameSet(APP_TASK_USER_IF_PRIO, "User I/F", &err);
#endif
}

/*
*********************************************************************************************************
*                                      TERMINAL WINDOW CALLBACK
*********************************************************************************************************
*/

#if OS_VIEW_MODULE > 0
static  void  AppTerminalRx (CPU_INT08U rx_data)
{
    switch (rx_data) {
        case '0':
        case '1':
        case '2':
        case '3':
             AppViewChar = rx_data - '0';
             OSMboxPost(AppTerminalMbox, &AppViewChar);        /* Post the received character to a mailbox */
             break;
         default:
             break;
    }
}
#endif

/*
*********************************************************************************************************
*                                      FORMAT A DECIMAL VALUE
*
* Description: This function converts a decimal value to ASCII (with leading zeros)
* Arguments  : s       is a pointer to the destination ASCII string
*              value   is the value to convert (assumes an unsigned value)
*              digits  is the desired number of digits
*********************************************************************************************************
*/

static  void  AppFormatDec (CPU_INT08U *s, CPU_INT32U value, CPU_INT08U digits)
{
    CPU_INT08U  i;
    CPU_INT32U  mult;


    mult = 1;
    for (i = 0; i < (digits - 1); i++) {
        mult *= 10;
    }
    while (mult > 0) {
        *s++ = value / mult + '0';
        value %= mult;
        mult  /= 10;
    }
    *s = 0;
}

⌨️ 快捷键说明

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