📄 app.c
字号:
if (msg != (CPU_INT08U *)0) { /* If message has been posted .... */
value = *msg;
change = DEF_TRUE;
if (value == 1) { /* ... update the current user if state ... */
if (user_if_state == 0) {
user_if_state = 3;
} else {
user_if_state--;
}
} else if (value == 2) {
user_if_state = (user_if_state + 1) % 4;
}
DispClrScr(); /* ... clear the display screen. */
}
switch (user_if_state) { /* Display appropriate message */
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;
case 0:
default:
if (change) {
DispStr(0, 0, "Micrium uC/OS-II"); /* Display 'sign on' message */
DispStr(1, 0, " ST STR75x ");
user_if_state = 0;
}
break;
}
OSTimeDlyHMSM(0, 0, 0, 50);
}
}
#endif
/*
*********************************************************************************************************
* CREATE APPLICATION TASKS
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
CPU_INT08U err;
#if uC_LCD_MODULE == DEF_TRUE
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
#endif
}
/*
*********************************************************************************************************
* TERMINAL WINDOW CALLBACK
*********************************************************************************************************
*/
#if OS_VIEW_MODULE > 0
static void AppTerminalRx (CPU_INT08U rx_data)
{
}
#endif
/*
*********************************************************************************************************
* HANDLE THE PB INTERRUPT
*
* Description: This function is the ISR for the PB interrupt. The actions taken are as follows:
* On PB1, a message "1" is posted to the user IF task, causing the previous page
* to be written to the display;
* On PB2, a message "2" is posted to the user IF task, causing the next page
* to be written to the display;
* On PB3, no action is taken;
* On PB4, the LCD backlight is turned on;
* On PB1 AND PB2, no action is taken;
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
static void EXTINT_ISRHandler (void)
{
CPU_BOOLEAN change;
change = DEF_FALSE;
if (EXTIT_GetITStatus(EXTIT_ITLine7) == SET) { /* If PB1 has been pressed ... */
change = DEF_TRUE;
if (EXTIT_GetITStatus(EXTIT_ITLine8) == RESET) { /* ... and PB2 has not ... */
EXTINT_Char = 1; /* ... then post a 1 to the user IF task. */
OSMboxPost(EXTINT_Mbox, &EXTINT_Char);
}
EXTIT_ClearITPendingBit(EXTIT_ITLine7); /* ... In any case, clear pending bit. */
}
if (EXTIT_GetITStatus(EXTIT_ITLine8) == SET) { /* If PB2 has been pressed ... */
if (change == DEF_FALSE) { /* ... and PB1 has not ... */
EXTINT_Char = 2; /* ... then post a 2 to the user IF task. */
OSMboxPost(EXTINT_Mbox, &EXTINT_Char);
}
EXTIT_ClearITPendingBit(EXTIT_ITLine8); /* ... In any case, clear pending bit. */
}
if (EXTIT_GetITStatus(EXTIT_ITLine9) == SET) { /* If PB3 has been pressed ... */
EXTIT_ClearITPendingBit(EXTIT_ITLine9); /* ... clear pending bit. */
} /* ... Further actions could be configured. */
if (EXTIT_GetITStatus(EXTIT_ITLine11) == SET) { /* If PB4 has been pressed ... */
LED_Toggle(LED_LIGHT_LCD); /* ... toggle the LCD backlight LED ... */
EXTIT_ClearITPendingBit(EXTIT_ITLine11); /* ... and clear pending bit. */
}
EIC->IPR = (CPU_INT32U)(1 << EXTIT_IRQChannel); /* Clear interrupt pending bit in EIC_IPR register */
}
/*
*********************************************************************************************************
* 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 + -