📄 app.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 + -