📄 main.c
字号:
/****************************************************************************
Copyright (c) 深圳市民德电子科技有限公司 http://www.szminde.cn
文件名称:MAIN.c
版本号: 1.0
日期: 2005-05-25
说明: 此文件包含主函数和操作系统的任务处理。
调用列表:Port_Init.c
sys_UART.c
sys_IO.c
OS_CORE.c
OS_CPU_A.s
OS_TIME.c
修改历史:--
****************************************************************************/
#include "def.h"
#include "44b.h"
#include "option.h"
#include "port_init.h"
#include "sys_io.h"
#include "sys_uart.h"
#include "includes.h" // uC/OS接口
#define STACKSIZE 256
OS_STK Stack1[STACKSIZE];
OS_STK Stack2[STACKSIZE];
extern void UCOS_IRQHandler(void);
U32 SERIAL_BAUD = 115200;
static int DelayLoopCount=0x190;
/****************************************************************************
函数名称:Timer5Interrupt()
说明: Timer5的中断响应函数,在这里用作了OS的时钟服务
调用函数:OSTimeTick()
输入参数:无
输出参数:无
****************************************************************************/
static void Timer5Interrupt()
{
rI_ISPC=BIT_TIMER5;
OSTimeTick();
}
/****************************************************************************
函数名称:C_IRQHandler()
说明: 中断处理函数,找出中断源,调用相应的服务函数
调用函数:无
输入参数:无
输出参数:无
****************************************************************************/
void C_IRQHandler(void)
{
U32 temp,i;
temp=rI_ISPR;
if(temp==0) return;
for(i=0;i<26;i++){
if(temp&0x1==1){
break;
}
else{
temp=temp>>1;
}
}
if(i==26){
return;
}
temp=i<<2;
((void(*)(void))(*((U32 *)(_ISR_STARTADDRESS+0x20+temp))))();
}
/****************************************************************************
函数名称:OSTimeInit()
说明: Timer的初始化,使用了Timer5
调用函数:无
输入参数:TicksPerSec OS每秒的计数值
输出参数:无
****************************************************************************/
void OSTimeInit(U32 TicksPerSec)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
rTCFG0=0x00fa0000; // prescaler2 = 250
rTCFG1=0x00200000; // 所有中断, mux5=1/8
rTCNTB5=(U16)(MCLK/2000/TicksPerSec);
rTCON=0x02000000; // 更新T5
rTCON=0x05000000; // T5=自动载入,开始
rINTMSK&=~(BIT_GLOBAL|BIT_TIMER5); // 启动时钟中断
pISR_TIMER5 = (U32)Timer5Interrupt;
rI_ISPC=BIT_TIMER5;
OS_EXIT_CRITICAL();
}
/****************************************************************************
函数名称:Task1()
说明: 任务1,使LED1和LED2循环交替亮灭
调用函数:LED_Display()
OSTimeDly()
输入参数:*Id 任务ID
输出参数:无
****************************************************************************/
void Task1(void *Id)
{
for (;;)
{
LED_Display(1);
UART_Printf("\nLED 1 on ...\n");
OSTimeDly(100);
LED_Display(2);
UART_Printf("\nLED 2 on ...\n");
OSTimeDly(125);
}
}
/****************************************************************************
函数名称:Task2()
说明: 任务2,使LED3和LED4循环交替亮灭
调用函数:LED_Display()
OSTimeDly()
OSTimeInit()
输入参数:*Id 任务ID
输出参数:无
****************************************************************************/
void Task2(void *Id)
{
OSTimeInit(OS_TICKS_PER_SEC);
for (;;)
{
LED_Display(3);
UART_Printf("\nLED 3 on ...\n");
OSTimeDly(300);
LED_Display(4);
UART_Printf("\nLED 4 on ...\n");
OSTimeDly(200);
}
}
/****************************************************************************
函数名称:IRQInit()
说明: 中断的初始化,所有的中断都由OS处理
调用函数:无
输入参数:无
输出参数:无
****************************************************************************/
void IRQInit(void)
{
rINTCON = 0x5; // 非向量模式,使能IRQ,禁止FIQ
rINTMOD = 0x0; // 所有中断为IRQ模式
pISR_IRQ = (U32)UCOS_IRQHandler;
rINTMSK = 0x07ffffff;
}
/****************************************************************************
函数名称:Delay()
说明: 延时函数。
调用函数:无
输入参数:time 要延时的时间,为1时约延时0.1ms,为0时为校正延时时间
输出参数:无
****************************************************************************/
void Delay(int time)
{
int i,adjust=0;
if(time==0)
{
time=200;
adjust=1;
DelayLoopCount=400;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
rWTDAT=0xffff;
rWTCNT=0xffff;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
}
for(;time>0;time--)
for(i=0;i<DelayLoopCount;i++);
if(adjust==1)
{
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
i=0xffff-rWTCNT;
DelayLoopCount=8000000/(i*64);
}
}
/****************************************************************************
函数名称:Main()
说明: 主函数,调用各初始化函数,然后开始OS的运行
调用函数:Port_Init()
UART_Init()
UART_SendByte()
UART_SendString()
UART_Printf()
LED7A_Off()
LED7B_Off()
Delay()
IRQInit()
OSInit()
OSTaskCreate()
OSStart()
输入参数:无
输出参数:返回整型值,但一般运行不到返回值的地方
****************************************************************************/
int Main(void)
{
char Id1 = '1';
char Id2 = '2';
Port_Init();
UART_Init(0,SERIAL_BAUD);
IRQInit();
UART_SendByte('\n');
UART_Printf("/************************************/\n");
UART_Printf(" uC/OS-II for S3C44B0X\n");
UART_Printf(" Serial Baud rate is %d\n", SERIAL_BAUD);
UART_Printf(" System Initialization successful.\n");
UART_Printf("/************************************/\n");
LED7A_Off();
LED7B_Off();
Delay(2000);
OSInit();
OSTaskCreate(Task1, (void *)&Id2, Stack1+STACKSIZE, 9);
OSTaskCreate(Task2, (void *)&Id1, Stack2+STACKSIZE, 8);
OSStart();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -