📄 app.c
字号:
/*
*********************************************************************************************************
*
* EXAMPLE CODE
*
* (c) Copyright 2003-2006; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
*
* Knowledge of the source code may NOT be used to develop a similar product.
*
* Please help us continue to provide the Embedded community with the finest
* software available. Your honesty is greatly appreciated.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* EXAMPLE CODE
*
* ARM 1176JZF-S
*
* Filename : app.c
* Version : V1.00
* Programmer(s) : Brian Nagel
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDES
*********************************************************************************************************
*/
#include <includes.h>
/*
*********************************************************************************************************
* #DEFINE CONSTANTS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*/
#if OS_TMR_EN > 0
typedef struct app_tmr {
OS_TMR *AppTmr;
CPU_INT32U AppTmrCtr;
OS_TMR_CALLBACK AppTmrCallback;
} APP_TMR;
#endif
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
static OS_STK AppTaskGraphStk[APP_TASK_GRAPH_STK_SIZE];
static OS_STK AppTaskStacksStk[APP_TASK_GRAPH_STK_SIZE];
static OS_STK AppTaskFactorialStk[APP_TASK_FACTORIAL_STK_SIZE];
#if OS_TMR_EN > 0
static APP_TMR AppTmrTbl[OS_TMR_CFG_MAX];
#endif
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void AppTaskStart(void *p_arg);
static void AppTaskGraph(void *p_arg);
static void AppTaskStacks(void *p_arg);
static void AppTaskFactorial(void *p_arg);
static CPU_INT32U AppRecursiveFactorial(CPU_INT08U i);
#if OS_TMR_EN > 0
static void AppTmrCallback(OS_TMR *ptmr, void *p_arg);
#endif
static CPU_INT16U AppFormatColor(CPU_INT08U red, CPU_INT08U blue, CPU_INT16U green);
static void AppFormatDec(CPU_INT08U *s, CPU_INT32U value, CPU_INT08U digits);
static void AppPrintPage(void);
static void AppUpdatePage(void);
static void AppTaskCreate(void);
/*
*********************************************************************************************************
* main()
*
* Description : This is the standard entry point for C code. It is assumed that your code will call
* main() once you have performed all necessary CPU and C initialization.
*
* Returns : none
*
* Arguments : none
*********************************************************************************************************
*/
int 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 Task", &err);
#endif
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.
*
* Returns : none
*
* 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()'.
*********************************************************************************************************
*/
void AppTaskStart (void *p_arg)
{
CPU_INT08U i;
CPU_INT08U j;
CPU_INT08U s[20];
CPU_INT08U err;
CPU_INT32U period;
(void)p_arg;
BSP_Init();
LCD_ClrScr();
LED_Off(0); /* Turn of all LEDs */
#if OS_TASK_STAT_EN > 0
OSStatInit(); /* Determine CPU capacity */
#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) * 20;
AppTmrTbl[i].AppTmr = OSTmrCreate(0, period, OS_TMR_OPT_PERIODIC, (OS_TMR_CALLBACK)AppTmrCallback, (void *)i, s, &err);
AppTmrTbl[i].AppTmrCtr = 0;
OSTmrStart(AppTmrTbl[i].AppTmr, &err);
}
#endif
AppTaskCreate(); /* Create application tasks */
AppPrintPage();
while (DEF_TRUE) {
OSTimeDlyHMSM(0, 0, 0, 100);
j = (j + 1) % 2;
if (j == 0) {
AppUpdatePage();
}
for (i = 0; i < 4; i++) {
if (PB_GetStatus(i) == DEF_TRUE) {
LED_Toggle(i);
}
}
}
}
/*
*********************************************************************************************************
* GRAPH UPDATE
*
* Description : This function updates the bar graph illustrating the timer.
*
* Returns : none
*
* Arguments : none
*
* Notes :
*********************************************************************************************************
*/
static void AppTaskGraph (void *p_arg)
{
CPU_INT08U i;
CPU_INT32U unit;
CPU_INT16U green1;
CPU_INT16U green2;
CPU_INT08U s[10];
green1 = AppFormatColor(0, 17, 0);
green2 = AppFormatColor(0, 8, 0);
unit = 20 * (OS_TMR_CFG_MAX + 1);
s[0] = 'T';
s[2] = '\0';
LCD_DispStr(12, 0, "Timer Demo: ", green2);
LCD_DispStr(13, 0, "Ticks remaining until timer next", green1);
LCD_DispStr(14, 0, "fires. Each timer has a period ", green1);
LCD_DispStr(15, 0, "20 ticks longer than the last. ", green1);
while (DEF_TRUE) {
for (i = 0; i < OS_TMR_CFG_MAX; i++) {
OSTimeDlyHMSM(0, 0, 0, 25);
s[1] = '0' + i;
if ((AppTmrTbl[i].AppTmr->OSTmrMatch - OSTmrTime) / 8 < unit) {
LCD_DispHorBar(17 + i, 3, (AppTmrTbl[i].AppTmr->OSTmrMatch - OSTmrTime), unit, green1);
}
LCD_DispStr(17 + i, 0, s, green2);
}
}
}
/*
*********************************************************************************************************
* GRAPH UPDATE
*
* Description : This function updates the bar graph illustrating task stack usage.
*
* Returns : none
*
* Arguments : none
*
* Notes :
*********************************************************************************************************
*/
static void AppTaskStacks (void *p_arg)
{
CPU_INT08U i;
CPU_INT16U green1;
CPU_INT16U green2;
CPU_INT16U green3;
CPU_INT16U black;
CPU_INT16U stk_pct;
CPU_INT32U stk_sz;
CPU_INT32U stk_use;
CPU_INT32U stk_max;
OS_TCB *ptcb;
CPU_INT08U s[10];
green1 = AppFormatColor(0, 31, 0);
green2 = AppFormatColor(0, 17, 0);
green3 = AppFormatColor(0, 8, 0);
black = AppFormatColor(0, 0, 0);
LCD_DispStr(27, 0, "Stack Size Demo: ", green3);
LCD_DispStr(28, 0, "The stack size, current stack ", green2);
LCD_DispStr(29, 0, "use and max stack use are shown ", green2);
LCD_DispStr(30, 0, "for each task. ", green2);
ptcb = &OSTCBTbl[0];
i = 0;
while (DEF_TRUE) {
OSTimeDlyHMSM(0, 0, 0, 25);
if (ptcb != NULL) {
stk_sz = ptcb->OSTCBStkSize * sizeof (OS_STK);
stk_use = (CPU_INT32U)(ptcb->OSTCBStkBase) - (CPU_INT32U)(ptcb->OSTCBStkPtr);
stk_max = ptcb->OSTCBStkUsed;
if (stk_sz != 0) {
stk_pct = 100 * stk_use / stk_sz;
LCD_DispStr (32 + i * 2, 0, ptcb->OSTCBTaskName, black);
if (stk_sz / 5 < 256) {
LCD_DispHorBar(32 + i * 2 + 1, 3, stk_sz / 5, 200, green1);
}
if (stk_max / 5 < 256) {
LCD_DispHorBar(32 + i * 2 + 1, 3, stk_max / 5, stk_max / 5, green2);
}
if (stk_use / 5 < 256) {
LCD_DispHorBar(32 + i * 2 + 1, 3, stk_use / 5, stk_use / 5, green3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -