整个移植的工程包括42个源文件,一个是uCOS II文件夹,主要包括操作系统内核和配置的有关文件。如下图
还有一个src文件夹,主要包括板子cpu的硬件配置部分。inc文件夹主要是头文件:
文件main.c
/*****************************************************************/
void Led_task(void *pdata);
void Buzzer_task(void *pdata);
void UART_task(void *pdata);
/*****************************************************************/
#define UART_stk_size 512 //任务堆栈大小声明,根据实际情况设置,这里可能设置的大了点
#define Led_stk_size 512
#define Buzzer_stk_size 512
OS_STK UART_stk[UART_stk_size];
OS_STK Led_stk[Led_stk_size];
OS_STK Buzzer_stk[Buzzer_stk_size];
/*****************************************************************/
void Main(void)
{
TargetInit(); //板子的初始化,包括串口,GPIO,PWM,时钟频率等
OSInit(); //操作系统初始化
//接下来是创建3个任务,当然你也可以在任务中创建任务。
OSTaskCreate(UART_task, (void *)0, &UART_stk[UART_stk_size-1], 1);
OSTaskCreate(Led_task, (void *)0, &Led_stk[Led_stk_size-1], 2);
OSTaskCreate(Buzzer_task, (void *)0, &Buzzer_stk[Buzzer_stk_size-1], 3);
OSStart();
}
/*****************************************************************/
void UART_task(void *pdata)
{
TargetStart();
while(1)
{
UART_printf("[A] UART task !-->");
OSTimeDlyHMSM(0,0,2,0);
}
}
/*****************************************************************/
void Led_task(void *pdata)
{
while(1)
{
UART_printf("[B] LED task !-->LED1 is on !");
LED(1,0,0,0,2000);
OSTimeDlyHMSM(0,0,1,0);
UART_printf("[B] LED task !-->LED2 is on !");
LED(0,1,0,0,2000);
OSTimeDlyHMSM(0,0,1,0);
UART_printf("[B] LED task !-->LED3 is on !");
LED(0,0,1,0,2000);
OSTimeDlyHMSM(0,0,1,0);
UART_printf("[B] LED task !-->LED4 is on !");
LED(0,0,0,1,2000);
OSTimeDlyHMSM(0,0,1,0);
}
}
/*****************************************************************/
void Buzzer_task(void *pdata)
{
while(1)
{
UART_printf("[C] Buzzer task ! Buzzer has been **opened**");
Buzzer_freq_set(20);
OSTimeDlyHMSM(0,0,2,0);
UART_printf("[C] Buzzer task ! Buzzer has been **closed**");
Buzzer_stop();
OSTimeDlyHMSM(0,0,10,0);
}
}
文件2440timer.c
#include "2440TIMER.H"
extern void OSTickISR(void);
extern void OSTimeTick(void);
//extern void IsrIRQ(void);
//extern int _ISR_STARTADDRESS;//注意此处的_ISR_STARTADDRESS必须为option.h中定义的宏
//只需包括头文件,无需声明,否则操作系统运行不起来
/********************************************************************************************************/
void __irq Timer1_ISR(void)//与函数OSTickISR功能一样
{
ClearPending(BIT_TIMER1);
OSTimeTick();
}
/********************************************************************************************************/
void Timer1_init(void)
{
ClearPending(BIT_TIMER1);
EnableIrq(BIT_TIMER1); // 打开TIMER1中断允许
rTCON = rTCON & (~0xf00) ; //关闭定时器1的所有有关位
rTCFG0 &= 0xffffff00; //设定定时器1(0)的预分频值,定时器0和1共用rTCFG0的[7:0]
rTCFG0 |= ( PCLK >>1 )/1000000-1; //设置定时器1输入时钟频率为1MHZ,据此来算出预分频值
rTCFG1 &= 0xffffff0f;
rTCFG1 |= 0x00; // 设置 Timer 1 分割值为 2
rTCNTB1 = (1000000 / OS_TICKS_PER_SEC);
rTCMPB1 = 0; //与系统时钟频率无关系,可不配置
rTCON =( rTCON & (~0xf00)) |(2<<8); //置位手动更新位
rTCON =( rTCON & (~0xf00)) |(9<<8); //清手动更新位,置位自动重载位,启动定时器
}
/********************************************************************************************************/
void ISR_init(void)
{
// 设置中断控制器
rPRIORITY = 0x00000000; // 使用默认的固定的优先级
rINTMOD = 0x00000000; // 所有中断均为IRQ中断
pISR_TIMER1= (U32)OSTickISR ;
//pISR_TIMER1 = (U32)Timer1_ISR;
}
文章评论(0条评论)
登录后参与讨论