UC/OS II多任务切换例程
2012-11-27
标签: uCOS

#include "config.h"

#defineTaskStkLengh64

OS_STKTaskStk [TaskStkLengh];

OS_STKTaskStk1 [TaskStkLengh];

OS_STKTaskStk2 [TaskStkLengh];

OS_EVENT*TASK1;

OS_EVENT*TASK2;

OS_EVENT*TASK3;

voidTask0(void *pdata);//Task0 ÈÎÎñ0

voidTask1(void *pdata);

voidTask2(void *pdata);

uint8 err;

voidUART0_Ini(void)

{uint16 Fdiv;

U0LCR = 0x83;

Fdiv = (Fpclk / 16) / UART_BPS;

U0DLM = Fdiv / 256;

U0DLL = Fdiv % 256;

U0LCR = 0x03;

}

voidUART0_SendByte(uint8 data)

{U0THR = data;// ·¢ËÍÊý¾Ý

while( (U0LSR&0x40)==0 );// µÈ´ýÊý¾&Yacute

}

int main (void)

{

OSInit

();

OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);

TASK1=OSSemCreate(0);

TASK2=OSSemCreate(0);

TASK3=OSSemCreate(0);

TargetInit();

OSStart ();

return 0;

}

/*********************************************************************************************************

**Task0 ÈÎÎñ0

********************************************************************************************************/

void Task0(void *pdata)

{

UART0_Ini();

OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 9);

OSTaskCreate(Task2, (void *)0, &TaskStk2[TaskStkLengh-1], 10);

OSSemPost(TASK1);

for (;;)

{

OSSemPend(TASK1,10,&err

if(err==OS_NO_ERR)

{

UART0_SendByte(0x01);

OSSemPost(TASK2);

}

}

}

/*********************************************************************************************************

**Task1 ÈÎÎñ1

********************************************************************************************************/

void Task1(void *pdata)

{

UART0_Ini();

for (;;)

{

OSSemPend(TASK2,10,&err);

if(err==OS_NO_ERR)

{

UART0_SendByte(0x02);

OSSemPost(TASK3);

}

}

}

void Task2(void *pdata)

{

UART0_Ini();

for (;;)

{

OSSemPend(TASK3,10,&err);//»&

if(err==OS_NO_ERR)

{

UART0_SendByte(0x03);

OSSemPost(TASK1);

}

}

}

三个任务分别通过UART0输出0X01,0X02,0X03,可以学习理解信号量的基本用法及多任务的调度方法.

以上例子基于LPC2200系列ARM.

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号