📄 main.c
字号:
/*
* File: main.c
*
* uC/OS Real-time multitasking kernel for the ARM processor.
*
*
* Created by hgxxx
*
*/
#include "..\ucos-ii\includes.h" /* uC/OS interface */
#include "..\inc\44blib.h"
#include "..\startup\44b.h"
#include "..\startup\option.h"
#include "..\inc\target.h"
/* allocate memory for tasks' stacks */
#ifdef SEMIHOSTED
#define STACKSIZE (SEMIHOSTED_STACK_NEEDS+64)
#else
#define STACKSIZE 128
#endif
OS_STK Stack0[STACKSIZE];
OS_STK Stack1[STACKSIZE];
OS_STK Stack2[STACKSIZE];
OS_STK Stack3[STACKSIZE];
OS_STK Stack4[STACKSIZE];
OS_STK Stack5[STACKSIZE];
//OS_EVENT *UartSem;
INT8U downPt[2048];
INT16U curnu = 0;
INT8U downPt1[2048];
INT16U curnu1 = 0;
OS_EVENT *UART0_SEM ; //UART 0信号量
OS_EVENT *Key_Mbox ; //按键消息邮箱
volatile char which_int=0;
unsigned char txmsg;
void DoInt4567Isr(void)
{
which_int = rEXTINTPND;
rEXTINTPND = 0xf; //clear EXTINTPND reg.
rI_ISPC = BIT_EINT4567; //clear pending_bit
switch(which_int){
case 1:
{
txmsg=1;
OSMboxPost(Key_Mbox, (void *)&txmsg);
//Uart_Printf("extern interrupt4!\n");
//Led_Set(0x1);
}
break;
case 2:
{
txmsg=2;
OSMboxPost(Key_Mbox, (void *)&txmsg);
//Uart_Printf("extern interrupt5!\n");
//Led_Set(0x2);
}
break;
case 4:
{
txmsg=3;
OSMboxPost(Key_Mbox, (void *)&txmsg);
//Uart_Printf("extern interrupt6!\n");
//Led_Set(0x4);
}
break;
case 8:
{
txmsg=4;
OSMboxPost(Key_Mbox, (void *)&txmsg);
//Uart_Printf("extern interrupt7!\n");
//Led_Set(0x8);
}
break;
}
}
void Init4567Isr(void)
{
pISR_EINT4567= (unsigned)OSEINT4567ISR ;
rPCONG = rPCONG | 0xff00; //GPG4、5、6、7设为中断引脚
rPUPG = rPUPG & 0x0f; //GPG4、5、6、7上拉电阻有效
rEXTINT=0x22222222; //下降沿触发
rINTMSK &= ~BIT_EINT4567;
}
void __irq Uart0_RxInt(void)
{
rI_ISPC=BIT_URXD0 ; //clear pending bits,Default value=0x0000000
downPt[curnu] = RdURXH0();
curnu++;
downPt[curnu] = 0;
curnu %= 2047;
}
void InitURXD0ISR(void)
{
pISR_URXD0=(unsigned)Uart0_RxInt;
rINTMSK &= ~BIT_URXD0; //Default value=0x7ffffff
/*pISR_FIQ,pISR_IRQ must be initialized*/
}
void __irq Uart1_RxInt(void)
{
rI_ISPC=BIT_URXD1 ; //clear pending bits,Default value=0x0000000
downPt1[curnu1] = RdURXH1();
curnu1++;
downPt1[curnu1] = 0;
curnu1 %= 2047;
}
void InitURXD1ISR(void)
{
pISR_URXD1=(unsigned)Uart1_RxInt;
rINTMSK &= ~BIT_URXD1; //Default value=0x7ffffff
/*pISR_FIQ,pISR_IRQ must be initialized*/
}
void Task1(void *i)
{
INT32U task_time;
INT8U err ;
ARMStartTimer();
OSStatInit();
Init4567Isr();
InitURXD0ISR();
InitURXD1ISR();
Uart_Printf("Task1 Running\n");
for (;;){
task_time = OSTimeGet();
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf("Task1 go go go. @ system time %ld\n",task_time);
OSSemPost(UART0_SEM) ; //置起指定的信号量
OSTimeDly(800);
}
}
void Task2(void *i)
{
INT32U task_time;
INT8U err ;
Uart_Printf("Task2 Running\n");
for (;;){
task_time = OSTimeGet();
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf("Task2 go go go. @ system time %ld\n",task_time);
OSSemPost(UART0_SEM) ; //置起指定的信号量
OSTimeDly(1600);
}
}
void Task3(void *i)
{
INT32U task_time;
INT8U err ;
Uart_Printf("Task3 Running\n");
for (;;){
task_time = OSTimeGet();
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf("Task3 go go go. @ system time %ld\n",task_time);
OSSemPost(UART0_SEM) ; //置起指定的信号量
OSTimeDly(3200);
}
}
void Task4(void *i)
{
INT32U task_time;
INT8U err ;
Uart_Printf("Task4 Running\n");
for (;;){
task_time = OSTimeGet();
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf("Task4 go go go. @ system time %ld\n",task_time);
OSSemPost(UART0_SEM) ; //置起指定的信号量
OSTimeDly(6400);
}
}
/******************************************************************************
【功能说明】按键扫描的任务,
******************************************************************************/
void Task5(void *i)
{
INT8U err ;
INT8U *whichkey;
Uart_Printf("Task5 Running\n");
for( ; ; )
{
whichkey=OSMboxPend(Key_Mbox,0,&err);
switch(*whichkey)
{
case 1:
{
Led_Set(0x1);
}
break;
case 2:
{
Led_Set(0x2);
}
break;
case 3:
{
Led_Set(0x4);
}
break;
case 4:
{
Led_Set(0x8);
}
break;
default:
break;
}
OSSemPend(UART0_SEM, 0, &err); //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf( "%d% key is pressed\n", *whichkey-1);
OSSemPost(UART0_SEM) ; //置起指定的信号量
OSTimeDly(50);
}
}
void TaskStart(void *i)
{
INT8U err ;
ARMStartTimer();
OSStatInit();
for(;;){
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf("++++++++++++++++++++++++++++++++++++++ ");
Uart_Printf("OSCPUUsage = %d%% \n",OSCPUUsage);
OSSemPost(UART0_SEM) ; //置起指定的信号量
OSTimeDly(10000);
}
}
void Main(void)
{
char Id0 = '1';
char Id1 = '2';
char Id2 = '3';
char Id3 = '4';
char Id4 = '5';
char Id5 = '6';
ARMTargetInit();
OSInit();
OSTimeSet(0);
//创建信号量
UART0_SEM = OSSemCreate( 1 ) ; //UART 0 信号量
Key_Mbox = OSMboxCreate( (void *)0 );
/*
* create the tasks in uC/OS and assign decreasing
* priority to them
*/
OSTaskCreate(TaskStart, (void *)&Id0, (void *)&Stack0[STACKSIZE - 1], 1);
OSTaskCreate(Task1, (void *)&Id1, (void *)&Stack1[STACKSIZE - 1], 2);
OSTaskCreate(Task2, (void *)&Id2, (void *)&Stack2[STACKSIZE - 1], 3);
OSTaskCreate(Task3, (void *)&Id3, (void *)&Stack3[STACKSIZE - 1], 4);
OSTaskCreate(Task4, (void *)&Id4, (void *)&Stack4[STACKSIZE - 1], 5);
OSTaskCreate(Task5, (void *)&Id5, (void *)&Stack5[STACKSIZE - 1], 6);
/* Start the system running */
ARMTargetStart();
/* start the system */
OSStart();
} /* main */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -