📄 main.c
字号:
/****************************************Copyright (c)**************************************************
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date:2007-12-20
** Last Version: 1.0
** Descriptions: 主函数
**------------------------------------------------------------------------------------------------------
** Created by: Rein Lee
** Created date: 2007-12-20
** Version: 1.0
** Descriptions: The original version
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#include <math.h>
#define TARGET_DEBUG_BY_UART
//Marco define about hardware
#define LCD_DISP_COLOR 1 //marco定义LCD的前景色和背景色
#define LCD_BACK_COLOR 0
#define KEY1 1<<16 //键盘定义
#define KEY2 1<<17
#define KEY3 1<<18
#define KEY4 1<<19
#define KEYA 1<<20
#define KEYB 1<<21
#define KEYC 1<<22
#define KEYD 1<<23
#define LED1 28 //LED定义
#define LED2 29
#define LED3 25
#define LED1_ON() IOCLR = 1<<LED1 //LED ON
#define LED2_ON() IOCLR = 1<<LED2
#define LED3_ON() IOCLR = 1<<LED3
#define LED1_OFF() IOSET = 1<<LED1 //LED OFF
#define LED2_OFF() IOSET = 1<<LED2
#define LED3_OFF() IOSET = 1<<LED3
//Define the command buffer length
#define CmdBufLengh 30
//Define the data buffer length
#define DatBufLengh 15
//Define the TaskStart stack length
#define TaskStkLengh 200
//Define the stack length of other task
#define TASK_STK_SIZE 200
/* Application tasks priority */
#define TASK_START_PRIO 1
#define TASK_POWERDOWN_PRIO 5
#define TASK_KEYBOARD_PRIO 15
#define TASK_LED1_PRIO 20
#define TASK_LED3_PRIO 25
/* Application tasks id */
#define TASK_START_ID 0
#define TASK_LED1_ID 1
#define TASK_KEYBOARD_ID 2
#define TASK_LED3_ID 3
#define TASK_POWERDOWN_ID 4
/******************************************全局变量定义**************************************************/
/********************************************************************************************************/
//Define the stack of application tasks
OS_STK TaskStartStk[TaskStkLengh];
OS_STK TaskLED1Stk [TASK_STK_SIZE];
OS_STK TaskKeyBoardStk [TASK_STK_SIZE];
OS_STK TaskLED3Stk [TASK_STK_SIZE];
OS_STK TaskPowerDownStk [TASK_STK_SIZE];
//Globle variables in applications
MENUICO mainmenu[8]; //8个功能图标
static uint8 MenuSelect; //表示当前选择的图标序号
static uint8 Flag_AppRunning = 0; //如果=1表示8个功能程序之一在运行
static uint8 EINT3_Time= 0; //进入EINT3的次数
static uint8 F_flag=0; //功能函数序号标志,8个bit代表8个功能函数
struct time now; //当前时间
struct date today; //当前日期
//char Uart0_Buffer[50]; //串口接受数据缓冲区
char Cmd_Buf[CmdBufLengh];
char Data_Buf[DatBufLengh];
//User define Data Types
TASK_USER_DATA TaskUserData[5]; //扩展TCB数据类型
/********************************************************************************************************/
//系统任务
static void TaskStart(void *pdata); //Task0 任务0
static void TaskLED1(void *data); //LED1闪烁任务,表示操作系统秒时钟运行情况
static void TaskKeyBoard(void *data); //键盘扫描程序
static void TaskLED3(void *data); //LED3闪烁任务,表示操作系统运行情况
static void TaskPowerDown(void *pdata); //低功耗任务,停止处理器时钟,外设仍然工作
/********************************************************************************************************/
//初始化/*************/
void RTC_SetTime(void); //设置时间
void LedInit(void); //LED初始化
void KeyInit(void); //键盘初始化
/********************/
//显示/**************/
void Display_Init(void); //显示初始化
void Disp_SystemInfo(void); //时间显示
/********************/
//功能图标显示/******/
void MenuIcoInit(void); //菜单功能初始化
void MenuDisplay(uint8 select); //菜单显示
void MenuHelpDisplay(uint8 select,uint8 type); //更新菜单旁边的帮助文字显示
/********************/
//键盘扫描/**********/
void KeyDecode(uint8 keycode); //键值解码
/********************/
//8个功能函数定义/***/
void Function_1_ADC(void); //ADC
void Function_2_I2C(void); //I2C
void Function_3_Win(void); //ZLG/GUI
void Function_4_UART(void); //UART0
void Function_5_SPI(void); //SPI
void Function_6_EINT(void); //EINT3
void Function_7_Info(void); //System Information
void Function_8_Help(void); //Help
/********************/
//外部中断3/***/
void EINT3_Exception(void); //更新LED2状态和进入EINT3的次数
//Uart输入数据解码/***/
uint8 Uart_Data_Decode(uint8 flag,uint8 index); //Uart输入数据解码
/********************************************************************************************************/
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 初始化uC/OS-II操作系统,建立任务,然后启动系统。
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main(void)
{
OSInit ();
PC_ElapsedInit();
strcpy(TaskUserData[TASK_START_ID].TaskName, "StartTask"); //Copy Name To TCB Extension
OSTaskCreateExt(TaskStart, //Name
(void *)0, //Parameter
&TaskStartStk[TaskStkLengh - 1],//Top-Of-Stack
TASK_START_PRIO, //Priority level
TASK_START_ID, //Task ID
&TaskStartStk[0], //Bottom-Of-Stack
TaskStkLengh, //Length-Of-Statck
&TaskUserData[TASK_START_ID], //TCB Extension
0); //Disable stack checking + clear stack
OSStart (); //Multi Tasking Started
return 0;
}
/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: TaskStart,主任务,界面的显示,CPU使用资源的显示,以及RTC时钟的显示
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TaskStart(void *pdata)
{
pdata = pdata; /* 避免编译警告 */
TargetInit(); // 目标板初始化
#ifdef TARGET_DEBUG_BY_UART
UartSendString("OS-Time-Tick and Interrupt Vevtor Controller have been initialized !\r\n");
UartSendString("OSStatInit() is running...........\r\n");
#endif
OSStatInit(); /* 统计任务初始化,由于占用1s的延时用于统计Idle最大计数,所以proteus仿真很慢 */
//目标板的各种设置
#ifdef TARGET_DEBUG_BY_UART
UartSendString("Initialize RTC module.\r\n");
#endif
RTC_SetTime(); // 设置时间和日期
RTCInit(); // RTC部件初始化,时钟启动
#ifdef TARGET_DEBUG_BY_UART
UartSendString("Start LCM,T6963C Controller,and GUI.\r\n");
#endif
GUI_Initialize(); // 初始化LCM
GUI_SetColor(LCD_DISP_COLOR,LCD_BACK_COLOR); // 设置前景色和背景色
Display_Init(); // 应用程序显示初始化
MenuIcoInit(); // 图标初始化
MenuSelect = 0; // 初始设置为选中 功能1
MenuDisplay(MenuSelect);// 图标显示
#ifdef TARGET_DEBUG_BY_UART
UartSendString("Creat other System Tasks.\r\n");
UartSendString("uC/OS-II is running.\r\n");
UartSendString(" _____ _ _______ _____\r\n");
UartSendString(" / ___| / / / ___ \\ | ___|\r\n");
UartSendString(" _ _| | / / | | | | | |___\r\n");
UartSendString(" | | | | | / / | | | | |___ |\r\n");
UartSendString(" | |_| | |___ / / | |___| | ___| |\r\n");
UartSendString(" | ___\\_____|/_/ \\_______/ |_____|\r\n");
UartSendString(" | |\r\n");
UartSendString(" |_|\r\n");
#endif
//建立其他4个系统任务
//TASK_POWERDOWN_ID
strcpy(TaskUserData[TASK_POWERDOWN_ID].TaskName, "PowerTask");
OSTaskCreateExt(TaskPowerDown,
(void *)0,
&TaskPowerDownStk [TASK_STK_SIZE - 1],
TASK_POWERDOWN_PRIO,
TASK_POWERDOWN_ID,
&TaskPowerDownStk[0],
TASK_STK_SIZE,
&TaskUserData[TASK_POWERDOWN_ID],
0);
//TASK_KEYBOARD_ID
strcpy(TaskUserData[TASK_KEYBOARD_ID].TaskName, "KeyBDTask");
OSTaskCreateExt(TaskKeyBoard,
(void *)0,
&TaskKeyBoardStk [TASK_STK_SIZE - 1],
TASK_KEYBOARD_PRIO,
TASK_KEYBOARD_ID,
&TaskKeyBoardStk[0],
TASK_STK_SIZE,
&TaskUserData[TASK_KEYBOARD_ID],
0);
//TASK_LED1_ID
strcpy(TaskUserData[TASK_LED1_ID].TaskName, "LED1 Task");
OSTaskCreateExt(TaskLED1,
(void *)0,
&TaskLED1Stk[TASK_STK_SIZE - 1],
TASK_LED1_PRIO,
TASK_LED1_ID,
&TaskLED1Stk[0],
TASK_STK_SIZE,
&TaskUserData[TASK_LED1_ID],
0);
//TASK_LED3_ID
strcpy(TaskUserData[TASK_LED3_ID].TaskName, "LED3 Task");
OSTaskCreateExt(TaskLED3,
(void *)0,
&TaskLED3Stk[TASK_STK_SIZE - 1],
TASK_LED3_PRIO,
TASK_LED3_ID,
&TaskLED3Stk[0],
TASK_STK_SIZE,
&TaskUserData[TASK_LED3_ID],
0);
for(;;)
{ /*屏蔽此语句,可以在功能7中看见TaskStart的执行时间减少很多*/
Disp_SystemInfo(); //每秒更新一次状态显示
OSCtxSwCtr = 0; //清除上下文切换计数器
OSTimeDly(OS_TICKS_PER_SEC); //任务切换,交出cpu使用权
}
}
/*********************************************************************************************************
** 函数名称: TaskLED1
** 功能描述: LED1闪烁任务,显示RTC秒时钟的运行状况
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TaskLED1(void *pdata)
{
pdata=pdata;
//TargetInit();
LedInit();
for(;;)
{ //每秒点亮或者熄灭,表征系统秒时钟
LED1_ON();
OSTimeDlyHMSM(0,0,1,0); //任务切换,交出cpu使用权
LED1_OFF();
OSTimeDlyHMSM(0,0,1,0); //任务切换,交出cpu使用权
}
}
/*********************************************************************************************************
** 函数名称: TaskKeyBoard
** 功能描述: 键盘扫描任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -