📄 main.c
字号:
#include "SP_LIB.H"
#ifdef OS_TASK_CREATE_EXT_EN
//#define DSP_OS_INFO
#endif
#ifdef DSP_OS_INFO
#define MyTaskCreate( task, pdata, STK, STK_Size, prio) OSTaskCreateExt( \
task, pdata, &STK[STK_Size - 1], \
prio, prio, &STK[0], STK_Size, \
(void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
#else
#define MyTaskCreate( task, pdata, STK, STK_Size, prio) OSTaskCreate( \
task, pdata, &STK[STK_Size- 1], prio);
#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 ();
MyTaskCreate( StartTask, (void *)0, StartTaskStk, START_TASK_STK_SIZE, START_TASK_PRIO);
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(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
#endif
MyTaskCreate( TimeActionTask, (void *)0, TimeActionTaskStk, TIME_ACTION_TASK_STK_SIZE, TIME_ACTION_TASK_PRIO);
MyTaskCreate( OSFileTask, (void *)0, FileTaskStk, FILE_TASK_STK_SIZE, FILE_TASK_PRIO);
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:
MyTaskCreate( LCDTask, (void *)0, CommStk, COMM_STK_SIZE, LCD_TASK_PRIO);
break;
case 1:
MyTaskCreate( KeyTask, (void *)0, CommStk, COMM_STK_SIZE, KEY_TASK_PRIO);
break;
case 2:
MyTaskCreate( CableComTask, (void *)0, CommStk, COMM_STK_SIZE, CABLE_COM_TASK_PRIO);
break;
case 3:
MyTaskCreate( WirelessTask, (void *)0, CommStk, COMM_STK_SIZE, WIRELESS_TASK_PRIO);
break;
case 4:
MyTaskCreate( SetTimeTask, (void *)0, CommStk, COMM_STK_SIZE, SET_TIME_TASK_PRIO);
break;
case 5:
MyTaskCreate( FlashTask, (void *)0, CommStk, COMM_STK_SIZE, FLASH_TASK_PRIO);
break;
case 6:
MyTaskCreate( SDTestTask, (void *)0, CommStk, COMM_STK_SIZE, SD_TEST_TASK_PRIO);
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; //避免编译警告
while( (ret = LCD_CreateViewPort()) == ERROR_NO_VIEWPORT_AVAILABLE ) {
OSTimeDly( OS_DLY_100MS );
}
viewPortIndex = ret;
LCD_ActiveViewPort( viewPortIndex );
LCD_SetViewPortSize( 0, 0, 159, 30 );
LCD_SetFont( Fnt_GB11x12 );
LCD_DeactiveViewPort( viewPortIndex );
for (;;) {
OSSemPend(RTCTickSem, 0, &err); //once per second
battStatus = PWR_GetBatteryStatus();
if( battStatus == BATT_DEAD) {
battDeadCount++;
}
else {
battDeadCount = 0;
}
if( Key_PowerOff()
||(PWR_IdleTimeOut() == TRUE)
|| (battDeadCount >= 10 ) ) {
PWR_SystemOff();
}
time = RTCGetTime();
sprintf( (char*)str, "%04d年%02d月%02d日", time.tm_year, time.tm_mon, time.tm_mday );
LCD_ActiveViewPort( viewPortIndex );
LCD_SetPixelPos( 1, 0 );
LCD_PutStr( str );
sprintf( (char*)str, " %02d:%02d:%02d", time.tm_hour, time.tm_min, time.tm_sec );
LCD_SetPixelPos( 0, 13 );
LCD_PutStr( str );
LCDS_1BitBmp( 120, 5, 32, 16, (INT8U*)Bmp_Battery[battStatus] );
LCD_DeactiveViewPort( viewPortIndex );
}
}
enum tagSDTestState {
SDTest_CardError=0,
SDTest_ReadFile,
SDTest_ReadFinished,
SDTest_WriteFile,
SDTest_WriteError
};
void SDTestTask(void *pdata)
{
INT8U viewPortIndex;
static INT16S ret;
HANDLE hFile;
INT8U state;
INT16U ch;
INT8U str[30];
INT8U key=KEY_NONE;
pdata = pdata;
while( (ret = LCD_CreateViewPort()) == ERROR_NO_VIEWPORT_AVAILABLE ) {
OSTimeDly( OS_DLY_100MS );
}
viewPortIndex = ret;
LCD_ActiveViewPort( viewPortIndex );
LCD_SetViewPortSize( 0, 30, 159, 159 );
LCD_ClrVP();
LCD_SetFont( Fnt_GB11x12 );
LCD_SetPixelPos( 50, 0 );
LCD_PutStr( (INT8U*)"SD卡测试" );
LCD_Button( 100, 109, 50, 20, (INT8U*)"返回", LCD_INVERT_COPY);
LCD_DeactiveViewPort( viewPortIndex );
LCD_ActiveViewPort( viewPortIndex );
LCD_SetPixelPos( 10, 50 );
LCD_PutStr( (INT8U*)"正在检测SD卡。。。" );
LCD_DeactiveViewPort( viewPortIndex );
if( SD_Initialize() == ERROR_NONE ) {
ret = OSAddFileDriver( SDMMCCommand );
ret = OSChangeDir( (INT8S*)"Science" );
if( ret == PATH_NOT_FIND ) {
ret = OSMakeDir( (INT8S*)"Science" );
if( ret == ERROR_NONE ) {
ret = OSChangeDir( (INT8S*)"Science" );
}
}
state = SDTest_ReadFile;
LCD_ActiveViewPort( viewPortIndex );
LCD_Button( 10, 109, 50, 20, (INT8U*)"写文件", LCD_INVERT_COPY);
LCD_DeactiveViewPort( viewPortIndex );
}
else {
LCD_ActiveViewPort( viewPortIndex );
LCD_SetPixelPos( 10, 50 );
LCD_PutStr( (INT8U*)"SD卡初始化失败! " );
LCD_DeactiveViewPort( viewPortIndex );
state = SDTest_CardError;
}
while (1) {
if( state == SDTest_ReadFile ) {
ret = OSFileClose( hFile );
hFile = OSFileOpen( (INT8S*)"ReadTest.txt", (INT8S*)"r" );
LCD_ActiveViewPort( viewPortIndex );
LCD_SetViewPortSize( 1, 45, 159, 139 );
LCD_ClrVP();
LCD_DeactiveViewPort( viewPortIndex );
if( hFile != Not_Open_FILE ) {
while( OSFileGetCh( (INT8S*)str, hFile ) == ERROR_NONE ) {
if( str[0] > 0xA0 ) {
if( ch == 0 ) {
ch = str[0];
continue;
}
else {
ch <<= 8;
ch += str[0];
}
}
else {
ch = str[0];
}
LCD_ActiveViewPort( viewPortIndex );
LCD_PutCh( ch );
LCD_DeactiveViewPort( viewPortIndex );
ch = 0;
}
}
else {
LCD_ActiveViewPort( viewPortIndex );
LCD_SetPixelPos( 10, 50 );
LCD_PutStr( (INT8U*)"打开文件(ReadTest.txt)失败!" );
LCD_DeactiveViewPort( viewPortIndex );
}
ret = OSFileClose( hFile );
state = SDTest_ReadFinished;
}
OSTimeDly( OS_DLY_100MS );
key = Key_GetCode();
switch( key ) {
case KEY_F1:
if( state == SDTest_CardError ) {
break;
}
LCD_ActiveViewPort( viewPortIndex );
LCD_SetViewPortSize( 0, 30, 159, 159 );
if( state == SDTest_WriteFile || state == SDTest_WriteError ) {
state = SDTest_ReadFile;
LCD_Button( 10, 109, 50, 20, (INT8U*)"写文件", LCD_INVERT_COPY);
}
else {
state = SDTest_WriteFile;
LCD_Button( 10, 109, 50, 20, (INT8U*)"读文件", LCD_INVERT_COPY);
}
LCD_SetViewPortSize( 1, 45, 159, 139 );
LCD_ClrVP();
LCD_DeactiveViewPort( viewPortIndex );
if( state == SDTest_WriteFile ) {
ret = OSFileClose( hFile );
hFile = OSFileOpen( (INT8S*)"WriteTst.txt", (INT8S*)"w" );
if( hFile == Not_Open_FILE ) {
LCD_ActiveViewPort( viewPortIndex );
LCD_SetPixelPos( 10, 50 );
LCD_PutStr( (INT8U*)"创建文件(WriteTst.txt)失败!" );
LCD_DeactiveViewPort( viewPortIndex );
state = SDTest_WriteError;
}
}
continue;
case KEY_F2:
if( state != SDTest_CardError ) {
OSFileCloseAll( );
OSRemoveFileDriver(0);
}
LCD_DeleteViewPort( viewPortIndex );
OSTaskResume( START_TASK_PRIO );
OSTaskDel( OS_PRIO_SELF );
break;
case KEY_NONE:
continue;
case KEY_SEND:
sprintf( (char*)str, "Send " );
break;
case KEY_ON_OFF:
sprintf( (char*)str, "ON/OFF" );
break;
case KEY_ENTER:
sprintf( (char*)str, "Enter" );
break;
case KEY_UP:
sprintf( (char*)str, "Up" );
break;
case KEY_DOWN:
sprintf( (char*)str, "Down" );
break;
case KEY_LEFT:
sprintf( (char*)str, "Left" );
break;
case KEY_RIGHT:
sprintf( (char*)str, "Right" );
break;
default:
sprintf( (char*)str, "%c ", key );
break;
}
if( state == SDTest_WriteFile ) {
OSFileWrite( str, StrLen(str), hFile );
OSFileWrite( "\r\n", 2, hFile );
LCD_ActiveViewPort( viewPortIndex );
LCD_PutStr( str );
LCD_DeactiveViewPort( viewPortIndex );
}
}
}
void LCDTask(void *pdata)
{
INT8U viewPortIndex;
INT16S ret;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -