怎样在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"
#define USART_STK_SIZE 64
OS_STK TASK_USART_STK[USART_STK_SIZE];
#define USART_TASK_Prio 3
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;
}
//起始任务
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();
}
//任务执行函数
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);
}
}