原创 嵌入式操作系统uC/OS-II在Mini2440上的移植

2011-12-1 18:15 2083 7 7 分类: 消费电子
 

整个移植的工程包括42个源文件,一个是uCOS II文件夹,主要包括操作系统内核和配置的有关文件。如下图

psb.jpg

还有一个src文件夹,主要包括板子cpu的硬件配置部分。inc文件夹主要是头文件:

http_imgload.jpghttp_imgload2.jpg

 

文件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;

}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条