您的位置:首页 > 其它

uC/OS-II 学习笔记之:怎样在uC/OS-II里创建一个任务?

2013-03-14 16:22 495 查看
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
更多原创“uC/OS-II学习笔记之:系列”基础及嵌入式相关知识详解,请访问可乐虎博客:
http://blog.csdn.net/dcx1205
相信不会让您失望!!

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
怎样在uC/OS-II里创建一个任务?

下面以创建一个串口发送数据的任务为例:

步骤如下:

(1)设置任务堆栈大小

#define USART_STK_SIZE 64

(2)定义任务堆栈

OS_STK TASK_USART_STK[USART_STK_SIZE];

(3)设置任务优先级

#define USART_TASK_Prio 3

(4)任务函数声明

void Usart(void *pdata);

(5)在起始任务里创建任务

OSTaskCreate(Usart, (void *)0, &TASK_USART_STK[USART_STK_SIZE-1], USART_TASK_Prio);

(6)完成函数代码

void Usart(void *pdata)

{

完成此处代码的书写;

}



////////////////////////////////////////////////////////////////////////////////////////////////////////////

相关程序如下:

#include "sys.h"

#include "usart.h"

#include "delay.h"

#include "includes.h"

//(1)

#define USART_STK_SIZE 64

//(2)

OS_STK TASK_USART_STK[USART_STK_SIZE];

//(3)

#define USART_TASK_Prio 3

//(4)

void Usart(void *pdata);

//主函数

int main(void)

{

Stm32_Clock_Init(9);//系统时钟设置

delay_init(72);//延时初始化

uart_init(72,9600);//串口初始化为9600

LED_Init();//初始化与LED连接的硬件接口

SysTick_Configuration();//系统时钟配置

OSInit();//对uC/OS-II进行初始化



//创建起始任务

OSTaskCreate(

TaskStart,//任务指针

(void *)0,//传递给任务的参数

&TASK_START_STK[START_STK_SIZE-1],//任务堆栈栈顶指针

START_TASK_Prio//任务优先级

);

//开始多任务调度

OSStart();//此步之后任务就交由操作系统来管理和调度了



return 0;

}

//(5)

void TaskStart(void * pdata)

{

pdata = pdata;//防止某些编译器报错

//关中断进入临界段

OS_ENTER_CRITICAL();//此函数为汇编代码,在os_cpu_a.asm文件 里

//创建任务

OSTaskCreate(Usart, (void *)0, &TASK_USART_STK[USART_STK_SIZE-1], USART_TASK_Prio);



OSTaskSuspend(OS_PRIO_SELF);//挂起但未删除

//开中断退出临界段

OS_EXIT_CRITICAL();

}

//(6)

void Usart(void *pdata)

{

char USART_DX_BUF[] = "abcdefg";

char i = 0;

while (1)

{

for (i=0; i<7; ++i)

{

USART1->DR = USART_DX_BUF[i];

while ((USART1->SR & 0X40) == 0);

}

OSTimeDlyHMSM(0, 0, 0, 100);

}

}

说明:大家在uC/OS-II里创建任务时,就可以参照这个步骤来!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: