📄 main.c
字号:
#include "..\startup\44b.h"
#include "..\inc\44blib.h"
#include "..\startup\option.h"
#include "..\inc\def.h"
#include "..\ucos\includes.h"
extern void OSSchedLock(void);
#define IRQ_VECTOR_OFFSET (0x18)
//-------------------------------------------------------
// globle variables
//-------------------------------------------------------
volatile static int isrCount = 0; // tick counter
//volatile static unsigned int Dump_Pool[16];
//-------------------------------------------------------
// OS_Tick Hook Fubction
//-------------------------------------------------------
void tick_hook(void)
{
isrCount++;
rI_ISPC = (unsigned int)1 << 20;
}
//-------------------------------------------------------
// install a new ISR
// this function must be synchronized
//-------------------------------------------------------
unsigned int ISR_Install(unsigned int offset, void *pf_ISR)
{
unsigned int pOldEntry;
// get absolute address of IRQ vector
// _ISR_STARTADDRESS : see Option.h
offset += _ISR_STARTADDRESS;
// get the Old ISR service routine entry point
pOldEntry = *((unsigned int *)offset);
// install new interrupt service routine
*((unsigned int *)offset) = (unsigned int)pf_ISR;
return pOldEntry;
}
//-------------------------------------------------------
// must be synchronized
//-------------------------------------------------------
void tick_off(void)
{
rRTCCON = (unsigned char)1;
rTICNT = (unsigned char)0;
rRTCCON = (unsigned char)0;
}
//--------------------------------------------------------
// set or clear TICK interrupt mask
// this function must be synchronized
//--------------------------------------------------------
void tick_int_enable(unsigned char bEnabled)
{
// clear interrupt pending first
rI_ISPC = (unsigned int)0x01 << 20;
rINTMSK &= (unsigned int)~(0x01 << 20);
}
//--------------------------------------------------------
// start tick function of RTC
// interval = (1 + div) / 128 second
// this function must be synchronized
// div MUST >= 1 && <= 128
//--------------------------------------------------------
void tick_init(unsigned char div)
{
rRTCCON = (unsigned char)1;
// ASSERT(div >= 1 && div <= 127);
rTICNT = (unsigned char)(div | 0x80);
rRTCCON = (unsigned char)0;
tick_int_enable(1);
}
//--------------------------------------------------------
// interrupt controler initilization
//--------------------------------------------------------
void intcon_init(void)
{
rINTMOD = 0; // all interrupt sources configed as IRQ
rI_ISPC = 0x7ffffff; // clear all intrrupt request
rINTCON = 0x05; // irq interrupt available
}
//--------------------------------------------------------
// globel interrupt enable
//--------------------------------------------------------
void globle_int_enable(unsigned char bEnabled)
{
if(bEnabled)
rINTMSK &= ~(0x03 << 26);
else
rINTMSK |= 0x01 << 26;
}
__inline void Sleep(INT16U uSec)
{
OSTimeDly((INT16U) (uSec));
}
void sys_init(void)
{
tick_off();
tick_int_enable(0);
globle_int_enable(0);
intcon_init();
isrCount = 0;
// Set the function of the pins
Port_Init();
Uart_Init(0, 115200);
// hook the tick ISR
ISR_Install(IRQ_VECTOR_OFFSET, (void *)OSTickISR);
globle_int_enable(1);
}
#define printf Uart_Printf
//**********************************************************
// THE MAIN FUNCTION BODY
//**********************************************************
#define N_TASKS 5 // Number of tasks
#define TASK_STK_SIZE 1024 // Stack size, in sizeof OS_STK, or int 32bit
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; // Tasks stacks
void Task1(void *);
void Task2(void *);
int Main(int argc, char **argv)
{
int task_1 = 0, task_2 = 1;
sys_init();
Uart_Printf("\n ### Main Starts !\n");
OSInit();
OSTaskCreate(Task1, &task_1, &TaskStk[0][TASK_STK_SIZE-1], 1);
OSTaskCreate(Task2, &task_2, &TaskStk[1][TASK_STK_SIZE-1], 2);
OSStart();
return 0;
}
void Task1(void * pParam)
{
Uart_Printf(" @@@ Task1 will starts time ticker !\n");
// enable Ticker, 16 ticks per second
tick_init(7);
// why start tick here? see uCOS-II Doc Chapter 8 :
/*
"You MUST enable ticker interrupts AFTER multitasking has started, i.e. after
calling OSStart(). In other words, you should initialize and tick interrupts in
the first task that executes following a call to OSStart(). A common mistake is
to enable ticker interrupts between calling OSInit() and OSStart() ..."
*/
while(1)
{
OSSchedLock();
printf( "@@@\n");
printf( "@@@ task 1 running ... \n" );
printf( "@@@ Q__Q \n" );
printf( "@@@ /____\\ \n" );
printf( "@@@ \\____/ \n" );
printf( "@@@ /\\/\\ \n" );
printf( "@@@ __(\\\\//)__ \n" );
printf( "@@@ >__/w w\\__< \n" );
printf( "@@@\n" );
printf( "@@@ go to sleep 10 time-ticks\n" );
printf( "@@@\n" );
OSSchedUnlock();
Sleep(7);
}
}
void Task2(void * pParam)
{
while(1)
{
OSSchedLock();
printf( "+++ \n" );
printf( "+++ task 2 running ... \n" );
printf( "+++ ╭︿︿︿╮ \n" );
printf( "+++ {/ o o \\} \n" );
printf( "+++ ( (oo) ) \n" );
printf( "+++ ︶ \n" );
printf( "+++ \n" );
printf( "+++ go to sleep 5 time-ticks\n" );
printf( "+++ \n" );
OSSchedUnlock();
Sleep(3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -