📄 main.c
字号:
#include "SP_LIB.H"
#ifdef OS_TASK_CREATE_EXT_EN
//#define DSP_OS_INFO
#endif
enum tagTaskPrio {
TIME_ACTION_TASK_PRIO = 10,
FILE_TASK_PRIO,
SD_TEST_TASK_PRIO,
SET_TIME_TASK_PRIO,
FLASH_TASK_PRIO,
WIRELESS_TASK_PRIO,
CABLE_COM_TASK_PRIO,
KEY_TASK_PRIO,
LCD_TASK_PRIO,
START_TASK_PRIO,
PIN_YIN_INPUT_PRIO,
#ifdef DSP_OS_INFO
OS_INFO_TASK_PRIO,
#endif
OS_PRIO_TOTAL
};
#define FILE_TASK_STK_SIZE 300
OS_STK FileTaskStk [FILE_TASK_STK_SIZE];
//void TimeActionTask(void *pdata);
#define TIME_ACTION_TASK_STK_SIZE 200
OS_STK TimeActionTaskStk [TIME_ACTION_TASK_STK_SIZE];
void TimeActionTask(void *pdata);
#define START_TASK_STK_SIZE 300
OS_STK StartTaskStk [START_TASK_STK_SIZE];
void StartTask(void *pdata);
//for the following task will not run at the same time, so they use the same stack
#define COMM_STK_SIZE 512
OS_STK CommStk [COMM_STK_SIZE];
void LCDTask(void *pdata);
void KeyTask(void *pdata);
void CableComTask(void *pdata);
void WirelessTask(void *pdata);
void FlashTask(void *pdata);
void SetTimeTask(void *pdata);
void SDTestTask(void *pdata);
#ifdef DSP_OS_INFO
#define OS_INFO_STK_SIZE 128
OS_STK OSInfoStk [OS_INFO_STK_SIZE];
void OSInfoTask( void *pdata )
{
INT8U str[50];
INT8U err;
OS_STK_DATA data; /* Storage for task stack data */
INT8U i;
SCI_Open( COM0, SCICFG_Baud9600, SCICFG_8DataBit, SCICFG_ParityNone, SCICFG_1StopBit);
for( ;; ) {
sprintf((char*)str, "Total= %d, CPU usage= %d, switches= %d\r\n", OSTaskCtr, OSCPUUsage, OSCtxSwCtr );
SCI_Send( COM0, str, StrLen(str) );
OSTimeDly( OS_DLY_100MS );
for (i = TIME_ACTION_TASK_PRIO; i < OS_PRIO_TOTAL; i++) {
err = OSTaskStkChk( i, &data);
if (err == OS_NO_ERR) {
sprintf((char*)str, "task#= %d, Free= %d, Used= %d\r\n", i, data.OSFree/4, data.OSUsed/4 );
SCI_Send( COM0, str, StrLen(str) );
OSTimeDly( OS_DLY_100MS );
}
}
//state task
err = OSTaskStkChk(OS_STAT_PRIO, &data);
if (err == OS_NO_ERR) {
sprintf((char*)str, "task= State Task, Free= %d, Used= %d\r\n", data.OSFree/4, data.OSUsed/4 );
SCI_Send( COM0, str, StrLen(str) );
}
//idle task
err = OSTaskStkChk(OS_IDLE_PRIO, &data);
if (err == OS_NO_ERR) {
sprintf((char*)str, "task= Idle Task, Free= %d, Used= %d\r\n", data.OSFree/4, data.OSUsed/4 );
SCI_Send( COM0, str, StrLen(str) );
}
OSTimeDly( OS_DLY_1000MS );
}
}
#endif
int main (void)
{
OSInit ();
#ifdef DSP_OS_INFO
OSTaskCreateExt(StartTask,
(void *)0,
&StartTaskStk[START_TASK_STK_SIZE - 1], // Set Top-Of-Stack
START_TASK_PRIO, // One higher than the idle task
START_TASK_PRIO,
&StartTaskStk[0], // Set Bottom-Of-Stack
START_TASK_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( StartTask, (void *)0, &StartTaskStk[START_TASK_STK_SIZE- 1], START_TASK_PRIO);
#endif
OSStart ();
return 0;
}
#define MAIN_MENU_BUTTON_TOTAL 8
void StartTask(void *pdata)
{
INT8U buttonIndex;
INT8U key;
INT8U buttonStyle;
INT8U str[10];
INT8U viewPortIndex;
INT16S ret;
pdata = pdata;
SystemInit ();
#ifdef DSP_OS_INFO
OSTaskCreateExt(TimeActionTask,
(void *)0,
&TimeActionTaskStk[TIME_ACTION_TASK_STK_SIZE - 1], // Set Top-Of-Stack
TIME_ACTION_TASK_PRIO, // One higher than the idle task
TIME_ACTION_TASK_PRIO,
&TimeActionTaskStk[0], // Set Bottom-Of-Stack
TIME_ACTION_TASK_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
OSTaskCreateExt(OSFileTask,
(void *)0,
&FileTaskStk[FILE_TASK_STK_SIZE - 1], // Set Top-Of-Stack
FILE_TASK_PRIO, // One higher than the idle task
FILE_TASK_PRIO,
&FileTaskStk[0], // Set Bottom-Of-Stack
FILE_TASK_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
OSTaskCreateExt(OSInfoTask,
(void *)0,
&OSInfoStk[OS_INFO_STK_SIZE - 1], // Set Top-Of-Stack
OS_INFO_TASK_PRIO, // One higher than the idle task
OS_INFO_TASK_PRIO,
&OSInfoStk[0], // Set Bottom-Of-Stack
OS_INFO_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( TimeActionTask, (void *)0, &TimeActionTaskStk[TIME_ACTION_TASK_STK_SIZE- 1], TIME_ACTION_TASK_PRIO);
OSTaskCreate( OSFileTask, (void *)0, &FileTaskStk[FILE_TASK_STK_SIZE - 1], FILE_TASK_PRIO );
#endif
BuzzerBeep( 300 );
while( (ret = LCD_CreateViewPort()) == ERROR_NO_VIEWPORT_AVAILABLE ) {
OSTimeDly( OS_DLY_100MS );
}
viewPortIndex = ret;
LCD_SetContrast( 10 );//0~31
Key_SetKeyLEDDelay( 5 );//key led delay 5 seconds. if set to 0, key led will not turn on or off automatically
LCD_SetBackLightDelay( 10 );//back light delay 30 seconds. if set to 0, backlight will not turn on or off automatically
PWR_SetIdleTimeLimit( 600 ); // after 600 second without key operation, system idle, 0 to disable idle
buttonIndex = 0;
key = KEY_0;
while (1) {
if( key ) {
LCD_ActiveViewPort( viewPortIndex );
LCD_SetFont( Fnt_GB11x12 );
LCD_SetPixelPos( 10, 30 );
LCD_PutStr( (INT8U*)"上海桑博电子&&上志电子" );
LCD_SetFont( Fnt_GB15x16);
LCD_SetPixelPos( 3, 140 );
LCD_PutStr( (INT8U*)"中国★上海:59532657" );
sprintf( (char*)str, "V%.2f", LIB_GetVersion() );
LCD_SetFont( Fnt_GB11x12 );
LCD_SetPixelPos( 70, 13 );
LCD_PutStr( str );
buttonStyle = ((buttonIndex==0)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 10, 45, 60, 20, (INT8U*)"显示", buttonStyle );
buttonStyle = ((buttonIndex==1)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 10, 69, 60, 20, (INT8U*)"按键", buttonStyle );
buttonStyle = ((buttonIndex==2)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 10, 93, 60, 20, (INT8U*)"有线通讯", buttonStyle );
buttonStyle = ((buttonIndex==3)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 10, 117, 60, 20, (INT8U*)"无线通讯", buttonStyle );
buttonStyle = ((buttonIndex==4)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 80, 45, 60, 20, (INT8U*)"设置时间", buttonStyle );
buttonStyle = ((buttonIndex==5)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 80, 69, 60, 20, (INT8U*)"数据存储", buttonStyle );
buttonStyle = ((buttonIndex==6)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 80, 93, 60, 20, (INT8U*)"sd卡测试", buttonStyle );
buttonStyle = ((buttonIndex==7)?LCD_INVERT_COPY:LCD_COPY);
LCD_Button( 80, 117, 60, 20, (INT8U*)"- - - -", buttonStyle );
LCD_DeactiveViewPort( viewPortIndex );
}
OSTimeDly( OS_DLY_20MS );
key = Key_GetCode();
switch( key ) {
case KEY_UP:
if( buttonIndex ) {
buttonIndex--;
}
else {
buttonIndex = MAIN_MENU_BUTTON_TOTAL-1;
}
break;
case KEY_DOWN:
if( buttonIndex >= MAIN_MENU_BUTTON_TOTAL-1 ) {
buttonIndex = 0;
}
else {
buttonIndex++;
}
break;
case KEY_LEFT:
if( buttonIndex >= 4 ) {
buttonIndex -= 4;
}
break;
case KEY_RIGHT:
if( buttonIndex < 4 ) {
buttonIndex += 4;
}
if( buttonIndex >= MAIN_MENU_BUTTON_TOTAL-1 ) {
buttonIndex = MAIN_MENU_BUTTON_TOTAL-1;
}
break;
case KEY_ENTER:
switch( buttonIndex ) {
case 0:
#ifdef DSP_OS_INFO
OSTaskCreateExt(LCDTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
LCD_TASK_PRIO, // One higher than the idle task
LCD_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( LCDTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], LCD_TASK_PRIO);
#endif
break;
case 1:
#ifdef DSP_OS_INFO
OSTaskCreateExt(KeyTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
KEY_TASK_PRIO, // One higher than the idle task
KEY_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( KeyTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], KEY_TASK_PRIO);
#endif
break;
case 2:
#ifdef DSP_OS_INFO
OSTaskCreateExt(CableComTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
CABLE_COM_TASK_PRIO, // One higher than the idle task
CABLE_COM_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( CableComTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], CABLE_COM_TASK_PRIO);
#endif
break;
case 3:
#ifdef DSP_OS_INFO
OSTaskCreateExt(WirelessTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
WIRELESS_TASK_PRIO, // One higher than the idle task
WIRELESS_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( WirelessTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], WIRELESS_TASK_PRIO);
#endif
break;
case 4:
#ifdef DSP_OS_INFO
OSTaskCreateExt(SetTimeTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
SET_TIME_TASK_PRIO, // One higher than the idle task
SET_TIME_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( SetTimeTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], SET_TIME_TASK_PRIO);
#endif
break;
case 5:
#ifdef DSP_OS_INFO
OSTaskCreateExt(FlashTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
FLASH_TASK_PRIO, // One higher than the idle task
FLASH_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( FlashTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], FLASH_TASK_PRIO);
#endif
break;
case 6:
#ifdef DSP_OS_INFO
OSTaskCreateExt(SDTestTask,
(void *)0,
&CommStk[COMM_STK_SIZE - 1], // Set Top-Of-Stack
SD_TEST_TASK_PRIO, // One higher than the idle task
SD_TEST_TASK_PRIO,
&CommStk[0], // Set Bottom-Of-Stack
COMM_STK_SIZE,
(void *)0, // No TCB extension
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Enable stack checking + clear
#else
OSTaskCreate( SDTestTask, (void *)0, &CommStk[COMM_STK_SIZE- 1], SD_TEST_TASK_PRIO);
#endif
break;
case 7:
continue;
}
OSTaskSuspend( OS_PRIO_SELF );
LCD_ActiveViewPort( viewPortIndex );
LCD_ClrVP();
LCD_DeactiveViewPort( viewPortIndex );
break;
}
}
}
void TimeActionTask(void *pdata)
{
INT8U err;
INT8U str[30];
INT8U viewPortIndex;
INT16S ret;
INT8U battStatus;
RTCTime time;
INT8U battDeadCount=0;
pdata = pdata; //避免编译警告
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -