uC/OS-II 学习笔记:任务创建步骤

来源:互联网 发布:r语言入门 知乎 编辑:程序博客网 时间:2024/05/22 17:17

怎样在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);
    }
}

 

0 0
原创粉丝点击